Admin API
Products
Physical and digital products, their variants, images and files.
- GETGoogle product categories: search them, or browse one level at a time
- GETProducts, newest first
- POSTCreate a product with its options and variants
- GETOne product
- PATCHUpdate a product
- DELDelete a product and its variants
- GETThe store's tax classes, default first
- POSTAdd a tax class
- PATCHChange a tax class; products using it get the new rate and code
- DELRemove a tax class; its products keep their rate and code
Google product categories: search them, or browse one level at a time
GET/admin/2026-11/product-categories
Query parameters
qstringWords to find anywhere in the category path.
Up to 100 characters
parent_idintegerList the children of this category.
Response 200
dataarray of objectrequireddata[].idintegerrequireddata[].namestringrequireddata[].pathstringrequiredFull path, levels joined with " > ".
data[].parent_idinteger or nullrequireddata[].has_childrenbooleanrequired
Errors
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl https://api.storelyne.com/admin/2026-11/product-categories \
-H "Authorization: Bearer pat_live_..."const res = await fetch('https://api.storelyne.com/admin/2026-11/product-categories', {
method: 'GET',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
},
});
const data = await res.json();{
"data": [
{
"id": 1,
"name": "Festive saree",
"path": "string",
"parent_id": 1,
"has_children": false
}
]
}Products, newest first
GET/admin/2026-11/products
Query parameters
limitintegerItems per page, 1 to 250.
Default 50 · 1 to 250
afterstringCursor from a previous next_cursor.
Up to 512 characters
statusenumOne of
draftactivearchivedtypeenumOne of
physicaldigitalservicecoursemembershipbookingqstringTitle, URL handle, SKU or vendor.
At least 1 characters · Up to 100 characters
Response 200
dataarray of objectrequireddata[].idID (prd_...)requireddata[].titlestringrequireddata[].handlestringrequireddata[].typeenumrequiredOne of
physicaldigitalservicecoursemembershipbookingdata[].statusenumrequiredOne of
draftactivearchiveddata[].description_htmlstringrequireddata[].vendorstringrequireddata[].tagsarray of stringrequireddata[].currencyenumrequiredOne of
INRGBPdata[].hsn_codestring or nullrequireddata[].gst_rate_bpinteger or nullrequiredGST rate in basis points: 1800 is 18%.
data[].tax_class_idID (txc_...) or nullrequiredThe tax class the rate and code come from (D-101).
data[].product_typestringrequiredYour own grouping, such as Saree or Workbook.
data[].categoryobject or nullrequiredGoogle product category, used by sales channels and for tax hints.
data[].category.idintegerrequireddata[].category.pathstringrequireddata[].seoobjectrequireddata[].seo.titlestringEmpty means the product title.
Up to 70 characters
data[].seo.descriptionstringEmpty means the start of the description.
Up to 320 characters
data[].attributesobjectrequiredWhat sales channels and marketplaces ask for (Google, Meta and others).
data[].attributes.conditionenumOne of
newrefurbisheduseddata[].attributes.age_groupenumOne of
newborninfanttoddlerkidsadultdata[].attributes.genderenumOne of
malefemaleunisexdata[].attributes.materialstringUp to 100 characters
data[].attributes.patternstringUp to 100 characters
data[].attributes.colorstringUp to 100 characters
data[].mediaarray of objectrequireddata[].media[].file_idID (fil_...)requireddata[].media[].altstringrequiredUp to 200 characters
data[].optionsarray of objectrequireddata[].options[].idID (opt_...)requireddata[].options[].namestringrequireddata[].options[].positionintegerrequireddata[].options[].valuesarray of stringrequireddata[].variantsarray of objectrequireddata[].variants[].idID (var_...)requireddata[].variants[].titlestringrequireddata[].variants[].skustring or nullrequireddata[].variants[].priceintegerrequireddata[].variants[].compare_at_priceinteger or nullrequireddata[].variants[].option_valuesarray of stringrequireddata[].variants[].positionintegerrequireddata[].variants[].weight_gramsinteger or nullrequireddata[].variants[].requires_shippingbooleanrequireddata[].variants[].barcodestring or nullrequiredGTIN, EAN, UPC or ISBN.
data[].variants[].mpnstring or nullrequiredManufacturer part number.
data[].variants[].cost_priceinteger or nullrequiredWhat the item costs you, for margins. Never shown to buyers.
data[].variants[].image_file_idID (fil_...) or nullrequiredThe product image shown for this variant.
data[].created_attimestamprequireddata[].updated_attimestamprequiredhas_morebooleanrequirednext_cursorstring or nullrequired
Errors
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl https://api.storelyne.com/admin/2026-11/products \
-H "Authorization: Bearer pat_live_..."const res = await fetch('https://api.storelyne.com/admin/2026-11/products', {
method: 'GET',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
},
});
const data = await res.json();{
"data": [
{
"id": "prd_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"title": "Festive saree",
"handle": "festive-saree",
"type": "physical",
"status": "draft",
"description_html": "<p>Hand block printed cotton.</p>",
"vendor": "string",
"tags": [
"string"
],
"currency": "INR",
"hsn_code": "string",
"gst_rate_bp": 1,
"tax_class_id": "txc_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"product_type": "string",
"category": {
"id": 1,
"path": "string"
},
"seo": {
"title": "Festive saree",
"description": "Hand block printed cotton."
},
"attributes": {
"condition": "new",
"age_group": "newborn",
"gender": "male",
"material": "string",
"pattern": "string",
"color": "string"
},
"media": [
{
"file_id": "fil_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"alt": ""
}
],
"options": [
{
"id": "opt_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"name": "Festive saree",
"position": 1,
"values": []
}
],
"variants": [
{
"id": "var_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"title": "Festive saree",
"sku": "string",
"price": 49900,
"compare_at_price": 49900,
"option_values": [],
"position": 1,
"weight_grams": 1,
"requires_shipping": false,
"barcode": "string",
"mpn": "string",
"cost_price": 49900,
"image_file_id": "fil_01JCG8ZQ5S7T0V4X8K2M3N6P9R"
}
],
"created_at": "2026-11-04T10:00:00.000Z",
"updated_at": "2026-11-04T10:00:00.000Z"
}
],
"has_more": false,
"next_cursor": "eyJpZCI6Ii4uLiJ9"
}Create a product with its options and variants
POST/admin/2026-11/products
scope write_productsIdempotency-Key required
Headers
Idempotency-KeystringrequiredUnique key for this request. Retries with the same key return the first response.
At least 1 characters · Up to 255 characters
X-CSRF-TokenstringRequired with a seller session cookie: the value of the orb_csrf cookie.
Request body
titlestringrequiredAt least 1 characters · Up to 255 characters
handlestringUp to 100 characters
statusenumOne of
draftactivearchivedDefault "draft"
description_htmlstringUp to 100000 characters
vendorstringUp to 100 characters
tagsarray of stringUp to 50 items
hsn_codestring or nullDefault null
gst_rate_bpenum or nullOne of
025300500120018002800Default null
tax_class_idID (txc_...) or nullOmitted with no GST rate and no code: the default tax class, when there is one.
product_typestringUp to 100 characters
category_idinteger or nullA Google product category ID.
Default null
seoobjectDefault {}
seo.titlestringEmpty means the product title.
Up to 70 characters
seo.descriptionstringEmpty means the start of the description.
Up to 320 characters
attributesobjectWhat sales channels and marketplaces ask for (Google, Meta and others).
Default {}
attributes.conditionenumOne of
newrefurbishedusedattributes.age_groupenumOne of
newborninfanttoddlerkidsadultattributes.genderenumOne of
malefemaleunisexattributes.materialstringUp to 100 characters
attributes.patternstringUp to 100 characters
attributes.colorstringUp to 100 characters
mediaarray of objectUploaded image files in order; the first is the main image.
Up to 20 items
media[].file_idID (fil_...)requiredmedia[].altstringUp to 200 characters
optionsarray of objectUp to 3 items
options[].namestringrequiredAt least 1 characters · Up to 50 characters
options[].valuesarray of stringrequiredUp to 100 items
variantsarray of objectrequiredUp to 100 items
variants[].idID (var_...)Send to keep an existing variant when replacing the list.
variants[].titlestringAt least 1 characters · Up to 200 characters
variants[].skustring or nullvariants[].priceintegerrequiredMinor units (paise).
0 to 100000000000
variants[].compare_at_priceinteger or nullvariants[].option_valuesarray of stringUp to 3 items
variants[].weight_gramsinteger or nullvariants[].requires_shippingbooleanvariants[].barcodestring or nullvariants[].mpnstring or nullvariants[].cost_priceinteger or nullvariants[].image_file_idID (fil_...) or nullAdded to the product images if not there yet.
typeenumrequiredOne of
physicaldigitalservicecoursemembershipbooking
Response 201
idID (prd_...)requiredtitlestringrequiredhandlestringrequiredtypeenumrequiredOne of
physicaldigitalservicecoursemembershipbookingstatusenumrequiredOne of
draftactivearchiveddescription_htmlstringrequiredvendorstringrequiredtagsarray of stringrequiredcurrencyenumrequiredOne of
INRGBPhsn_codestring or nullrequiredgst_rate_bpinteger or nullrequiredGST rate in basis points: 1800 is 18%.
tax_class_idID (txc_...) or nullrequiredThe tax class the rate and code come from (D-101).
product_typestringrequiredYour own grouping, such as Saree or Workbook.
categoryobject or nullrequiredGoogle product category, used by sales channels and for tax hints.
category.idintegerrequiredcategory.pathstringrequiredseoobjectrequiredseo.titlestringEmpty means the product title.
Up to 70 characters
seo.descriptionstringEmpty means the start of the description.
Up to 320 characters
attributesobjectrequiredWhat sales channels and marketplaces ask for (Google, Meta and others).
attributes.conditionenumOne of
newrefurbishedusedattributes.age_groupenumOne of
newborninfanttoddlerkidsadultattributes.genderenumOne of
malefemaleunisexattributes.materialstringUp to 100 characters
attributes.patternstringUp to 100 characters
attributes.colorstringUp to 100 characters
mediaarray of objectrequiredmedia[].file_idID (fil_...)requiredmedia[].altstringrequiredUp to 200 characters
optionsarray of objectrequiredoptions[].idID (opt_...)requiredoptions[].namestringrequiredoptions[].positionintegerrequiredoptions[].valuesarray of stringrequiredvariantsarray of objectrequiredvariants[].idID (var_...)requiredvariants[].titlestringrequiredvariants[].skustring or nullrequiredvariants[].priceintegerrequiredvariants[].compare_at_priceinteger or nullrequiredvariants[].option_valuesarray of stringrequiredvariants[].positionintegerrequiredvariants[].weight_gramsinteger or nullrequiredvariants[].requires_shippingbooleanrequiredvariants[].barcodestring or nullrequiredGTIN, EAN, UPC or ISBN.
variants[].mpnstring or nullrequiredManufacturer part number.
variants[].cost_priceinteger or nullrequiredWhat the item costs you, for margins. Never shown to buyers.
variants[].image_file_idID (fil_...) or nullrequiredThe product image shown for this variant.
created_attimestamprequiredupdated_attimestamprequired
Errors
| 400 | idempotency_key_required | Every POST needs an Idempotency-Key header. |
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 409 | conflict | The request conflicts with the current state of the object. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. |
| 422 | idempotency_key_reused | This Idempotency-Key was used with a different request. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl -X POST https://api.storelyne.com/admin/2026-11/products \
-H "Authorization: Bearer pat_live_..." \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"title": "Festive saree",
"variants": [
{
"price": 49900
}
],
"type": "physical"
}'const res = await fetch('https://api.storelyne.com/admin/2026-11/products', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"title": "Festive saree",
"variants": [
{
"price": 49900
}
],
"type": "physical"
}),
});
const data = await res.json();{
"id": "prd_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"title": "Festive saree",
"handle": "festive-saree",
"type": "physical",
"status": "draft",
"description_html": "<p>Hand block printed cotton.</p>",
"vendor": "string",
"tags": [
"string"
],
"currency": "INR",
"hsn_code": "string",
"gst_rate_bp": 1,
"tax_class_id": "txc_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"product_type": "string",
"category": {
"id": 1,
"path": "string"
},
"seo": {
"title": "Festive saree",
"description": "Hand block printed cotton."
},
"attributes": {
"condition": "new",
"age_group": "newborn",
"gender": "male",
"material": "string",
"pattern": "string",
"color": "string"
},
"media": [
{
"file_id": "fil_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"alt": ""
}
],
"options": [
{
"id": "opt_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"name": "Festive saree",
"position": 1,
"values": [
"string"
]
}
],
"variants": [
{
"id": "var_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"title": "Festive saree",
"sku": "string",
"price": 49900,
"compare_at_price": 49900,
"option_values": [
"string"
],
"position": 1,
"weight_grams": 1,
"requires_shipping": false,
"barcode": "string",
"mpn": "string",
"cost_price": 49900,
"image_file_id": "fil_01JCG8ZQ5S7T0V4X8K2M3N6P9R"
}
],
"created_at": "2026-11-04T10:00:00.000Z",
"updated_at": "2026-11-04T10:00:00.000Z"
}One product
GET/admin/2026-11/products/{id}
Path parameters
idID (prd_...)required
Response 200
idID (prd_...)requiredtitlestringrequiredhandlestringrequiredtypeenumrequiredOne of
physicaldigitalservicecoursemembershipbookingstatusenumrequiredOne of
draftactivearchiveddescription_htmlstringrequiredvendorstringrequiredtagsarray of stringrequiredcurrencyenumrequiredOne of
INRGBPhsn_codestring or nullrequiredgst_rate_bpinteger or nullrequiredGST rate in basis points: 1800 is 18%.
tax_class_idID (txc_...) or nullrequiredThe tax class the rate and code come from (D-101).
product_typestringrequiredYour own grouping, such as Saree or Workbook.
categoryobject or nullrequiredGoogle product category, used by sales channels and for tax hints.
category.idintegerrequiredcategory.pathstringrequiredseoobjectrequiredseo.titlestringEmpty means the product title.
Up to 70 characters
seo.descriptionstringEmpty means the start of the description.
Up to 320 characters
attributesobjectrequiredWhat sales channels and marketplaces ask for (Google, Meta and others).
attributes.conditionenumOne of
newrefurbishedusedattributes.age_groupenumOne of
newborninfanttoddlerkidsadultattributes.genderenumOne of
malefemaleunisexattributes.materialstringUp to 100 characters
attributes.patternstringUp to 100 characters
attributes.colorstringUp to 100 characters
mediaarray of objectrequiredmedia[].file_idID (fil_...)requiredmedia[].altstringrequiredUp to 200 characters
optionsarray of objectrequiredoptions[].idID (opt_...)requiredoptions[].namestringrequiredoptions[].positionintegerrequiredoptions[].valuesarray of stringrequiredvariantsarray of objectrequiredvariants[].idID (var_...)requiredvariants[].titlestringrequiredvariants[].skustring or nullrequiredvariants[].priceintegerrequiredvariants[].compare_at_priceinteger or nullrequiredvariants[].option_valuesarray of stringrequiredvariants[].positionintegerrequiredvariants[].weight_gramsinteger or nullrequiredvariants[].requires_shippingbooleanrequiredvariants[].barcodestring or nullrequiredGTIN, EAN, UPC or ISBN.
variants[].mpnstring or nullrequiredManufacturer part number.
variants[].cost_priceinteger or nullrequiredWhat the item costs you, for margins. Never shown to buyers.
variants[].image_file_idID (fil_...) or nullrequiredThe product image shown for this variant.
created_attimestamprequiredupdated_attimestamprequired
Errors
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 404 | resource_not_found | The object does not exist or belongs to another store. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl https://api.storelyne.com/admin/2026-11/products/prd_01JCG8ZQ5S7T0V4X8K2M3N6P9R \
-H "Authorization: Bearer pat_live_..."const res = await fetch('https://api.storelyne.com/admin/2026-11/products/prd_01JCG8ZQ5S7T0V4X8K2M3N6P9R', {
method: 'GET',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
},
});
const data = await res.json();{
"id": "prd_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"title": "Festive saree",
"handle": "festive-saree",
"type": "physical",
"status": "draft",
"description_html": "<p>Hand block printed cotton.</p>",
"vendor": "string",
"tags": [
"string"
],
"currency": "INR",
"hsn_code": "string",
"gst_rate_bp": 1,
"tax_class_id": "txc_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"product_type": "string",
"category": {
"id": 1,
"path": "string"
},
"seo": {
"title": "Festive saree",
"description": "Hand block printed cotton."
},
"attributes": {
"condition": "new",
"age_group": "newborn",
"gender": "male",
"material": "string",
"pattern": "string",
"color": "string"
},
"media": [
{
"file_id": "fil_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"alt": ""
}
],
"options": [
{
"id": "opt_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"name": "Festive saree",
"position": 1,
"values": [
"string"
]
}
],
"variants": [
{
"id": "var_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"title": "Festive saree",
"sku": "string",
"price": 49900,
"compare_at_price": 49900,
"option_values": [
"string"
],
"position": 1,
"weight_grams": 1,
"requires_shipping": false,
"barcode": "string",
"mpn": "string",
"cost_price": 49900,
"image_file_id": "fil_01JCG8ZQ5S7T0V4X8K2M3N6P9R"
}
],
"created_at": "2026-11-04T10:00:00.000Z",
"updated_at": "2026-11-04T10:00:00.000Z"
}Update a product
PATCH/admin/2026-11/products/{id}
Path parameters
idID (prd_...)required
Headers
X-CSRF-TokenstringRequired with a seller session cookie: the value of the orb_csrf cookie.
Request body
titlestringAt least 1 characters · Up to 255 characters
handlestringUp to 100 characters
statusenumOne of
draftactivearchiveddescription_htmlstringUp to 100000 characters
vendorstringUp to 100 characters
tagsarray of stringUp to 50 items
hsn_codestring or nullgst_rate_bpenum or nullOne of
025300500120018002800tax_class_idID (txc_...) or nullUse this tax class: its GST rate and HSN or SAC code replace gst_rate_bp and hsn_code.
product_typestringUp to 100 characters
category_idinteger or nullA Google product category ID.
seoobjectseo.titlestringEmpty means the product title.
Up to 70 characters
seo.descriptionstringEmpty means the start of the description.
Up to 320 characters
attributesobjectWhat sales channels and marketplaces ask for (Google, Meta and others).
attributes.conditionenumOne of
newrefurbishedusedattributes.age_groupenumOne of
newborninfanttoddlerkidsadultattributes.genderenumOne of
malefemaleunisexattributes.materialstringUp to 100 characters
attributes.patternstringUp to 100 characters
attributes.colorstringUp to 100 characters
mediaarray of objectUploaded image files in order; the first is the main image.
Up to 20 items
media[].file_idID (fil_...)requiredmedia[].altstringUp to 200 characters
optionsarray of objectUp to 3 items
options[].namestringrequiredAt least 1 characters · Up to 50 characters
options[].valuesarray of stringrequiredUp to 100 items
variantsarray of objectUp to 100 items
variants[].idID (var_...)Send to keep an existing variant when replacing the list.
variants[].titlestringAt least 1 characters · Up to 200 characters
variants[].skustring or nullvariants[].priceintegerrequiredMinor units (paise).
0 to 100000000000
variants[].compare_at_priceinteger or nullvariants[].option_valuesarray of stringUp to 3 items
variants[].weight_gramsinteger or nullvariants[].requires_shippingbooleanvariants[].barcodestring or nullvariants[].mpnstring or nullvariants[].cost_priceinteger or nullvariants[].image_file_idID (fil_...) or nullAdded to the product images if not there yet.
Response 200
idID (prd_...)requiredtitlestringrequiredhandlestringrequiredtypeenumrequiredOne of
physicaldigitalservicecoursemembershipbookingstatusenumrequiredOne of
draftactivearchiveddescription_htmlstringrequiredvendorstringrequiredtagsarray of stringrequiredcurrencyenumrequiredOne of
INRGBPhsn_codestring or nullrequiredgst_rate_bpinteger or nullrequiredGST rate in basis points: 1800 is 18%.
tax_class_idID (txc_...) or nullrequiredThe tax class the rate and code come from (D-101).
product_typestringrequiredYour own grouping, such as Saree or Workbook.
categoryobject or nullrequiredGoogle product category, used by sales channels and for tax hints.
category.idintegerrequiredcategory.pathstringrequiredseoobjectrequiredseo.titlestringEmpty means the product title.
Up to 70 characters
seo.descriptionstringEmpty means the start of the description.
Up to 320 characters
attributesobjectrequiredWhat sales channels and marketplaces ask for (Google, Meta and others).
attributes.conditionenumOne of
newrefurbishedusedattributes.age_groupenumOne of
newborninfanttoddlerkidsadultattributes.genderenumOne of
malefemaleunisexattributes.materialstringUp to 100 characters
attributes.patternstringUp to 100 characters
attributes.colorstringUp to 100 characters
mediaarray of objectrequiredmedia[].file_idID (fil_...)requiredmedia[].altstringrequiredUp to 200 characters
optionsarray of objectrequiredoptions[].idID (opt_...)requiredoptions[].namestringrequiredoptions[].positionintegerrequiredoptions[].valuesarray of stringrequiredvariantsarray of objectrequiredvariants[].idID (var_...)requiredvariants[].titlestringrequiredvariants[].skustring or nullrequiredvariants[].priceintegerrequiredvariants[].compare_at_priceinteger or nullrequiredvariants[].option_valuesarray of stringrequiredvariants[].positionintegerrequiredvariants[].weight_gramsinteger or nullrequiredvariants[].requires_shippingbooleanrequiredvariants[].barcodestring or nullrequiredGTIN, EAN, UPC or ISBN.
variants[].mpnstring or nullrequiredManufacturer part number.
variants[].cost_priceinteger or nullrequiredWhat the item costs you, for margins. Never shown to buyers.
variants[].image_file_idID (fil_...) or nullrequiredThe product image shown for this variant.
created_attimestamprequiredupdated_attimestamprequired
Errors
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 404 | resource_not_found | The object does not exist or belongs to another store. |
| 409 | conflict | The request conflicts with the current state of the object. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl -X PATCH https://api.storelyne.com/admin/2026-11/products/prd_01JCG8ZQ5S7T0V4X8K2M3N6P9R \
-H "Authorization: Bearer pat_live_..." \
-H "Content-Type: application/json" \
-d '{
"title": "Festive saree",
"handle": "festive-saree",
"status": "draft"
}'const res = await fetch('https://api.storelyne.com/admin/2026-11/products/prd_01JCG8ZQ5S7T0V4X8K2M3N6P9R', {
method: 'PATCH',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"title": "Festive saree",
"handle": "festive-saree",
"status": "draft"
}),
});
const data = await res.json();{
"id": "prd_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"title": "Festive saree",
"handle": "festive-saree",
"type": "physical",
"status": "draft",
"description_html": "<p>Hand block printed cotton.</p>",
"vendor": "string",
"tags": [
"string"
],
"currency": "INR",
"hsn_code": "string",
"gst_rate_bp": 1,
"tax_class_id": "txc_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"product_type": "string",
"category": {
"id": 1,
"path": "string"
},
"seo": {
"title": "Festive saree",
"description": "Hand block printed cotton."
},
"attributes": {
"condition": "new",
"age_group": "newborn",
"gender": "male",
"material": "string",
"pattern": "string",
"color": "string"
},
"media": [
{
"file_id": "fil_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"alt": ""
}
],
"options": [
{
"id": "opt_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"name": "Festive saree",
"position": 1,
"values": [
"string"
]
}
],
"variants": [
{
"id": "var_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"title": "Festive saree",
"sku": "string",
"price": 49900,
"compare_at_price": 49900,
"option_values": [
"string"
],
"position": 1,
"weight_grams": 1,
"requires_shipping": false,
"barcode": "string",
"mpn": "string",
"cost_price": 49900,
"image_file_id": "fil_01JCG8ZQ5S7T0V4X8K2M3N6P9R"
}
],
"created_at": "2026-11-04T10:00:00.000Z",
"updated_at": "2026-11-04T10:00:00.000Z"
}Delete a product and its variants
DEL/admin/2026-11/products/{id}
To hide a product but keep it, set status to archived instead.
Path parameters
idID (prd_...)required
Headers
X-CSRF-TokenstringRequired with a seller session cookie: the value of the orb_csrf cookie.
Response 204
No body.
Errors
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 404 | resource_not_found | The object does not exist or belongs to another store. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl -X DELETE https://api.storelyne.com/admin/2026-11/products/prd_01JCG8ZQ5S7T0V4X8K2M3N6P9R \
-H "Authorization: Bearer pat_live_..."const res = await fetch('https://api.storelyne.com/admin/2026-11/products/prd_01JCG8ZQ5S7T0V4X8K2M3N6P9R', {
method: 'DELETE',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
},
});
const data = await res.json();No body.
The store's tax classes, default first
GET/admin/2026-11/tax-classes
Response 200
dataarray of objectrequireddata[].idID (txc_...)requireddata[].namestringrequireddata[].gst_rate_bpintegerrequireddata[].hsn_codestring or nullrequireddata[].is_defaultbooleanrequireddata[].products_countintegerrequired
Errors
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl https://api.storelyne.com/admin/2026-11/tax-classes \
-H "Authorization: Bearer pat_live_..."const res = await fetch('https://api.storelyne.com/admin/2026-11/tax-classes', {
method: 'GET',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
},
});
const data = await res.json();{
"data": [
{
"id": "txc_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"name": "Festive saree",
"gst_rate_bp": 1,
"hsn_code": "string",
"is_default": false,
"products_count": 1
}
]
}Add a tax class
POST/admin/2026-11/tax-classes
scope write_productsIdempotency-Key required
Headers
Idempotency-KeystringrequiredUnique key for this request. Retries with the same key return the first response.
At least 1 characters · Up to 255 characters
X-CSRF-TokenstringRequired with a seller session cookie: the value of the orb_csrf cookie.
Request body
namestringrequiredAt least 1 characters · Up to 60 characters
gst_rate_bpenumrequiredOne of
025300500120018002800hsn_codestring or nullDefault null
is_defaultbooleanDefault false
Response 201
idID (txc_...)requirednamestringrequiredgst_rate_bpintegerrequiredhsn_codestring or nullrequiredis_defaultbooleanrequiredproducts_countintegerrequired
Errors
| 400 | idempotency_key_required | Every POST needs an Idempotency-Key header. |
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 409 | conflict | The request conflicts with the current state of the object. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. |
| 422 | idempotency_key_reused | This Idempotency-Key was used with a different request. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl -X POST https://api.storelyne.com/admin/2026-11/tax-classes \
-H "Authorization: Bearer pat_live_..." \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "Festive saree",
"gst_rate_bp": 0
}'const res = await fetch('https://api.storelyne.com/admin/2026-11/tax-classes', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
'Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Festive saree",
"gst_rate_bp": 0
}),
});
const data = await res.json();{
"id": "txc_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"name": "Festive saree",
"gst_rate_bp": 1,
"hsn_code": "string",
"is_default": false,
"products_count": 1
}Change a tax class; products using it get the new rate and code
PATCH/admin/2026-11/tax-classes/{id}
Path parameters
idID (txc_...)required
Headers
X-CSRF-TokenstringRequired with a seller session cookie: the value of the orb_csrf cookie.
Request body
namestringAt least 1 characters · Up to 60 characters
gst_rate_bpenumOne of
025300500120018002800hsn_codestring or nullDefault null
is_defaultbooleanDefault false
Response 200
idID (txc_...)requirednamestringrequiredgst_rate_bpintegerrequiredhsn_codestring or nullrequiredis_defaultbooleanrequiredproducts_countintegerrequired
Errors
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 404 | resource_not_found | The object does not exist or belongs to another store. |
| 409 | conflict | The request conflicts with the current state of the object. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl -X PATCH https://api.storelyne.com/admin/2026-11/tax-classes/txc_01JCG8ZQ5S7T0V4X8K2M3N6P9R \
-H "Authorization: Bearer pat_live_..." \
-H "Content-Type: application/json" \
-d '{
"name": "Festive saree",
"gst_rate_bp": 0,
"hsn_code": "string"
}'const res = await fetch('https://api.storelyne.com/admin/2026-11/tax-classes/txc_01JCG8ZQ5S7T0V4X8K2M3N6P9R', {
method: 'PATCH',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "Festive saree",
"gst_rate_bp": 0,
"hsn_code": "string"
}),
});
const data = await res.json();{
"id": "txc_01JCG8ZQ5S7T0V4X8K2M3N6P9R",
"name": "Festive saree",
"gst_rate_bp": 1,
"hsn_code": "string",
"is_default": false,
"products_count": 1
}Remove a tax class; its products keep their rate and code
DEL/admin/2026-11/tax-classes/{id}
Path parameters
idID (txc_...)required
Headers
X-CSRF-TokenstringRequired with a seller session cookie: the value of the orb_csrf cookie.
Response 204
No body.
Errors
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 404 | resource_not_found | The object does not exist or belongs to another store. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl -X DELETE https://api.storelyne.com/admin/2026-11/tax-classes/txc_01JCG8ZQ5S7T0V4X8K2M3N6P9R \
-H "Authorization: Bearer pat_live_..."const res = await fetch('https://api.storelyne.com/admin/2026-11/tax-classes/txc_01JCG8ZQ5S7T0V4X8K2M3N6P9R', {
method: 'DELETE',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
},
});
const data = await res.json();No body.