API reference
Products
On this page
List products
/productsRequired scopes:read_products
Query parameters
| Name | Type | Description |
|---|---|---|
limit | integer | Page size, 1–250 (default 50). default 50 · min 1 · max 250 |
cursor | string | next_cursor from the previous page. |
updated_since | string<date-time> | Only objects changed at or after this ISO-8601 time. |
created_since | string<date-time> | Only objects created at or after this ISO-8601 time. |
status | string | Filter by status. One of: |
kind | string | Filter by kind. One of: |
category_id | integer | In this category. |
brand_id | integer | Of this brand. |
sku | string | Has a variant with this SKU. |
slug | string | This URL handle. |
ids | string | Comma-separated ids (up to 250). |
Example request
curl "https://api.sellorchard.com/v1/products?limit=50" \
-H "Authorization: Bearer $SELLORCHARD_API_KEY"Response200Products, newest first.
ShowHide response schema
dataarray of ProductrequiredShowHide item attributes
objectstringrequiredidintegerrequiredProduct id.
namestringrequiredName.
slugstringrequiredURL handle (unique).
statusstringrequiredVisibility.
One of:
activedraftarchivedkindstringrequiredWhat is sold.
One of:
physicaldigitalgift_cardbookingtypestringrequiredsimple (one variant) or variable (options and variants).
One of:
simplevariabledescriptionstring | nullrequiredDescription (sanitised HTML).
short_descriptionstring | nullrequiredShort description (HTML).
brand_idinteger | nullrequiredBrand.
category_idsarray of integerrequiredCategories.
optionsarray of ProductOptionrequiredOptions (variable products, up to 3).
ShowHide item attributes
namestringrequiredOption name.
valuesarray of stringrequiredValues in order.
imagesarray of ProductImagerequiredImages, main image first.
ShowHide item attributes
idinteger | nullrequiredImage id (null for a thumbnail that is not in the gallery).
urlstring<uri>requiredPublic URL.
altstring | nullrequiredAlt text.
positionintegerrequiredOrder in the gallery (0 = main image).
variantsarray of VariantrequiredVariants in order.
ShowHide item attributes
objectstringrequiredidintegerrequiredVariant id.
product_idintegerrequiredIts product.
titlestring | nullrequiredOption values joined ("Blue / Large"); null for a simple product.
option_valuesobjectrequiredOption name → value.
ShowHide child attributes
__PHP_Incomplete_Class_Nameany
skustring | nullrequiredSKU (unique in the store).
barcodestring | nullrequiredGTIN / EAN / UPC (8, 12, 13 or 14 digits).
pricestringrequiredPrice in the store currency.
pattern ^-?\d+\.\d{2}$
compare_at_pricestring | nullrequiredWas-price (higher than price), or null.
pattern ^-?\d+\.\d{2}$
coststring | nullrequiredCost price (for margins), or null.
pattern ^-?\d+\.\d{2}$
currencystringrequiredStore currency.
weight_gramsinteger | nullrequiredShipping weight in grams.
inventory_trackedbooleanrequiredWhether stock is tracked.
inventory_quantityinteger | nullrequiredUnits available online (all fulfilling locations); null when not tracked.
is_activebooleanrequiredCan be bought.
positionintegerrequiredOrder among the product's variants.
image_urlstring<uri> | nullrequiredVariant image.
created_atstring<date-time>requiredCreated.
updated_atstring<date-time>requiredLast changed.
seoobjectrequiredShowHide child attributes
titlestring | nullrequiredMeta title.
descriptionstring | nullrequiredMeta description.
is_featuredbooleanrequiredFeatured on the storefront.
created_atstring<date-time>requiredCreated.
updated_atstring<date-time>requiredLast changed.
deleted_atstring<date-time> | nullrequiredWhen it was deleted (product.deleted webhooks), else null.
has_morebooleanrequiredMore pages after this one.
next_cursorstring | nullrequiredPass as
cursorfor the next page; null on the last page.
{
"data": [
{
"object": "product",
"id": 120,
"name": "Organic cotton tee",
"slug": "organic-cotton-tee",
"status": "active",
"kind": "physical",
"type": "variable",
"description": "<p>Soft, breathable and made to last.</p>",
"short_description": "Our everyday tee.",
"brand_id": 4,
"category_ids": [
7,
9
],
"options": [
{
"name": "Color",
"values": [
"Blue",
"White"
]
},
{
"name": "Size",
"values": [
"Medium",
"Large"
]
}
],
"images": [
{
"id": 801,
"url": "https://media.sellorchard.com/stores/01J.../tee.jpg",
"alt": "Blue tee",
"position": 0
}
],
"variants": [
{
"object": "variant",
"id": 311,
"product_id": 120,
"title": "Blue / Large",
"option_values": {
"Color": "Blue",
"Size": "Large"
},
"sku": "TEE-BL-L",
"barcode": "0012345678905",
"price": "24.00",
"compare_at_price": "30.00",
"cost": "9.50",
"currency": "USD",
"weight_grams": 180,
"inventory_tracked": true,
"inventory_quantity": 42,
"is_active": true,
"position": 0,
"image_url": "https://media.sellorchard.com/stores/01J.../tee-blue.jpg",
"created_at": "2026-11-02T15:00:00Z",
"updated_at": "2026-11-03T09:30:00Z"
}
],
"seo": {
"title": "Organic cotton tee",
"description": "Soft organic cotton tee in four colours."
},
"is_featured": false,
"created_at": "2026-11-02T15:00:00Z",
"updated_at": "2026-11-03T09:30:00Z",
"deleted_at": null
}
],
"has_more": false,
"next_cursor": null
}Error responses
- 400
invalid_requestMalformed request (e.g. a bad cursor). - 401
authenticationMissing, invalid, expired or revoked API key. - 403
permissionThe key lacks the scope, or the store's plan doesn't include the API. - 422
invalid_requestInvalid parameters;errorslists each field. - 429
rate_limitedToo many requests. - 500
serverSomething went wrong on our side; safe to retry with the same Idempotency-Key.
Create a product
/productsImages given by URL are downloaded into the store's media library. Checked with the same rules as the product editor (SKUs unique, one variant per option combination…). Fires product.created.
Required scopes:write_products
Headers
| Name | Type | Description |
|---|---|---|
Idempotency-Key | string | Any unique string (e.g. a UUID, up to 255 characters). A retry with the same key and body within 24 hours gets the first response again (Idempotent-Replayed: true); the same key with a different body is a 409 conflict. |
Request body
namestringName (required on create).
max length 200
slugstring | nullURL handle (generated from the name when empty).
statusstringDefault draft.
One of:
activedraftarchivedkindstringphysical (default) or digital.
One of:
physicaldigitaldescriptionstring | nullHTML (sanitised).
short_descriptionstring | nullHTML.
brand_idinteger | nullBrand id (GET /brands).
category_idsarray of integerCategory ids (GET /categories); replaces the list.
is_featuredbooleanFeatured.
seoobjectShowHide child attributes
titlestring | nullMeta title.
descriptionstring | nullMeta description.
optionsarray of ProductOptionOptions (up to 3). Without options the product is simple and has exactly one variant.
ShowHide item attributes
namestringrequiredOption name.
valuesarray of stringrequiredValues in order.
imagesarray of objectImages, main image first; replaces the gallery.
ShowHide item attributes
urlstring<uri>requiredAn http(s) image URL; downloaded into the media library (JPG, PNG, WebP, AVIF or GIF). URLs of the product's current images are kept as they are.
altstring | nullAlt text.
variantsarray of VariantInputVariants (required on create). On PATCH: the full list (ids keep variants; the rest are deleted).
ShowHide item attributes
idinteger | nullAn existing variant to keep and change (PATCH). Variants left out of a PATCH that sends
variantsare deleted.skustring | nullSKU (unique in the store).
max length 64
barcodestring | nullGTIN (8, 12, 13 or 14 digits).
pricestring | numberPrice (required for new variants).
compare_at_pricestring | number | nullWas-price; must be higher than price.
coststring | number | nullCost price.
weight_gramsinteger | nullWeight in grams.
option_valuesobjectOption name → value (one per option).
ShowHide child attributes
__PHP_Incomplete_Class_Nameany
inventory_trackedbooleanTrack stock (default true).
inventory_quantityinteger | nullUnits at the first fulfilling location (tracked variants). Use the inventory endpoints for per-location stock.
is_activebooleanCan be bought (default true).
Example request
curl -X POST "https://api.sellorchard.com/v1/products" \
-H "Authorization: Bearer $SELLORCHARD_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "Organic cotton tee",
"status": "active",
"kind": "physical",
"description": "<p>Soft, breathable and made to last.</p>",
"brand_id": 4,
"category_ids": [
7
],
"seo": {
"title": "Organic cotton tee",
"description": "Soft organic cotton tee."
},
"options": [
{
"name": "Color",
"values": [
"Blue"
]
},
{
"name": "Size",
"values": [
"Large"
]
}
],
"images": [
{
"url": "https://example.com/images/tee.jpg",
"alt": "Blue tee"
}
],
"variants": [
{
"sku": "TEE-BL-L",
"barcode": null,
"price": "24.00",
"compare_at_price": "30.00",
"cost": "9.50",
"weight_grams": 180,
"option_values": {
"Color": "Blue",
"Size": "Large"
},
"inventory_tracked": true,
"inventory_quantity": 40,
"is_active": true
}
]
}'Response201A product.
ShowHide response schema
dataProductrequiredShowHide child attributes
objectstringrequiredidintegerrequiredProduct id.
namestringrequiredName.
slugstringrequiredURL handle (unique).
statusstringrequiredVisibility.
One of:
activedraftarchivedkindstringrequiredWhat is sold.
One of:
physicaldigitalgift_cardbookingtypestringrequiredsimple (one variant) or variable (options and variants).
One of:
simplevariabledescriptionstring | nullrequiredDescription (sanitised HTML).
short_descriptionstring | nullrequiredShort description (HTML).
brand_idinteger | nullrequiredBrand.
category_idsarray of integerrequiredCategories.
optionsarray of ProductOptionrequiredOptions (variable products, up to 3).
ShowHide item attributes
namestringrequiredOption name.
valuesarray of stringrequiredValues in order.
imagesarray of ProductImagerequiredImages, main image first.
ShowHide item attributes
idinteger | nullrequiredImage id (null for a thumbnail that is not in the gallery).
urlstring<uri>requiredPublic URL.
altstring | nullrequiredAlt text.
positionintegerrequiredOrder in the gallery (0 = main image).
variantsarray of VariantrequiredVariants in order.
ShowHide item attributes
objectstringrequiredidintegerrequiredVariant id.
product_idintegerrequiredIts product.
titlestring | nullrequiredOption values joined ("Blue / Large"); null for a simple product.
option_valuesobjectrequiredOption name → value.
ShowHide child attributes
__PHP_Incomplete_Class_Nameany
skustring | nullrequiredSKU (unique in the store).
barcodestring | nullrequiredGTIN / EAN / UPC (8, 12, 13 or 14 digits).
pricestringrequiredPrice in the store currency.
pattern ^-?\d+\.\d{2}$
compare_at_pricestring | nullrequiredWas-price (higher than price), or null.
pattern ^-?\d+\.\d{2}$
coststring | nullrequiredCost price (for margins), or null.
pattern ^-?\d+\.\d{2}$
currencystringrequiredStore currency.
weight_gramsinteger | nullrequiredShipping weight in grams.
inventory_trackedbooleanrequiredWhether stock is tracked.
inventory_quantityinteger | nullrequiredUnits available online (all fulfilling locations); null when not tracked.
is_activebooleanrequiredCan be bought.
positionintegerrequiredOrder among the product's variants.
image_urlstring<uri> | nullrequiredVariant image.
created_atstring<date-time>requiredCreated.
updated_atstring<date-time>requiredLast changed.
seoobjectrequiredShowHide child attributes
titlestring | nullrequiredMeta title.
descriptionstring | nullrequiredMeta description.
is_featuredbooleanrequiredFeatured on the storefront.
created_atstring<date-time>requiredCreated.
updated_atstring<date-time>requiredLast changed.
deleted_atstring<date-time> | nullrequiredWhen it was deleted (product.deleted webhooks), else null.
{
"data": {
"object": "product",
"id": 120,
"name": "Organic cotton tee",
"slug": "organic-cotton-tee",
"status": "active",
"kind": "physical",
"type": "variable",
"description": "<p>Soft, breathable and made to last.</p>",
"short_description": "Our everyday tee.",
"brand_id": 4,
"category_ids": [
7,
9
],
"options": [
{
"name": "Color",
"values": [
"Blue",
"White"
]
},
{
"name": "Size",
"values": [
"Medium",
"Large"
]
}
],
"images": [
{
"id": 801,
"url": "https://media.sellorchard.com/stores/01J.../tee.jpg",
"alt": "Blue tee",
"position": 0
}
],
"variants": [
{
"object": "variant",
"id": 311,
"product_id": 120,
"title": "Blue / Large",
"option_values": {
"Color": "Blue",
"Size": "Large"
},
"sku": "TEE-BL-L",
"barcode": "0012345678905",
"price": "24.00",
"compare_at_price": "30.00",
"cost": "9.50",
"currency": "USD",
"weight_grams": 180,
"inventory_tracked": true,
"inventory_quantity": 42,
"is_active": true,
"position": 0,
"image_url": "https://media.sellorchard.com/stores/01J.../tee-blue.jpg",
"created_at": "2026-11-02T15:00:00Z",
"updated_at": "2026-11-03T09:30:00Z"
}
],
"seo": {
"title": "Organic cotton tee",
"description": "Soft organic cotton tee in four colours."
},
"is_featured": false,
"created_at": "2026-11-02T15:00:00Z",
"updated_at": "2026-11-03T09:30:00Z",
"deleted_at": null
}
}Error responses
- 401
authenticationMissing, invalid, expired or revoked API key. - 403
permissionThe key lacks the scope, or the store's plan doesn't include the API. - 409
conflictThe Idempotency-Key was used with a different request, or that request is still running. - 422
invalid_requestInvalid parameters;errorslists each field. - 429
rate_limitedToo many requests. - 500
serverSomething went wrong on our side; safe to retry with the same Idempotency-Key.
Get a product
/products/{id}Required scopes:read_products
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer | The object id. |
Example request
curl "https://api.sellorchard.com/v1/products/120" \
-H "Authorization: Bearer $SELLORCHARD_API_KEY"Response200A product.
ShowHide response schema
dataProductrequiredShowHide child attributes
objectstringrequiredidintegerrequiredProduct id.
namestringrequiredName.
slugstringrequiredURL handle (unique).
statusstringrequiredVisibility.
One of:
activedraftarchivedkindstringrequiredWhat is sold.
One of:
physicaldigitalgift_cardbookingtypestringrequiredsimple (one variant) or variable (options and variants).
One of:
simplevariabledescriptionstring | nullrequiredDescription (sanitised HTML).
short_descriptionstring | nullrequiredShort description (HTML).
brand_idinteger | nullrequiredBrand.
category_idsarray of integerrequiredCategories.
optionsarray of ProductOptionrequiredOptions (variable products, up to 3).
ShowHide item attributes
namestringrequiredOption name.
valuesarray of stringrequiredValues in order.
imagesarray of ProductImagerequiredImages, main image first.
ShowHide item attributes
idinteger | nullrequiredImage id (null for a thumbnail that is not in the gallery).
urlstring<uri>requiredPublic URL.
altstring | nullrequiredAlt text.
positionintegerrequiredOrder in the gallery (0 = main image).
variantsarray of VariantrequiredVariants in order.
ShowHide item attributes
objectstringrequiredidintegerrequiredVariant id.
product_idintegerrequiredIts product.
titlestring | nullrequiredOption values joined ("Blue / Large"); null for a simple product.
option_valuesobjectrequiredOption name → value.
ShowHide child attributes
__PHP_Incomplete_Class_Nameany
skustring | nullrequiredSKU (unique in the store).
barcodestring | nullrequiredGTIN / EAN / UPC (8, 12, 13 or 14 digits).
pricestringrequiredPrice in the store currency.
pattern ^-?\d+\.\d{2}$
compare_at_pricestring | nullrequiredWas-price (higher than price), or null.
pattern ^-?\d+\.\d{2}$
coststring | nullrequiredCost price (for margins), or null.
pattern ^-?\d+\.\d{2}$
currencystringrequiredStore currency.
weight_gramsinteger | nullrequiredShipping weight in grams.
inventory_trackedbooleanrequiredWhether stock is tracked.
inventory_quantityinteger | nullrequiredUnits available online (all fulfilling locations); null when not tracked.
is_activebooleanrequiredCan be bought.
positionintegerrequiredOrder among the product's variants.
image_urlstring<uri> | nullrequiredVariant image.
created_atstring<date-time>requiredCreated.
updated_atstring<date-time>requiredLast changed.
seoobjectrequiredShowHide child attributes
titlestring | nullrequiredMeta title.
descriptionstring | nullrequiredMeta description.
is_featuredbooleanrequiredFeatured on the storefront.
created_atstring<date-time>requiredCreated.
updated_atstring<date-time>requiredLast changed.
deleted_atstring<date-time> | nullrequiredWhen it was deleted (product.deleted webhooks), else null.
{
"data": {
"object": "product",
"id": 120,
"name": "Organic cotton tee",
"slug": "organic-cotton-tee",
"status": "active",
"kind": "physical",
"type": "variable",
"description": "<p>Soft, breathable and made to last.</p>",
"short_description": "Our everyday tee.",
"brand_id": 4,
"category_ids": [
7,
9
],
"options": [
{
"name": "Color",
"values": [
"Blue",
"White"
]
},
{
"name": "Size",
"values": [
"Medium",
"Large"
]
}
],
"images": [
{
"id": 801,
"url": "https://media.sellorchard.com/stores/01J.../tee.jpg",
"alt": "Blue tee",
"position": 0
}
],
"variants": [
{
"object": "variant",
"id": 311,
"product_id": 120,
"title": "Blue / Large",
"option_values": {
"Color": "Blue",
"Size": "Large"
},
"sku": "TEE-BL-L",
"barcode": "0012345678905",
"price": "24.00",
"compare_at_price": "30.00",
"cost": "9.50",
"currency": "USD",
"weight_grams": 180,
"inventory_tracked": true,
"inventory_quantity": 42,
"is_active": true,
"position": 0,
"image_url": "https://media.sellorchard.com/stores/01J.../tee-blue.jpg",
"created_at": "2026-11-02T15:00:00Z",
"updated_at": "2026-11-03T09:30:00Z"
}
],
"seo": {
"title": "Organic cotton tee",
"description": "Soft organic cotton tee in four colours."
},
"is_featured": false,
"created_at": "2026-11-02T15:00:00Z",
"updated_at": "2026-11-03T09:30:00Z",
"deleted_at": null
}
}Error responses
- 401
authenticationMissing, invalid, expired or revoked API key. - 403
permissionThe key lacks the scope, or the store's plan doesn't include the API. - 404
not_foundNo such object in this store. - 429
rate_limitedToo many requests. - 500
serverSomething went wrong on our side; safe to retry with the same Idempotency-Key.
Update a product
/products/{id}Only the fields sent change. variants, options, images and category_ids replace the whole list when sent. Fires product.updated.
Required scopes:write_products
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer | The object id. |
Request body
namestringName (required on create).
max length 200
slugstring | nullURL handle (generated from the name when empty).
statusstringDefault draft.
One of:
activedraftarchivedkindstringphysical (default) or digital.
One of:
physicaldigitaldescriptionstring | nullHTML (sanitised).
short_descriptionstring | nullHTML.
brand_idinteger | nullBrand id (GET /brands).
category_idsarray of integerCategory ids (GET /categories); replaces the list.
is_featuredbooleanFeatured.
seoobjectShowHide child attributes
titlestring | nullMeta title.
descriptionstring | nullMeta description.
optionsarray of ProductOptionOptions (up to 3). Without options the product is simple and has exactly one variant.
ShowHide item attributes
namestringrequiredOption name.
valuesarray of stringrequiredValues in order.
imagesarray of objectImages, main image first; replaces the gallery.
ShowHide item attributes
urlstring<uri>requiredAn http(s) image URL; downloaded into the media library (JPG, PNG, WebP, AVIF or GIF). URLs of the product's current images are kept as they are.
altstring | nullAlt text.
variantsarray of VariantInputVariants (required on create). On PATCH: the full list (ids keep variants; the rest are deleted).
ShowHide item attributes
idinteger | nullAn existing variant to keep and change (PATCH). Variants left out of a PATCH that sends
variantsare deleted.skustring | nullSKU (unique in the store).
max length 64
barcodestring | nullGTIN (8, 12, 13 or 14 digits).
pricestring | numberPrice (required for new variants).
compare_at_pricestring | number | nullWas-price; must be higher than price.
coststring | number | nullCost price.
weight_gramsinteger | nullWeight in grams.
option_valuesobjectOption name → value (one per option).
ShowHide child attributes
__PHP_Incomplete_Class_Nameany
inventory_trackedbooleanTrack stock (default true).
inventory_quantityinteger | nullUnits at the first fulfilling location (tracked variants). Use the inventory endpoints for per-location stock.
is_activebooleanCan be bought (default true).
Example request
curl -X PATCH "https://api.sellorchard.com/v1/products/120" \
-H "Authorization: Bearer $SELLORCHARD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Organic cotton tee",
"status": "active",
"kind": "physical",
"description": "<p>Soft, breathable and made to last.</p>",
"brand_id": 4,
"category_ids": [
7
],
"seo": {
"title": "Organic cotton tee",
"description": "Soft organic cotton tee."
},
"options": [
{
"name": "Color",
"values": [
"Blue"
]
},
{
"name": "Size",
"values": [
"Large"
]
}
],
"images": [
{
"url": "https://example.com/images/tee.jpg",
"alt": "Blue tee"
}
],
"variants": [
{
"sku": "TEE-BL-L",
"barcode": null,
"price": "24.00",
"compare_at_price": "30.00",
"cost": "9.50",
"weight_grams": 180,
"option_values": {
"Color": "Blue",
"Size": "Large"
},
"inventory_tracked": true,
"inventory_quantity": 40,
"is_active": true
}
]
}'Response200A product.
ShowHide response schema
dataProductrequiredShowHide child attributes
objectstringrequiredidintegerrequiredProduct id.
namestringrequiredName.
slugstringrequiredURL handle (unique).
statusstringrequiredVisibility.
One of:
activedraftarchivedkindstringrequiredWhat is sold.
One of:
physicaldigitalgift_cardbookingtypestringrequiredsimple (one variant) or variable (options and variants).
One of:
simplevariabledescriptionstring | nullrequiredDescription (sanitised HTML).
short_descriptionstring | nullrequiredShort description (HTML).
brand_idinteger | nullrequiredBrand.
category_idsarray of integerrequiredCategories.
optionsarray of ProductOptionrequiredOptions (variable products, up to 3).
ShowHide item attributes
namestringrequiredOption name.
valuesarray of stringrequiredValues in order.
imagesarray of ProductImagerequiredImages, main image first.
ShowHide item attributes
idinteger | nullrequiredImage id (null for a thumbnail that is not in the gallery).
urlstring<uri>requiredPublic URL.
altstring | nullrequiredAlt text.
positionintegerrequiredOrder in the gallery (0 = main image).
variantsarray of VariantrequiredVariants in order.
ShowHide item attributes
objectstringrequiredidintegerrequiredVariant id.
product_idintegerrequiredIts product.
titlestring | nullrequiredOption values joined ("Blue / Large"); null for a simple product.
option_valuesobjectrequiredOption name → value.
ShowHide child attributes
__PHP_Incomplete_Class_Nameany
skustring | nullrequiredSKU (unique in the store).
barcodestring | nullrequiredGTIN / EAN / UPC (8, 12, 13 or 14 digits).
pricestringrequiredPrice in the store currency.
pattern ^-?\d+\.\d{2}$
compare_at_pricestring | nullrequiredWas-price (higher than price), or null.
pattern ^-?\d+\.\d{2}$
coststring | nullrequiredCost price (for margins), or null.
pattern ^-?\d+\.\d{2}$
currencystringrequiredStore currency.
weight_gramsinteger | nullrequiredShipping weight in grams.
inventory_trackedbooleanrequiredWhether stock is tracked.
inventory_quantityinteger | nullrequiredUnits available online (all fulfilling locations); null when not tracked.
is_activebooleanrequiredCan be bought.
positionintegerrequiredOrder among the product's variants.
image_urlstring<uri> | nullrequiredVariant image.
created_atstring<date-time>requiredCreated.
updated_atstring<date-time>requiredLast changed.
seoobjectrequiredShowHide child attributes
titlestring | nullrequiredMeta title.
descriptionstring | nullrequiredMeta description.
is_featuredbooleanrequiredFeatured on the storefront.
created_atstring<date-time>requiredCreated.
updated_atstring<date-time>requiredLast changed.
deleted_atstring<date-time> | nullrequiredWhen it was deleted (product.deleted webhooks), else null.
{
"data": {
"object": "product",
"id": 120,
"name": "Organic cotton tee",
"slug": "organic-cotton-tee",
"status": "active",
"kind": "physical",
"type": "variable",
"description": "<p>Soft, breathable and made to last.</p>",
"short_description": "Our everyday tee.",
"brand_id": 4,
"category_ids": [
7,
9
],
"options": [
{
"name": "Color",
"values": [
"Blue",
"White"
]
},
{
"name": "Size",
"values": [
"Medium",
"Large"
]
}
],
"images": [
{
"id": 801,
"url": "https://media.sellorchard.com/stores/01J.../tee.jpg",
"alt": "Blue tee",
"position": 0
}
],
"variants": [
{
"object": "variant",
"id": 311,
"product_id": 120,
"title": "Blue / Large",
"option_values": {
"Color": "Blue",
"Size": "Large"
},
"sku": "TEE-BL-L",
"barcode": "0012345678905",
"price": "24.00",
"compare_at_price": "30.00",
"cost": "9.50",
"currency": "USD",
"weight_grams": 180,
"inventory_tracked": true,
"inventory_quantity": 42,
"is_active": true,
"position": 0,
"image_url": "https://media.sellorchard.com/stores/01J.../tee-blue.jpg",
"created_at": "2026-11-02T15:00:00Z",
"updated_at": "2026-11-03T09:30:00Z"
}
],
"seo": {
"title": "Organic cotton tee",
"description": "Soft organic cotton tee in four colours."
},
"is_featured": false,
"created_at": "2026-11-02T15:00:00Z",
"updated_at": "2026-11-03T09:30:00Z",
"deleted_at": null
}
}Error responses
- 401
authenticationMissing, invalid, expired or revoked API key. - 403
permissionThe key lacks the scope, or the store's plan doesn't include the API. - 404
not_foundNo such object in this store. - 422
invalid_requestInvalid parameters;errorslists each field. - 429
rate_limitedToo many requests. - 500
serverSomething went wrong on our side; safe to retry with the same Idempotency-Key.
Delete a product
/products/{id}Soft delete: past orders keep showing the product. Fires product.deleted.
Required scopes:write_products
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer | The object id. |
Example request
curl -X DELETE "https://api.sellorchard.com/v1/products/120" \
-H "Authorization: Bearer $SELLORCHARD_API_KEY"Response200Deleted.
ShowHide response schema
dataDeletedrequiredShowHide child attributes
objectstringrequiredObject type.
idintegerrequiredId.
deletedbooleanrequiredtrue: deleted. Discounts used on orders are switched off instead (deleted false, is_active false).
{
"data": {
"object": "product",
"id": 120,
"deleted": true
}
}Error responses
- 401
authenticationMissing, invalid, expired or revoked API key. - 403
permissionThe key lacks the scope, or the store's plan doesn't include the API. - 404
not_foundNo such object in this store. - 429
rate_limitedToo many requests. - 500
serverSomething went wrong on our side; safe to retry with the same Idempotency-Key.
List a product's variants
/products/{id}/variantsRequired scopes:read_products
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer | The object id. |
Query parameters
| Name | Type | Description |
|---|---|---|
limit | integer | Page size, 1–250 (default 50). default 50 · min 1 · max 250 |
cursor | string | next_cursor from the previous page. |
updated_since | string<date-time> | Only objects changed at or after this ISO-8601 time. |
created_since | string<date-time> | Only objects created at or after this ISO-8601 time. |
Example request
curl "https://api.sellorchard.com/v1/products/120/variants?limit=50" \
-H "Authorization: Bearer $SELLORCHARD_API_KEY"Response200Variants.
ShowHide response schema
dataarray of VariantrequiredShowHide item attributes
objectstringrequiredidintegerrequiredVariant id.
product_idintegerrequiredIts product.
titlestring | nullrequiredOption values joined ("Blue / Large"); null for a simple product.
option_valuesobjectrequiredOption name → value.
ShowHide child attributes
__PHP_Incomplete_Class_Nameany
skustring | nullrequiredSKU (unique in the store).
barcodestring | nullrequiredGTIN / EAN / UPC (8, 12, 13 or 14 digits).
pricestringrequiredPrice in the store currency.
pattern ^-?\d+\.\d{2}$
compare_at_pricestring | nullrequiredWas-price (higher than price), or null.
pattern ^-?\d+\.\d{2}$
coststring | nullrequiredCost price (for margins), or null.
pattern ^-?\d+\.\d{2}$
currencystringrequiredStore currency.
weight_gramsinteger | nullrequiredShipping weight in grams.
inventory_trackedbooleanrequiredWhether stock is tracked.
inventory_quantityinteger | nullrequiredUnits available online (all fulfilling locations); null when not tracked.
is_activebooleanrequiredCan be bought.
positionintegerrequiredOrder among the product's variants.
image_urlstring<uri> | nullrequiredVariant image.
created_atstring<date-time>requiredCreated.
updated_atstring<date-time>requiredLast changed.
has_morebooleanrequiredMore pages after this one.
next_cursorstring | nullrequiredPass as
cursorfor the next page; null on the last page.
{
"data": [
{
"object": "variant",
"id": 311,
"product_id": 120,
"title": "Blue / Large",
"option_values": {
"Color": "Blue",
"Size": "Large"
},
"sku": "TEE-BL-L",
"barcode": "0012345678905",
"price": "24.00",
"compare_at_price": "30.00",
"cost": "9.50",
"currency": "USD",
"weight_grams": 180,
"inventory_tracked": true,
"inventory_quantity": 42,
"is_active": true,
"position": 0,
"image_url": "https://media.sellorchard.com/stores/01J.../tee-blue.jpg",
"created_at": "2026-11-02T15:00:00Z",
"updated_at": "2026-11-03T09:30:00Z"
}
],
"has_more": false,
"next_cursor": null
}Error responses
- 400
invalid_requestMalformed request (e.g. a bad cursor). - 401
authenticationMissing, invalid, expired or revoked API key. - 403
permissionThe key lacks the scope, or the store's plan doesn't include the API. - 404
not_foundNo such object in this store. - 422
invalid_requestInvalid parameters;errorslists each field. - 429
rate_limitedToo many requests. - 500
serverSomething went wrong on our side; safe to retry with the same Idempotency-Key.
Update a variant
/variants/{id}Price, compare-at price, cost, SKU, barcode and weight. Stock changes go through the inventory endpoints.
Required scopes:write_products
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer | The object id. |
Request body
pricestring | numbercompare_at_pricestring | number | nullcoststring | number | nullskustring | nullSKU.
barcodestring | nullGTIN.
weight_gramsinteger | nullWeight in grams.
Example request
curl -X PATCH "https://api.sellorchard.com/v1/variants/120" \
-H "Authorization: Bearer $SELLORCHARD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"price": "22.00",
"compare_at_price": "30.00"
}'Response200A variant.
ShowHide response schema
dataVariantrequiredShowHide child attributes
objectstringrequiredidintegerrequiredVariant id.
product_idintegerrequiredIts product.
titlestring | nullrequiredOption values joined ("Blue / Large"); null for a simple product.
option_valuesobjectrequiredOption name → value.
ShowHide child attributes
__PHP_Incomplete_Class_Nameany
skustring | nullrequiredSKU (unique in the store).
barcodestring | nullrequiredGTIN / EAN / UPC (8, 12, 13 or 14 digits).
pricestringrequiredPrice in the store currency.
pattern ^-?\d+\.\d{2}$
compare_at_pricestring | nullrequiredWas-price (higher than price), or null.
pattern ^-?\d+\.\d{2}$
coststring | nullrequiredCost price (for margins), or null.
pattern ^-?\d+\.\d{2}$
currencystringrequiredStore currency.
weight_gramsinteger | nullrequiredShipping weight in grams.
inventory_trackedbooleanrequiredWhether stock is tracked.
inventory_quantityinteger | nullrequiredUnits available online (all fulfilling locations); null when not tracked.
is_activebooleanrequiredCan be bought.
positionintegerrequiredOrder among the product's variants.
image_urlstring<uri> | nullrequiredVariant image.
created_atstring<date-time>requiredCreated.
updated_atstring<date-time>requiredLast changed.
{
"data": {
"object": "variant",
"id": 311,
"product_id": 120,
"title": "Blue / Large",
"option_values": {
"Color": "Blue",
"Size": "Large"
},
"sku": "TEE-BL-L",
"barcode": "0012345678905",
"price": "24.00",
"compare_at_price": "30.00",
"cost": "9.50",
"currency": "USD",
"weight_grams": 180,
"inventory_tracked": true,
"inventory_quantity": 42,
"is_active": true,
"position": 0,
"image_url": "https://media.sellorchard.com/stores/01J.../tee-blue.jpg",
"created_at": "2026-11-02T15:00:00Z",
"updated_at": "2026-11-03T09:30:00Z"
}
}Error responses
- 401
authenticationMissing, invalid, expired or revoked API key. - 403
permissionThe key lacks the scope, or the store's plan doesn't include the API. - 404
not_foundNo such object in this store. - 422
invalid_requestInvalid parameters;errorslists each field. - 429
rate_limitedToo many requests. - 500
serverSomething went wrong on our side; safe to retry with the same Idempotency-Key.