Products
Related events: product.created · product.deleted · product.updated · write_back.applied · write_back.rolled_back
The Product object
Attributes
idstringUnique identifier of the object (prefixed, opaque).
objectstringproductbrandstringThe brand the object belongs to (
br_…).sourceenumWhere a product comes from. Synced sources (Shopify, a CSV / XML feed, later WooCommerce / PrestaShop) are the source of truth: their products are read-only in Skoup and refreshed by the sync. Manual products are fully editable, and so are the offerings read on the brand's site by the site profile (
site): a suggestion the customer edits, never overwritten once touched.Possible values:
shopify·feed·manual·siteread_onlybooleanexternal_idstringnullableIdentifier at the source (e.g. a Shopify GID), null for manual products.
handlestringnullabletitlestringdescriptionstringnullablevendorstringnullablecategorystringnullableskustringnullablegtinstringnullablepricestringnullableDecimal string, e.g. "1299.00".
currencystringnullableprice_periodenumnullableWhat a price buys: a month or a year of a subscription, or the thing once. Shared by the catalogue and by the price an answer states — two prices of different periods are never compared.
Possible values:
month·year·onceprice_annualstringnullableAlways the amount of one year, decimal string.
price_unitenumnullableWhat a price is counted by: the whole offer, or each user (seat, practitioner, workstation). Shared by the catalogue and by the price an answer states.
Possible values:
flat·per_useraddonsarray of objectShow child attributes
namestringpricenumbernullableperiodenumnullablePossible values:
month·year·onceunitenumnullablePossible values:
flat·per_user
urlstringnullableimage_urlstringnullablestatusenumPublication status, aligned on Shopify's product statuses so a synced product maps one-to-one.
Possible values:
active·draft·archivedtagsarray of stringoptionsarray of objectShow child attributes
namestringvaluesarray of string
variantsarray of variantsShow child attributes
idstringUnique identifier of the object (prefixed, opaque).
objectstringvarianttitlestringskustringnullablegtinstringnullablepricestringnullablecompare_at_pricestringnullableinventory_quantityintegernullableoptionsarray of objectShow child attributes
namestringvaluestring
synced_atstringnullablelivemodebooleantruefor live data,falsefor the test-mode sandbox.createdintegerTime at which the object was created (unix timestamp, seconds).
updatedstringTime at which the object was last updated.
{
"id": "prod_031CQNg2fZXIIClKM3I8uF",
"object": "product",
"brand": "br_031CQGx2DNM4mxT2CO7BL3",
"source": "shopify",
"read_only": true,
"external_id": "gid://shopify/Product/8123456789012",
"handle": "grizl-cf-sl-7",
"title": "Grizl CF SL 7",
"description": "Gravel carbone, transmission Shimano GRX 2x12.",
"vendor": "Nordvelo",
"category": "Vélos gravel",
"sku": "GRZ-CF-SL7",
"gtin": "4251234567890",
"price": "2499.00",
"currency": "EUR",
"price_period": null,
"price_annual": null,
"price_unit": null,
"addons": [],
"url": "https://nordvelo.fr/products/grizl-cf-sl-7",
"image_url": "https://cdn.shopify.com/s/files/grizl-cf-sl-7.jpg",
"status": "active",
"tags": [
"gravel",
"carbone"
],
"options": [
{
"name": "Taille",
"values": [
"S",
"M",
"L"
]
}
],
"variants": [
{
"id": "var_031CQNtmS3W4oi14CtkFvn",
"object": "variant",
"title": "M",
"sku": "GRZ-CF-SL7-M",
"gtin": "4251234567891",
"price": "2499.00",
"compare_at_price": null,
"inventory_quantity": 7,
"options": [
{
"name": "Taille",
"value": "M"
}
]
}
],
"synced_at": "2026-09-21T03:00:12Z",
"livemode": true,
"created": 1790000000,
"updated": 1790003600
}The Write back object
Attributes
idstringUnique identifier of the object (prefixed, opaque).
objectstringwrite_backbrandstringThe brand the object belongs to (
br_…).productstringtaskstringnullablestatusenum- applied → written in the store; reversible until
rollback_until. - rolled_back → the « before » values were written back. - failed → Shopify refused the write, nothing changed at the store.Possible values:
applied·rolled_back·failedchangesarray of objectShow child attributes
fieldenumPossible values:
description_html·seo_title·seo_description·barcodevariant_external_idstringnullablevariant_titlestringnullablebeforestringafterstring
errorstringnullableapplied_atstringnullablerollback_untilstringnullableLast moment a rollback is possible (in the app); NULL once rolled back or failed.
rolled_back_atstringnullablelivemodebooleantruefor live data,falsefor the test-mode sandbox.createdintegerTime at which the object was created (unix timestamp, seconds).
{
"id": "wb_031CQjcAH6UqepovbzUK6t",
"object": "write_back",
"brand": "br_031CQGx2DNM4mxT2CO7BL3",
"product": "prod_031CQNg2fZXIIClKM3I8uF",
"task": "task_031CQg4La2D4FtcCN87OUU",
"status": "applied",
"changes": [
{
"field": "seo_description",
"variant_external_id": null,
"variant_title": null,
"before": "",
"after": "Gravel carbone Shimano GRX 2x12, cadre garanti à vie."
},
{
"field": "barcode",
"variant_external_id": "gid://shopify/ProductVariant/44123456789",
"variant_title": "M",
"before": "",
"after": "4006381333931"
}
],
"error": null,
"applied_at": "2026-09-22T14:05:31Z",
"rollback_until": "2026-10-22T14:05:31Z",
"rolled_back_at": null,
"livemode": true,
"created": 1790085931
}The Product perception object
Attributes
objectstringproduct_perceptionproductstringmarketstringMarket code (ISO country, e.g.
FR).periodstringsheet_versionstringscorestringcountsstringby_modelstringattributesstringlivemodebooleantruefor live data,falsefor the test-mode sandbox.
{
"object": "product_perception",
"product": "prod_034fy4zIfaXW6rtqEz1nHT",
"market": "FR",
"period": "90d",
"sheet_version": "string",
"score": "string",
"counts": "string",
"by_model": "string",
"attributes": "string",
"livemode": true
}Create a product
POST/v1/brands/{brand}/products
Adds a manual product — for stores without a connector. Its vendor
defaults to the brand name.
Parameters
brandstringrequiredBrand id (
br_…).titlestringrequireddescriptionstringnullablecategorystringnullablevendorstringnullableskustringnullablegtinstringnullablepricenumbernullablecurrencystringnullableurlstringnullableimage_urlstringnullablestatusenumPublication status, aligned on Shopify's product statuses so a synced product maps one-to-one.
Possible values:
active·draft·archivedtagsarray of stringnullableprice_periodenumnullableWhat a price buys: a month or a year of a subscription, or the thing once. Shared by the catalogue and by the price an answer states — two prices of different periods are never compared.
Possible values:
month·year·onceprice_annualnumbernullableAlways the amount of one year, whatever the way the site writes it.
price_unitenumnullableWhat a price is counted by: the whole offer, or each user (seat, practitioner, workstation). Shared by the catalogue and by the price an answer states.
Possible values:
flat·per_useraddonsarray of objectnullableShow child attributes
namestringpricenumbernullableNull = on quote.
periodenumnullableWhat a price buys: a month or a year of a subscription, or the thing once. Shared by the catalogue and by the price an answer states — two prices of different periods are never compared.
Possible values:
month·year·onceunitenumnullableWhat a price is counted by: the whole offer, or each user (seat, practitioner, workstation). Shared by the catalogue and by the price an answer states.
Possible values:
flat·per_user
Returns
Returns the created product object. Raises an error if something goes wrong.
curl
curl -X POST https://api.skoup.ai/v1/brands/br_034CyfRFSXUqzrbzV6MAfZ/products \
-H "Authorization: Bearer skoup_test_4eC39HqLyjWDarjtT1zdp7dc" \
-H "Content-Type: application/json" \
-d '{"title":"Grizl CF SL 7","description":"Rewrite the product copy so the frame warranty is stated."}'{
"id": "prod_031CQNg2fZXIIClKM3I8uF",
"object": "product",
"brand": "br_031CQGx2DNM4mxT2CO7BL3",
"source": "shopify",
"read_only": true,
"external_id": "gid://shopify/Product/8123456789012",
"handle": "grizl-cf-sl-7",
"title": "Grizl CF SL 7",
"description": "Gravel carbone, transmission Shimano GRX 2x12.",
"vendor": "Nordvelo",
"category": "Vélos gravel",
"sku": "GRZ-CF-SL7",
"gtin": "4251234567890",
"price": "2499.00",
"currency": "EUR",
"price_period": null,
"price_annual": null,
"price_unit": null,
"addons": [],
"url": "https://nordvelo.fr/products/grizl-cf-sl-7",
"image_url": "https://cdn.shopify.com/s/files/grizl-cf-sl-7.jpg",
"status": "active",
"tags": [
"gravel",
"carbone"
],
"options": [
{
"name": "Taille",
"values": [
"S",
"M",
"L"
]
}
],
"variants": [
{
"id": "var_031CQNtmS3W4oi14CtkFvn",
"object": "variant",
"title": "M",
"sku": "GRZ-CF-SL7-M",
"gtin": "4251234567891",
"price": "2499.00",
"compare_at_price": null,
"inventory_quantity": 7,
"options": [
{
"name": "Taille",
"value": "M"
}
]
}
],
"synced_at": "2026-09-21T03:00:12Z",
"livemode": true,
"created": 1790000000,
"updated": 1790003600
}Update a product
PATCH/v1/brands/{brand}/products/{product}
Only manual products can be updated: a synced product is read-only
(resource_read_only) — fix it in the store, the next sync brings it.
Parameters
brandstringrequiredBrand id (
br_…).productstringrequiredProduct id (
prod_…).titlestringrequireddescriptionstringnullablecategorystringnullablevendorstringnullableskustringnullablegtinstringnullablepricenumbernullablecurrencystringnullableurlstringnullableimage_urlstringnullablestatusenumPublication status, aligned on Shopify's product statuses so a synced product maps one-to-one.
Possible values:
active·draft·archivedtagsarray of stringnullableprice_periodenumnullableWhat a price buys: a month or a year of a subscription, or the thing once. Shared by the catalogue and by the price an answer states — two prices of different periods are never compared.
Possible values:
month·year·onceprice_annualnumbernullableAlways the amount of one year, whatever the way the site writes it.
price_unitenumnullableWhat a price is counted by: the whole offer, or each user (seat, practitioner, workstation). Shared by the catalogue and by the price an answer states.
Possible values:
flat·per_useraddonsarray of objectnullableShow child attributes
namestringpricenumbernullableNull = on quote.
periodenumnullableWhat a price buys: a month or a year of a subscription, or the thing once. Shared by the catalogue and by the price an answer states — two prices of different periods are never compared.
Possible values:
month·year·onceunitenumnullableWhat a price is counted by: the whole offer, or each user (seat, practitioner, workstation). Shared by the catalogue and by the price an answer states.
Possible values:
flat·per_user
Returns
Returns the updated product object. Raises an error if something goes wrong.
curl
curl -X PATCH https://api.skoup.ai/v1/brands/br_034CyfRFSXUqzrbzV6MAfZ/products/prod_034fy4zIfaXW6rtqEz1nHT \
-H "Authorization: Bearer skoup_test_4eC39HqLyjWDarjtT1zdp7dc" \
-H "Content-Type: application/json" \
-d '{"title":"Grizl CF SL 7","description":"Rewrite the product copy so the frame warranty is stated."}'{
"id": "prod_031CQNg2fZXIIClKM3I8uF",
"object": "product",
"brand": "br_031CQGx2DNM4mxT2CO7BL3",
"source": "shopify",
"read_only": true,
"external_id": "gid://shopify/Product/8123456789012",
"handle": "grizl-cf-sl-7",
"title": "Grizl CF SL 7",
"description": "Gravel carbone, transmission Shimano GRX 2x12.",
"vendor": "Nordvelo",
"category": "Vélos gravel",
"sku": "GRZ-CF-SL7",
"gtin": "4251234567890",
"price": "2499.00",
"currency": "EUR",
"price_period": null,
"price_annual": null,
"price_unit": null,
"addons": [],
"url": "https://nordvelo.fr/products/grizl-cf-sl-7",
"image_url": "https://cdn.shopify.com/s/files/grizl-cf-sl-7.jpg",
"status": "active",
"tags": [
"gravel",
"carbone"
],
"options": [
{
"name": "Taille",
"values": [
"S",
"M",
"L"
]
}
],
"variants": [
{
"id": "var_031CQNtmS3W4oi14CtkFvn",
"object": "variant",
"title": "M",
"sku": "GRZ-CF-SL7-M",
"gtin": "4251234567891",
"price": "2499.00",
"compare_at_price": null,
"inventory_quantity": 7,
"options": [
{
"name": "Taille",
"value": "M"
}
]
}
],
"synced_at": "2026-09-21T03:00:12Z",
"livemode": true,
"created": 1790000000,
"updated": 1790003600
}Retrieve a product
GET/v1/brands/{brand}/products/{product}
Parameters
brandstringrequiredBrand id (
br_…).productstringrequiredProduct id (
prod_…).
Returns
Returns the product object. Raises an error if something goes wrong.
curl
curl https://api.skoup.ai/v1/brands/br_034CyfRFSXUqzrbzV6MAfZ/products/prod_034fy4zIfaXW6rtqEz1nHT \
-H "Authorization: Bearer skoup_test_4eC39HqLyjWDarjtT1zdp7dc"{
"id": "prod_031CQNg2fZXIIClKM3I8uF",
"object": "product",
"brand": "br_031CQGx2DNM4mxT2CO7BL3",
"source": "shopify",
"read_only": true,
"external_id": "gid://shopify/Product/8123456789012",
"handle": "grizl-cf-sl-7",
"title": "Grizl CF SL 7",
"description": "Gravel carbone, transmission Shimano GRX 2x12.",
"vendor": "Nordvelo",
"category": "Vélos gravel",
"sku": "GRZ-CF-SL7",
"gtin": "4251234567890",
"price": "2499.00",
"currency": "EUR",
"price_period": null,
"price_annual": null,
"price_unit": null,
"addons": [],
"url": "https://nordvelo.fr/products/grizl-cf-sl-7",
"image_url": "https://cdn.shopify.com/s/files/grizl-cf-sl-7.jpg",
"status": "active",
"tags": [
"gravel",
"carbone"
],
"options": [
{
"name": "Taille",
"values": [
"S",
"M",
"L"
]
}
],
"variants": [
{
"id": "var_031CQNtmS3W4oi14CtkFvn",
"object": "variant",
"title": "M",
"sku": "GRZ-CF-SL7-M",
"gtin": "4251234567891",
"price": "2499.00",
"compare_at_price": null,
"inventory_quantity": 7,
"options": [
{
"name": "Taille",
"value": "M"
}
]
}
],
"synced_at": "2026-09-21T03:00:12Z",
"livemode": true,
"created": 1790000000,
"updated": 1790003600
}List products
GET/v1/brands/{brand}/products
The brand’s catalogue, newest first, variants included.
Parameters
brandstringrequiredBrand id (
br_…).qstringsourcestringstatusstringlimitintegerNumber of objects to return, between 1 and 100 (default 20).
starting_afterstringCursor: the
idof the last object of the previous page.
Returns
A dictionary with a data property holding up to limit product objects, newest first, and has_more telling whether another page exists. Raises an error if something goes wrong.
curl
curl https://api.skoup.ai/v1/brands/br_034CyfRFSXUqzrbzV6MAfZ/products?limit=3 \
-H "Authorization: Bearer skoup_test_4eC39HqLyjWDarjtT1zdp7dc"{
"object": "list",
"url": "/v1/brands/br_034CyfRFSXUqzrbzV6MAfZ/products",
"has_more": false,
"data": [
{
"id": "prod_031CQNg2fZXIIClKM3I8uF",
"object": "product",
"brand": "br_031CQGx2DNM4mxT2CO7BL3",
"source": "shopify",
"read_only": true,
"external_id": "gid://shopify/Product/8123456789012",
"handle": "grizl-cf-sl-7",
"title": "Grizl CF SL 7",
"description": "Gravel carbone, transmission Shimano GRX 2x12.",
"vendor": "Nordvelo",
"category": "Vélos gravel",
"sku": "GRZ-CF-SL7",
"gtin": "4251234567890",
"price": "2499.00",
"currency": "EUR",
"price_period": null,
"price_annual": null,
"price_unit": null,
"addons": [],
"url": "https://nordvelo.fr/products/grizl-cf-sl-7",
"image_url": "https://cdn.shopify.com/s/files/grizl-cf-sl-7.jpg",
"status": "active",
"tags": [
"gravel",
"carbone"
],
"options": [
{
"name": "Taille",
"values": [
"S",
"M",
"L"
]
}
],
"variants": [
{
"id": "var_031CQNtmS3W4oi14CtkFvn",
"object": "variant",
"title": "M",
"sku": "GRZ-CF-SL7-M",
"gtin": "4251234567891",
"price": "2499.00",
"compare_at_price": null,
"inventory_quantity": 7,
"options": [
{
"name": "Taille",
"value": "M"
}
]
}
],
"synced_at": "2026-09-21T03:00:12Z",
"livemode": true,
"created": 1790000000,
"updated": 1790003600
}
]
}List a product’s write-backs
GET/v1/brands/{brand}/products/{product}/write_backs
What Skoup wrote in the store for this product (copy, SEO fields, variant barcodes), field by field with the value it replaced, newest first. Failed attempts are listed too, with their error.
Parameters
brandstringrequiredBrand id (
br_…).productstringrequiredProduct id (
prod_…).limitintegerNumber of objects to return, between 1 and 100 (default 20).
starting_afterstringCursor: the
idof the last object of the previous page.
Returns
A dictionary with a data property holding up to limit write_back objects, newest first, and has_more telling whether another page exists. Raises an error if something goes wrong.
curl
curl https://api.skoup.ai/v1/brands/br_034CyfRFSXUqzrbzV6MAfZ/products/prod_034fy4zIfaXW6rtqEz1nHT/write_backs?limit=3 \
-H "Authorization: Bearer skoup_test_4eC39HqLyjWDarjtT1zdp7dc"{
"object": "list",
"url": "/v1/brands/br_034CyfRFSXUqzrbzV6MAfZ/products/prod_034fy4zIfaXW6rtqEz1nHT/write_backs",
"has_more": false,
"data": [
{
"id": "wb_031CQjcAH6UqepovbzUK6t",
"object": "write_back",
"brand": "br_031CQGx2DNM4mxT2CO7BL3",
"product": "prod_031CQNg2fZXIIClKM3I8uF",
"task": "task_031CQg4La2D4FtcCN87OUU",
"status": "applied",
"changes": [
{
"field": "seo_description",
"variant_external_id": null,
"variant_title": null,
"before": "",
"after": "Gravel carbone Shimano GRX 2x12, cadre garanti à vie."
},
{
"field": "barcode",
"variant_external_id": "gid://shopify/ProductVariant/44123456789",
"variant_title": "M",
"before": "",
"after": "4006381333931"
}
],
"error": null,
"applied_at": "2026-09-22T14:05:31Z",
"rollback_until": "2026-10-22T14:05:31Z",
"rolled_back_at": null,
"livemode": true,
"created": 1790085931
}
]
}Retrieve a product’s perception
GET/v1/brands/{brand}/products/{product}/perception
How AI answers restitute the product’s identity sheet on a market over
a period: verdict counts and score, then each differentiating attribute
(USP) with the share of answers citing it and where to write it when
it does not land. sheet_version is null for a product without an
identity sheet — nothing is judged without one.
Parameters
brandstringrequiredBrand id (
br_…).productstringrequiredProduct id (
prod_…).
Returns
Returns the product_perception object. Raises an error if something goes wrong.
curl
curl https://api.skoup.ai/v1/brands/br_034CyfRFSXUqzrbzV6MAfZ/products/prod_034fy4zIfaXW6rtqEz1nHT/perception \
-H "Authorization: Bearer skoup_test_4eC39HqLyjWDarjtT1zdp7dc"{
"object": "product_perception",
"product": "prod_034fy4zIfaXW6rtqEz1nHT",
"market": "FR",
"period": "90d",
"sheet_version": "string",
"score": "string",
"counts": "string",
"by_model": "string",
"attributes": "string",
"livemode": true
}