Products API

List your products and variants.

Last updated May 8, 2026

List the products on your account. The response is one row per active variant — the SKU you'll use when creating orders is on the variant row, not the product.

#Endpoints

  • GET /v1/products/list — list active variants on the authenticated account.

#Authentication

Standard Bearer auth — see Authentication and API keys.

#List products

GET /v1/products/list

Query parameters:

  • limit (integer, default 20) — page size.
  • offset (integer, default 0) — number of records to skip.

Response shape:

[
  {
    "id": "<product_id>",
    "title": "Logo Tee",
    "sku": "TEE-BLK-M",
    "minimumOrderQuantity": 1,
    "productionTime": 7,
    "imageUrl": "https://cdn.merch.com/<file>",
    "piecesPerCarton": 24,
    "cartonHeight": 12,
    "cartonLength": 18,
    "cartonWidth": 14,
    "weight": 0.4,
    "packageHeight": 1,
    "packageLength": 10,
    "packageWidth": 8,
    "packageWeight": 0.5
  }
]

Field-by-field:

  • id — the parent product id. Several variants can share this value.
  • title — the product title.
  • sku — the variant SKU. Unique per row in this response. Pass this on products[].sku when creating an order.
  • minimumOrderQuantity — the smallest quantity you can order. Taken from the first pricing tier of the first variant on the parent product.
  • productionTime — production lead time in days.
  • imageUrl — a CDN URL for the variant image, or null if the variant has no image attached.
  • piecesPerCarton — units per shipping carton, or null if not configured.
  • cartonHeight, cartonLength, cartonWidth — carton dimensions, or null. Units follow the values configured on the product.
  • weight — per-unit weight, or null.
  • packageHeight, packageLength, packageWidth, packageWeight — single-unit package dimensions and weight, or null.
curl -X GET 'https://api.merch.com/v1/products/list?limit=20&offset=0' \
  -H 'Authorization: Bearer <your_api_key>'

To page through everything, increment offset by limit until you get a short page back.

#How SKUs flow into orders

The sku returned here is exactly what you pass on products[].sku when calling POST /v1/orders/create. The parent id is informational — order creation matches on sku.

A typical integration flow:

  1. Call GET /v1/products/list and cache { sku, id, title } for each row.
  2. Call GET /v1/campaigns/list and cache the campaignId you want to order against.
  3. On a recipient signal (new hire, deal closed, redemption), call POST /v1/orders/create with the cached campaignId and the chosen sku plus quantity.

#Errors

  • 401 Unauthorized — missing, malformed, or invalid bearer token. See Authentication and API keys.
  • 500 Internal Server Error — unexpected error. Body is a { "message": "..." } string. Retry after a short delay.

Ready to elevate your merch?

Custom design, production, campaigns, and global fulfillment — one partner, zero platform fees. Your custom proposal in 24 hours.