Products
Events associés : product.created · product.deleted · product.updated · write_back.applied · write_back.rolled_back
L’objet Product
Attributs
idstringIdentifiant unique de l'objet (préfixé, opaque).
objectstringproductbrandstringLa marque à laquelle l'objet appartient (
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.Valeurs possibles :
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.
Valeurs possibles :
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.
Valeurs possibles :
flat·per_useraddonsarray of objectAfficher les attributs enfants
namestringpricenumbernullableperiodenumnullableValeurs possibles :
month·year·onceunitenumnullableValeurs possibles :
flat·per_user
urlstringnullableimage_urlstringnullablestatusenumPublication status, aligned on Shopify's product statuses so a synced product maps one-to-one.
Valeurs possibles :
active·draft·archivedtagsarray of stringoptionsarray of objectAfficher les attributs enfants
namestringvaluesarray of string
variantsarray of variantsAfficher les attributs enfants
idstringIdentifiant unique de l'objet (préfixé, opaque).
objectstringvarianttitlestringskustringnullablegtinstringnullablepricestringnullablecompare_at_pricestringnullableinventory_quantityintegernullableoptionsarray of objectAfficher les attributs enfants
namestringvaluestring
synced_atstringnullablelivemodebooleantruepour les données réelles,falsepour le bac à sable du mode test.createdintegerTime at which the object was created (unix timestamp, seconds).
updatedstringDate de dernière mise à jour de l'objet.
{
"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
}L’objet Write back
Attributs
idstringIdentifiant unique de l'objet (préfixé, opaque).
objectstringwrite_backbrandstringLa marque à laquelle l'objet appartient (
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.Valeurs possibles :
applied·rolled_back·failedchangesarray of objectAfficher les attributs enfants
fieldenumValeurs possibles :
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_atstringnullablelivemodebooleantruepour les données réelles,falsepour le bac à sable du mode test.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
}L’objet Product perception
Attributs
objectstringproduct_perceptionproductstringmarketstringCode du marché (pays ISO, par ex.
FR).periodstringsheet_versionstringscorestringcountsstringby_modelstringattributesstringlivemodebooleantruepour les données réelles,falsepour le bac à sable du mode test.
{
"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.
Paramètres
brandstringobligatoireBrand id (
br_…).titlestringobligatoiredescriptionstringnullablecategorystringnullablevendorstringnullableskustringnullablegtinstringnullablepricenumbernullablecurrencystringnullableurlstringnullableimage_urlstringnullablestatusenumPublication status, aligned on Shopify's product statuses so a synced product maps one-to-one.
Valeurs possibles :
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.
Valeurs possibles :
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.
Valeurs possibles :
flat·per_useraddonsarray of objectnullableAfficher les attributs enfants
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.
Valeurs possibles :
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.
Valeurs possibles :
flat·per_user
Retour
Renvoie l’objet product créé. Lève une erreur en cas de problème.
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.
Paramètres
brandstringobligatoireBrand id (
br_…).productstringobligatoireProduct id (
prod_…).titlestringobligatoiredescriptionstringnullablecategorystringnullablevendorstringnullableskustringnullablegtinstringnullablepricenumbernullablecurrencystringnullableurlstringnullableimage_urlstringnullablestatusenumPublication status, aligned on Shopify's product statuses so a synced product maps one-to-one.
Valeurs possibles :
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.
Valeurs possibles :
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.
Valeurs possibles :
flat·per_useraddonsarray of objectnullableAfficher les attributs enfants
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.
Valeurs possibles :
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.
Valeurs possibles :
flat·per_user
Retour
Renvoie l’objet product mis à jour. Lève une erreur en cas de problème.
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}
Paramètres
brandstringobligatoireBrand id (
br_…).productstringobligatoireProduct id (
prod_…).
Retour
Renvoie l’objet product. Lève une erreur en cas de problème.
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.
Paramètres
brandstringobligatoireBrand id (
br_…).qstringsourcestringstatusstringlimitintegerNombre d'objets à renvoyer, entre 1 et 100 (20 par défaut).
starting_afterstringCurseur : l'
iddu dernier objet de la page précédente.
Retour
Un dictionnaire dont la propriété data contient jusqu’à limit objets product, du plus récent au plus ancien, et has_more indique s’il reste une page. Lève une erreur en cas de problème.
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.
Paramètres
brandstringobligatoireBrand id (
br_…).productstringobligatoireProduct id (
prod_…).limitintegerNombre d'objets à renvoyer, entre 1 et 100 (20 par défaut).
starting_afterstringCurseur : l'
iddu dernier objet de la page précédente.
Retour
Un dictionnaire dont la propriété data contient jusqu’à limit objets write_back, du plus récent au plus ancien, et has_more indique s’il reste une page. Lève une erreur en cas de problème.
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.
Paramètres
brandstringobligatoireBrand id (
br_…).productstringobligatoireProduct id (
prod_…).
Retour
Renvoie l’objet product_perception. Lève une erreur en cas de problème.
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
}