Skip to main content

Intro

A set of endpoints for creating, listing, updating, and deleting products — either your own, or on behalf of an active sub-merchant in your marketplace.

Context

These endpoints sit alongside the merchant-management endpoints (Create Merchant, List Merchants, etc.) but operate on catalog data rather than the merchant relationship itself. A product created here can have its variant tree managed via Create/Replace Product Variants and Get Product Variants. Products belonging to any of your active sub-merchants are reachable through these same endpoints by passing merchant_id — you don’t need the sub-merchant’s own API key to manage their catalog.

Hows

Endpoints

Create a product

string
required
Product title.
string
required
Product type.
integer
Create the product on behalf of one of your active sub-merchants instead of yourself. Must be an active merchant in your marketplace — omit to create the product under your own account.
integer
default:"0"
Price in the smallest currency unit.
string
Currency code.
string
Thumbnail image URL.
string
Product description.
boolean
default:"false"
Whether the product is publicly visible.
Any other recognized product field can be included in the body and is passed through as-is.
Response — 201

List products

integer
Restrict results to one active sub-merchant’s products. Omit to get your own products plus every active sub-merchant’s products combined.
string
Filter by product type.
boolean
Filter by publish state.
Case-insensitive substring match against title.
integer
default:"1"
integer
default:"20"
Maximum 100.
string
default:"createdAt"
One of createdAt, title, price, type, is_published.
string
default:"DESC"
ASC or DESC.
Each product in the response includes a merchant_id field identifying its owner, plus pagination metadata matching the shape used by List Merchants.

Get / update / delete a single product

GET, PATCH, and DELETE all take a productId path parameter and work on any product you own or that belongs to one of your active sub-merchants. GET includes the product’s variant tree in a variation field (null if no variants are configured). PATCH accepts any updatable product field in the body — educator_id, slug, is_live, source, and merchant_id cannot be changed through this endpoint and are silently stripped if present. DELETE unpublishes the product by default (sets is_published: false) rather than deleting it. Pass ?hard=true to permanently delete the row instead:

Error Codes

Whys

Letting an operator create and manage products on a sub-merchant’s behalf (via merchant_id) matters for marketplaces where the operator, not the merchant, does the catalog data entry — bulk uploads, standardized listings, or merchants who don’t have their own technical integration. Requiring merchant_id to resolve to an active relationship (not just any past relationship) keeps a suspended merchant’s catalog from being silently editable by the operator after the relationship ends. Unlike the merchant-management endpoints, these product endpoints don’t require marketplace mode to be enabled at all — creating and listing your own products through the partner API is a baseline capability independent of whether you operate a marketplace. The marketplace-specific behavior (managing a sub-merchant’s products via merchant_id) only works once that merchant is actively linked.

Why nots

These endpoints do not manage variants directly — pricing/stock variations are a separate resource, handled by Create/Replace Product Variants and Get Product Variants. DELETE without ?hard=true does not remove the product record — it only unpublishes it; don’t rely on soft-delete to free up a slug or fully remove data. Product ownership cannot be reassigned through PATCHmerchant_id and educator_id are stripped from update bodies, so a product can’t be moved between merchants after creation.