Sticker Mule API
The Sticker Mule API lets you reorder products and read your saved items, addresses, and payment methods from your own code. It is a small REST API authenticated with a personal API key.
Quick start
1. Generate an API key
Open your account settings and, under Store settings, generate an API key. Copy it right away, it is shown only once.
Open account settings2. Call the API
Send your key as a Bearer token. This example places an order for a saved item:
curl -X POST https://www.stickermule.com/api/orders \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"items": [{ "id": "456", "quantity": 50 }],
"addressId": "22",
"paymentId": "7"
}'Authentication
Every request must include your API key as a Bearer token in the Authorization header.
Authorization: Bearer YOUR_API_KEY- The API is available on personal accounts only, not team accounts.
- Each account has one key. Generating a new key replaces the old one.
- Treat the key like a password. It can place orders and read your saved data.
Base URL
All endpoints are relative to this base URL.
https://www.stickermule.com/apiEndpoints
Returns the items you can reorder. Each item's id is valid as an items[].id when creating an order.
GET /api/itemscurl "https://www.stickermule.com/api/items?limit=20" \ -H "Authorization: Bearer YOUR_API_KEY"Query parameters
Parameter Type Default Description limitnumber20Number of items to return, from 1 to 50. offsetnumber0Number of items to skip before returning results. currencystringUSDISO 4217 currency code used for prices. localestringenLocale used for product names and prices. Response
Results are paginated with limit and offset, and canLoadMore is true when more items are available. Because paging is offset-based, pages can shift as new orders arrive.
Field Type Description idstringItem identifier. Use it as an items[].id when creating an order. namestring | nullCustom name you gave the item, if any. productIdnumberSticker Mule product identifier. productNamestring | nullProduct name, or null if the product is no longer available. quantitynumberQuantity from the original order. sizeRegularItemDimensions | TShirtDimensions | HoodieDimensionsItem size. For t-shirts and heavyweight t-shirts, an apparel size object with __typename TShirtDimensions and a size. For hoodies, __typename HoodieDimensions and a size. For every other product, physical dimensions in inches with __typename RegularItemDimensions and width and height. isSizeRequiredbooleanTrue when the product needs an apparel size to reorder (t-shirts, heavyweight t-shirts, and hoodies). Otherwise false. buyingOptionsobject | nullAllowed reorder quantities as min, max, and increment. null if the product is unavailable. retailPricenumber | nullPrice at the minimum quantity, or null if pricing is unavailable. artworkUrlsstring[]URLs of the approved artwork for the item. Example response{ "items": [ { "id": "456", "name": "Logo stickers", "productId": 12, "productName": "Die cut stickers", "quantity": 50, "size": { "__typename": "RegularItemDimensions", "width": 3, "height": 3 }, "isSizeRequired": false, "buyingOptions": { "quantity": { "min": 50, "max": 5000, "increment": 5 } }, "retailPrice": 79, "artworkUrls": ["https://cdn.stickermule.com/artwork.png"] }, { "id": "789", "name": "Team t-shirt", "productId": 34, "productName": "Custom t-shirts", "quantity": 25, "size": { "__typename": "TShirtDimensions", "size": "sizeL" }, "isSizeRequired": true, "buyingOptions": { "quantity": { "min": 1, "max": 500, "increment": 1 } }, "retailPrice": 18, "artworkUrls": ["https://cdn.stickermule.com/shirt.png"] }, { "id": "812", "name": "Team hoodie", "productId": 56, "productName": "Custom hoodies", "quantity": 10, "size": { "__typename": "HoodieDimensions", "size": "sizeM" }, "isSizeRequired": true, "buyingOptions": { "quantity": { "min": 1, "max": 500, "increment": 1 } }, "retailPrice": 32, "artworkUrls": ["https://cdn.stickermule.com/hoodie.png"] } ], "canLoadMore": true }Returns your saved shipping addresses, default first. Each id is valid as the addressId when creating an order.
GET /api/addressescurl https://www.stickermule.com/api/addresses \ -H "Authorization: Bearer YOUR_API_KEY"Response
Field Type Description idstringAddress identifier. Use it as the addressId when creating an order. namestring | nullFull recipient name. firstNamestring | nullRecipient first name. lastNamestring | nullRecipient last name. companyNamestring | nullCompany name, if any. addressLine1stringStreet address. addressLine2string | nullAdditional address line, if any. cityNamestringCity. stateNamestring | nullState or province name, if any. stateAbbreviationstring | nullState or province abbreviation, if any. zipCodestringPostal code. countryIsostringISO 3166 country code, such as US. countryNamestringCountry name. phonestring | nullContact phone number, if any. isDefaultbooleanTrue for your default shipping address. Example response{ "addresses": [ { "id": "22", "name": "Jane Doe", "firstName": "Jane", "lastName": "Doe", "companyName": null, "addressLine1": "123 Main St", "addressLine2": null, "cityName": "Amsterdam", "stateName": null, "stateAbbreviation": null, "zipCode": "1000AA", "countryIso": "NL", "countryName": "Netherlands", "phone": "+31612345678", "isDefault": true } ] }Returns your saved payment methods, default first. Each id is valid as the paymentId when creating an order.
GET /api/paymentscurl https://www.stickermule.com/api/payments \ -H "Authorization: Bearer YOUR_API_KEY"Response
Field Type Description idstringPayment method identifier. Use it as the paymentId when creating an order. ccTypestringCard brand, such as visa or mastercard. lastDigitsstringLast four digits of the card. expirationobjectCard expiry as month and year. isDefaultbooleanTrue for your default payment method. Example response{ "payments": [ { "id": "7", "ccType": "visa", "lastDigits": "1007", "expiration": { "month": 7, "year": 2028 }, "isDefault": true } ] }Lists your placed orders, most recent first. Each order's number matches the one POST /api/orders returns.
GET /api/orderscurl "https://www.stickermule.com/api/orders?limit=10" \ -H "Authorization: Bearer YOUR_API_KEY"Query parameters
Parameter Type Default Description limitnumber10Number of orders to return, from 1 to 50. offsetnumber0Number of orders to skip before returning results. Response
Results are paginated with limit and offset, and canLoadMore is true when more orders are available. Because paging is offset-based, pages can shift as new orders are placed.
Field Type Description numberstringOrder number. The same value returned by POST /api/orders. state"complete" | "canceled" | "gift_unclaimed" | "ready_for_production" | "in_production" | "ready_to_proof" | "awaiting_scheduled_date"The order's status. paymentState"paid" | "credit_owed" | "balance_due" | "failed" | "checkout" | "completed" | "pending" | "processing" | "void" | nullThe order's payment status, or null. shipmentState"backorder" | "canceled" | "partial" | "pending" | "ready" | "shipped" | "returned_for_reship" | "reship" | "delivered"The order's shipment status. Defaults to pending. placedAtstringWhen the order was placed, as an ISO 8601 timestamp. currencystringISO 4217 currency the order was charged in. itemTotalnumberItems subtotal, before shipping, tax, and discounts. totalnumberGrand total charged, including shipping and tax, less discounts. expectedDeliveryDatestring | nullEstimated delivery date as an ISO 8601 timestamp, or null. deliveredAtstring | nullWhen the order was delivered, as an ISO 8601 timestamp, or null. Example response{ "orders": [ { "number": "R286234605", "state": "complete", "paymentState": "paid", "shipmentState": "shipped", "placedAt": "2026-07-20T14:03:00.000Z", "currency": "USD", "itemTotal": 79, "total": 88.5, "expectedDeliveryDate": "2026-07-27T00:00:00.000Z", "deliveredAt": null } ], "canLoadMore": true }Places an order for one or more saved items, shipped to a saved address and charged to a saved payment method.
POST /api/orderscurl -X POST https://www.stickermule.com/api/orders \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "items": [{ "id": "456", "quantity": 50 }], "addressId": "22", "paymentId": "7" }'Request body
Field Type Required Description itemsarrayYes Items to order. Must contain at least one item. items[].idstringYes An item id from GET /api/items. items[].quantitynumberYes Quantity to order for the item. items[].sizeTShirtSize | HoodieSize | nullNo Apparel size, required when ordering apparel (t-shirts, heavyweight t-shirts, and hoodies). Use the values below that match the product. Omit for other products. addressIdstringYes An address id from GET /api/addresses. paymentIdstringYes A payment method id from GET /api/payments. An order can contain up to 50 items. Each quantity must respect the product's min, max, and increment from GET /api/items.
Apparel sizes
Which sizes are valid depends on the product's cut:
- T-shirts and heavyweight t-shirts (TShirtSize):
"sizeYS" | "sizeYM" | "sizeYL" | "sizeS" | "sizeM" | "sizeL" | "sizeXL" | "size2XL" | "size3XL" | "size4XL" | "size5XL" | "size6XL" | "size7XL" - Hoodies (HoodieSize):
"sizeS" | "sizeM" | "sizeL" | "sizeXL" | "size2XL"
Response
Example response{ "order": { "number": "R286234605" } }- T-shirts and heavyweight t-shirts (TShirtSize):
Errors
Errors return the matching HTTP status and a JSON body with a type and a message.
{
"type": "UserInputError",
"message": "items is required and must be a non-empty array"
}| Status | Type | Meaning |
|---|---|---|
400 | UserInputError | The request was invalid, such as a missing field or an unknown id. |
401 | UnauthorizedError | The Authorization header is missing or malformed. |
403 | ForbiddenError | The API key is invalid. |
500 | — | Something went wrong on our side. Try again later. |
How it fits together
- You can only order items you have ordered before. Custom items, packaging tape, and vinyl lettering are not available through the API.
- Read your items, addresses, and payment methods first, then pass their ids to POST /api/orders.
- GET /api/orders lists your placed orders, most recent first. Each order's number matches the one POST /api/orders returns.
- Most products reorder at their original dimensions (width and height in inches). Apparel (t-shirts, heavyweight t-shirts, and hoodies) carries an apparel size instead: GET /api/items returns it under size with isSizeRequired true, and you pass items[].size to order them. Valid sizes depend on the product, and you can change the size on reorder, for example, reorder a sizeM shirt as sizeL.
- GET /api/items and GET /api/orders are paginated with limit and offset. The endpoints for addresses and payments are not.