Products

A product is a sellable thing. Variants live inside products; if you sell tea in three sizes, that's one product with three variants.

Object

FieldTypeNotes
idstringprod_…, ULID
namestringHuman-readable, ≤ 256 chars
skustring?Optional, must be unique within tenant
descriptionstring?Markdown, ≤ 16 KiB
default_price_centsintegerMinor units of currency
currencystringISO 4217, e.g. EUR
inventoryinteger-1 means infinite (digital goods)
statusenumactive, archived, draft
metadataobject≤ 50 key/value pairs, string values ≤ 500 chars
created_attimestampRFC 3339, UTC
updated_attimestampRFC 3339, UTC

Endpoints

MethodPathPurpose
GET/v1/productsList, paginated
POST/v1/productsCreate
GET/v1/products/{id}Retrieve
PATCH/v1/products/{id}Update (partial; null clears)
DELETE/v1/products/{id}Archive (soft); use ?hard=true to delete
POST/v1/products/{id}/variantsAdd a variant

Filtering

# Active products in EUR, updated in the last day, page of 50
curl -sS "https://api.zephyrcart.io/v1/products" \
  --get \
  --data-urlencode "status=active" \
  --data-urlencode "currency=EUR" \
  --data-urlencode "updated_after=2026-05-30T00:00:00Z" \
  --data-urlencode "limit=50" \
  -H "Authorization: Bearer $ZEPHYR_API_KEY"

Common errors

CodeCauseFix
validation.invalid_currencycurrency not ISO 4217Use a valid 3-letter uppercase code
validation.sku_already_existsDuplicate SKU within tenantPick a unique SKU or update the existing product
inventory.negative_not_allowedinventory < 0 and product is not digitalPass inventory=-1 only for digital goods
metadata.too_many_keysMore than 50 metadata keysConsolidate or drop unused metadata