Skip to Content

Products

L’objet Product

Attributs

  • idstring

    Identifiant unique de l'objet (préfixé, opaque).

  • objectstring

    product

  • brandstring

    La marque à laquelle l'objet appartient (br_…).

  • sourceenum

    Where 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 · site

  • read_onlyboolean
  • external_idstringnullable

    Identifier at the source (e.g. a Shopify GID), null for manual products.

  • handlestringnullable
  • titlestring
  • descriptionstringnullable
  • vendorstringnullable
  • categorystringnullable
  • skustringnullable
  • gtinstringnullable
  • pricestringnullable

    Decimal string, e.g. "1299.00".

  • currencystringnullable
  • price_periodenumnullable

    What 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 · once

  • price_annualstringnullable

    Always the amount of one year, decimal string.

  • price_unitenumnullable

    What 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

  • addonsarray of object
    Afficher les attributs enfants
    • namestring
    • pricenumbernullable
    • periodenumnullable

      Valeurs possibles : month · year · once

    • unitenumnullable

      Valeurs possibles : flat · per_user

  • urlstringnullable
  • image_urlstringnullable
  • statusenum

    Publication status, aligned on Shopify's product statuses so a synced product maps one-to-one.

    Valeurs possibles : active · draft · archived

  • tagsarray of string
  • optionsarray of object
    Afficher les attributs enfants
    • namestring
    • valuesarray of string
  • variantsarray of variants
    Afficher les attributs enfants
    • idstring

      Identifiant unique de l'objet (préfixé, opaque).

    • objectstring

      variant

    • titlestring
    • skustringnullable
    • gtinstringnullable
    • pricestringnullable
    • compare_at_pricestringnullable
    • inventory_quantityintegernullable
    • optionsarray of object
      Afficher les attributs enfants
      • namestring
      • valuestring
  • synced_atstringnullable
  • livemodeboolean

    true pour les données réelles, false pour le bac à sable du mode test.

  • createdinteger

    Time at which the object was created (unix timestamp, seconds).

  • updatedstring

    Date de dernière mise à jour de l'objet.

L'objet Product
{ "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

  • idstring

    Identifiant unique de l'objet (préfixé, opaque).

  • objectstring

    write_back

  • brandstring

    La marque à laquelle l'objet appartient (br_…).

  • productstring
  • taskstringnullable
  • statusenum

    - 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 · failed

  • changesarray of object
    Afficher les attributs enfants
    • fieldenum

      Valeurs possibles : description_html · seo_title · seo_description · barcode

    • variant_external_idstringnullable
    • variant_titlestringnullable
    • beforestring
    • afterstring
  • errorstringnullable
  • applied_atstringnullable
  • rollback_untilstringnullable

    Last moment a rollback is possible (in the app); NULL once rolled back or failed.

  • rolled_back_atstringnullable
  • livemodeboolean

    true pour les données réelles, false pour le bac à sable du mode test.

  • createdinteger

    Time at which the object was created (unix timestamp, seconds).

L'objet Write back
{ "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

  • objectstring

    product_perception

  • productstring
  • marketstring

    Code du marché (pays ISO, par ex. FR).

  • periodstring
  • sheet_versionstring
  • scorestring
  • countsstring
  • by_modelstring
  • attributesstring
  • livemodeboolean

    true pour les données réelles, false pour le bac à sable du mode test.

L'objet Product perception
{ "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

  • brandstringobligatoire

    Brand id (br_…).

  • titlestringobligatoire
  • descriptionstringnullable
  • categorystringnullable
  • vendorstringnullable
  • skustringnullable
  • gtinstringnullable
  • pricenumbernullable
  • currencystringnullable
  • urlstringnullable
  • image_urlstringnullable
  • statusenum

    Publication status, aligned on Shopify's product statuses so a synced product maps one-to-one.

    Valeurs possibles : active · draft · archived

  • tagsarray of stringnullable
  • price_periodenumnullable

    What 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 · once

  • price_annualnumbernullable

    Always the amount of one year, whatever the way the site writes it.

  • price_unitenumnullable

    What 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

  • addonsarray of objectnullable
    Afficher les attributs enfants
    • namestring
    • pricenumbernullable

      Null = on quote.

    • periodenumnullable

      What 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 · once

    • unitenumnullable

      What 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 -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."}'
Réponse
{ "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

  • brandstringobligatoire

    Brand id (br_…).

  • productstringobligatoire

    Product id (prod_…).

  • titlestringobligatoire
  • descriptionstringnullable
  • categorystringnullable
  • vendorstringnullable
  • skustringnullable
  • gtinstringnullable
  • pricenumbernullable
  • currencystringnullable
  • urlstringnullable
  • image_urlstringnullable
  • statusenum

    Publication status, aligned on Shopify's product statuses so a synced product maps one-to-one.

    Valeurs possibles : active · draft · archived

  • tagsarray of stringnullable
  • price_periodenumnullable

    What 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 · once

  • price_annualnumbernullable

    Always the amount of one year, whatever the way the site writes it.

  • price_unitenumnullable

    What 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

  • addonsarray of objectnullable
    Afficher les attributs enfants
    • namestring
    • pricenumbernullable

      Null = on quote.

    • periodenumnullable

      What 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 · once

    • unitenumnullable

      What 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 -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."}'
Réponse
{ "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

  • brandstringobligatoire

    Brand id (br_…).

  • productstringobligatoire

    Product id (prod_…).

Retour

Renvoie l’objet product. Lève une erreur en cas de problème.

curl https://api.skoup.ai/v1/brands/br_034CyfRFSXUqzrbzV6MAfZ/products/prod_034fy4zIfaXW6rtqEz1nHT \ -H "Authorization: Bearer skoup_test_4eC39HqLyjWDarjtT1zdp7dc"
Réponse
{ "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

  • brandstringobligatoire

    Brand id (br_…).

  • qstring
  • sourcestring
  • statusstring
  • limitinteger

    Nombre d'objets à renvoyer, entre 1 et 100 (20 par défaut).

  • starting_afterstring

    Curseur : l'id du 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 https://api.skoup.ai/v1/brands/br_034CyfRFSXUqzrbzV6MAfZ/products?limit=3 \ -H "Authorization: Bearer skoup_test_4eC39HqLyjWDarjtT1zdp7dc"
Réponse
{ "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

  • brandstringobligatoire

    Brand id (br_…).

  • productstringobligatoire

    Product id (prod_…).

  • limitinteger

    Nombre d'objets à renvoyer, entre 1 et 100 (20 par défaut).

  • starting_afterstring

    Curseur : l'id du 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 https://api.skoup.ai/v1/brands/br_034CyfRFSXUqzrbzV6MAfZ/products/prod_034fy4zIfaXW6rtqEz1nHT/write_backs?limit=3 \ -H "Authorization: Bearer skoup_test_4eC39HqLyjWDarjtT1zdp7dc"
Réponse
{ "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

  • brandstringobligatoire

    Brand id (br_…).

  • productstringobligatoire

    Product id (prod_…).

Retour

Renvoie l’objet product_perception. Lève une erreur en cas de problème.

curl https://api.skoup.ai/v1/brands/br_034CyfRFSXUqzrbzV6MAfZ/products/prod_034fy4zIfaXW6rtqEz1nHT/perception \ -H "Authorization: Bearer skoup_test_4eC39HqLyjWDarjtT1zdp7dc"
Réponse
{ "object": "product_perception", "product": "prod_034fy4zIfaXW6rtqEz1nHT", "market": "FR", "period": "90d", "sheet_version": "string", "score": "string", "counts": "string", "by_model": "string", "attributes": "string", "livemode": true }
Last updated on