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 build your merch?

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

Create an account to browse, design, and request orders right away. A discovery call with your rep completes onboarding.