Produits
Gardez le catalogue de votre boutique dans Emailit pour les grilles de produits, les recommandations et les articles des commandes.
Créer ou mettre à jour un produit
Ajoute un produit à votre catalogue, ou le met à jour si un produit avec le même id existe déjà. L’id est l’ID du produit dans votre boutique : vous pouvez donc renvoyer le même produit chaque fois qu’il change. Nécessite une clé API avec la portée full ou events. Avec une clé events, la réponse ne contient que object, id et external_id.
id est toujours obligatoire, et title est obligatoire pour un nouveau produit. Les champs ne sont écrits que si vous les envoyez : un produit renvoyé avec seulement un nouveau prix garde son titre, ses catégories, son image et le reste. Pour envoyer de nombreux produits à la fois, utilisez Créer ou mettre à jour des produits par lots.
Les grilles de produits, les recommandations et les articles des commandes dans les e-mails puisent dans le catalogue. Consultez Produits, coupons et panier.
/productsCorps de la requête
idstring | numberObligatoireL’ID du produit dans votre boutique, 255 caractères au maximum. Les nombres sont enregistrés comme des chaînes. Enregistré dans external_id. Vous pouvez aussi l’envoyer sous le nom external_id.
titlestringNom du produit, 500 caractères au maximum. Vous pouvez aussi l’envoyer sous le nom name. Obligatoire pour un nouveau produit.
skustringRéférence de stock (SKU), 255 caractères au maximum.
descriptionstringDescription du produit, 10 000 caractères au maximum.
urlstringPage du produit dans votre boutique. Une URL http ou https, 2 048 caractères au maximum.
image_urlstringImage du produit. Une URL http ou https, 2 048 caractères au maximum.
pricenumber | stringPrix actuel, sous forme de nombre ou de chaîne numérique comme "89.00". Ne peut pas être négatif. Enregistré avec 4 décimales au maximum.
compare_at_pricenumber | stringPrix avant réduction, au même format que price. Quand il est supérieur à price, le produit est considéré comme en promotion.
currencystringCode ISO 4217 à trois lettres, comme USD ou EUR. Les minuscules sont acceptées. Les e-mails formatent les prix du produit dans cette devise, ou en USD si elle n’est pas définie.
categoriesstring[]50 noms de catégorie au maximum, de 191 caractères chacun au maximum. Les doublons sont supprimés.
brandstringNom de la marque, 191 caractères au maximum.
inventory_quantityinteger | nullUnités en stock. null signifie que vous ne suivez pas le stock. Les grilles de produits des e-mails excluent les produits à 0.
statusstringactive ou archived. Les nouveaux produits sont active. Les produits archivés sont masqués par défaut dans Lister les produits et exclus des grilles de produits.
metadataobjectVos propres données clé-valeur, 16 Ko au maximum en JSON. Envoyer metadata remplace l’objet enregistré.
Réponse
Renvoie 201 Created avec l’objet produit quand le produit est nouveau, ou 200 OK quand un produit existant a été mis à jour. Renvoie 422 quand un champ n’est pas valide.
{
"object": "product",
"id": "prd_3r6HHUGUSl8yjYDscEA6aYA8wrA",
"external_id": "8123456789",
"sku": "TRS-BLU-42",
"title": "Trail running shoe",
"description": null,
"url": "https://shop.example.com/products/trail-running-shoe",
"image_url": "https://shop.example.com/images/trail-running-shoe.jpg",
"price": 89,
"compare_at_price": 119,
"currency": "USD",
"categories": [
"Shoes",
"Running"
],
"brand": "Acme Outdoors",
"inventory_quantity": 34,
"status": "active",
"metadata": {},
"created_at": "2026-10-08T14:21:07.512Z",
"updated_at": "2026-10-08T14:21:07.512Z"
}{
"message": "Validation failed. price: must not be negative",
"errors": {
"price": [
"must not be negative"
]
}
}Récupérer un produit
Récupère un produit par son ID Emailit ou par l’ID du produit dans votre boutique. Nécessite une clé API avec la portée full.
/products/{id}Paramètres de chemin
idstringObligatoireL’ID du produit (prd_...) ou l’ID du produit dans votre boutique (external_id). Encodez pour l’URL les ID de boutique qui contiennent des caractères spéciaux.
L’objet produit
objectstringToujours product.
idstringID du produit dans Emailit (prd_...).
external_idstringL’ID du produit dans votre boutique : l’id que vous avez envoyé. Les articles des commandes et des paniers désignent les produits par cet ID.
skustring | nullRéférence de stock (SKU).
titlestringNom du produit.
descriptionstring | nullDescription du produit.
urlstring | nullPage du produit dans votre boutique.
image_urlstring | nullImage du produit.
pricenumber | nullPrix actuel.
compare_at_pricenumber | nullPrix avant réduction. Un produit est en promotion quand compare_at_price est supérieur à price.
currencystring | nullCode ISO 4217 à trois lettres des prix.
categoriesstring[]Noms des catégories.
brandstring | nullNom de la marque.
inventory_quantityinteger | nullUnités en stock. null signifie que le stock n’est pas suivi. Les grilles de produits des e-mails excluent les produits à 0.
statusstringactive ou archived. Les grilles de produits des e-mails excluent les produits archivés.
metadataobjectVos propres données clé-valeur.
created_atstringDate d’ajout du produit, au format ISO 8601 UTC.
updated_atstringDate de la dernière modification du produit, au format ISO 8601 UTC.
{
"object": "product",
"id": "prd_3r6HHUGUSl8yjYDscEA6aYA8wrA",
"external_id": "8123456789",
"sku": "TRS-BLU-42",
"title": "Trail running shoe",
"description": "Lightweight shoe with a grippy sole for wet trails.",
"url": "https://shop.example.com/products/trail-running-shoe",
"image_url": "https://shop.example.com/images/trail-running-shoe.jpg",
"price": 89,
"compare_at_price": 119,
"currency": "USD",
"categories": [
"Shoes",
"Running"
],
"brand": "Acme Outdoors",
"inventory_quantity": 34,
"status": "active",
"metadata": {
"color": "blue"
},
"created_at": "2026-10-02T08:15:22.418Z",
"updated_at": "2026-10-08T14:21:07.512Z"
}{
"error": "Product not found",
"message": "Product not found."
}Mettre à jour un produit
Met à jour un produit qui est déjà dans votre catalogue. Seuls les champs envoyés changent. L’ID du produit dans votre boutique ne peut pas changer : un id dans le corps est ignoré. Nécessite une clé API avec la portée full ou events. Avec une clé events, la réponse ne contient que object, id et external_id.
Pour créer des produits et les mettre à jour avec le même appel, utilisez Créer ou mettre à jour un produit.
/products/{id}Paramètres de chemin
idstringObligatoireL’ID du produit (prd_...) ou l’ID du produit dans votre boutique.
Corps de la requête
N’importe lequel des champs de Créer ou mettre à jour un produit sauf id : title, sku, description, url, image_url, price, compare_at_price, currency, categories, brand, inventory_quantity, status et metadata. Les mêmes règles s’appliquent. categories et metadata sont remplacés en entier.
Réponse
Renvoie 200 OK avec l’objet produit mis à jour. Renvoie 404 si aucun produit ne correspond à id et 422 quand un champ n’est pas valide.
{
"object": "product",
"id": "prd_3r6HHUGUSl8yjYDscEA6aYA8wrA",
"external_id": "8123456789",
"sku": "TRS-BLU-42",
"title": "Trail running shoe",
"description": "Lightweight shoe with a grippy sole for wet trails.",
"url": "https://shop.example.com/products/trail-running-shoe",
"image_url": "https://shop.example.com/images/trail-running-shoe.jpg",
"price": 79,
"compare_at_price": 119,
"currency": "USD",
"categories": [
"Shoes",
"Running"
],
"brand": "Acme Outdoors",
"inventory_quantity": 20,
"status": "active",
"metadata": {
"color": "blue"
},
"created_at": "2026-10-02T08:15:22.418Z",
"updated_at": "2026-10-09T10:02:41.205Z"
}{
"error": "Product not found",
"message": "Product not found."
}{
"message": "Validation failed. image_url: must be an http(s) URL",
"errors": {
"image_url": [
"must be an http(s) URL"
]
}
}Lister les produits
Liste les produits de votre catalogue, du plus récent au plus ancien. Sans status, seuls les produits actifs sont listés. Nécessite une clé API avec la portée full.
/productsParamètres de requête
pageintegerNuméro de page pour la pagination (minimum : 1, par défaut : 1).
limitintegerNombre de produits à renvoyer (minimum : 1, maximum : 100, par défaut : 25).
searchstringCorrespondance insensible à la casse sur le titre, l’ID du produit dans votre boutique (external_id) ou le SKU.
categorystringUniquement les produits de cette catégorie. Le nom doit correspondre exactement, casse comprise.
statusstringactive (par défaut), archived ou all. Utilisez all quand vous filtrez sur la clé status ci-dessous, car la valeur par défaut limite déjà la liste aux produits actifs.
idsstringListe de 100 ID de produit au maximum, séparés par des virgules. Chacun peut être l’ID Emailit (prd_...) ou l’ID du produit dans votre boutique.
matchstringall (par défaut) exige que chaque filtre key.condition corresponde. or accepte n’importe lequel d’entre eux. Consultez Filtrage et tri.
sortstringClé de tri : created_at (par défaut), updated_at, title ou price.
orderstringSens du tri : asc ou desc (par défaut).
Filtres
Les filtres de liste sont des paramètres de requête key.condition=value sur un seul niveau. Consultez Filtrage et tri pour match, order, direction et la liste des conditions par type.
Clés de filtre
| Clé | Type | Conditions | Remarques |
|---|---|---|---|
title | string | exact, not_exact, contains, not_contains, starts_with, ends_with, empty, not_empty | |
external_id | string | exact, not_exact, contains, not_contains, starts_with, ends_with, empty, not_empty | |
sku | string | exact, not_exact, contains, not_contains, starts_with, ends_with, empty, not_empty | |
brand | string | exact, not_exact, contains, not_contains, starts_with, ends_with, empty, not_empty | |
currency | string | exact, not_exact, contains, not_contains, starts_with, ends_with, empty, not_empty | |
price | number | exact, not_exact, gt, gte, lt, lte, empty, not_empty | |
inventory_quantity | number | exact, not_exact, gt, gte, lt, lte, empty, not_empty | |
status | enum | exact, not_exact | Valeurs : active, archived |
created_at | date | exact, before, after, empty, not_empty | |
updated_at | date | exact, before, after, empty, not_empty |
Clés de tri
Cet endpoint trie avec sort défini sur l’une de ces clés et order sur asc ou desc (order=<key> renvoie 400 ici) : created_at, updated_at, title, price
Sur cet endpoint, order n’accepte que asc ou desc. Transmettez la clé de tri dans sort, par exemple sort=price&order=asc.
Réponse
Renvoie une page d’objets produit dans data, avec total_records, next_page_url et previous_page_url. Les URL de page ne contiennent que page et limit : ajoutez de nouveau votre recherche et vos filtres quand vous les suivez.
{
"data": [
{
"object": "product",
"id": "prd_3r6HHUGUSl8yjYDscEA6aYA8wrA",
"external_id": "8123456789",
"sku": "TRS-BLU-42",
"title": "Trail running shoe",
"description": "Lightweight shoe with a grippy sole for wet trails.",
"url": "https://shop.example.com/products/trail-running-shoe",
"image_url": "https://shop.example.com/images/trail-running-shoe.jpg",
"price": 89,
"compare_at_price": 119,
"currency": "USD",
"categories": [
"Shoes",
"Running"
],
"brand": "Acme Outdoors",
"inventory_quantity": 34,
"status": "active",
"metadata": {
"color": "blue"
},
"created_at": "2026-10-02T08:15:22.418Z",
"updated_at": "2026-10-08T14:21:07.512Z"
}
],
"total_records": 1,
"next_page_url": null,
"previous_page_url": null
}Créer ou mettre à jour des produits par lots
Envoie jusqu’à 1 000 produits en une requête, par exemple pour importer votre catalogue ou le synchroniser à intervalles réguliers. Chaque produit suit les règles de Créer ou mettre à jour un produit : il est créé ou mis à jour selon son id, un nouveau produit a besoin d’un title, et les champs ne sont écrits que si vous les envoyez. Nécessite une clé API avec la portée full ou events. Avec une clé events, la réponse ne contient que object, id et external_id.
Les produits non valides sont ignorés et listés dans rejected ; les autres sont enregistrés. La requête renvoie tout de même 200.
/products/batchCorps de la requête
productsobject[]ObligatoireDe 1 à 1 000 produits, chacun avec les champs de Créer ou mettre à jour un produit.
Réponse
createdintegerNombre de nouveaux produits.
updatedintegerNombre de produits existants qui ont été mis à jour.
rejectedobject[]Les produits qui n’ont pas été enregistrés. Chaque élément contient l’index du produit dans votre tableau products et errors, dont les clés sont des chemins de champ comme products.3.price.
Renvoie 422 si products est vide ou contient plus de 1 000 éléments.
{
"created": 1,
"updated": 1,
"rejected": [
{
"index": 2,
"errors": {
"products.2.title": [
"is required"
]
}
}
]
}{
"message": "Validation failed. products: Send 1 to 1000 products.",
"errors": {
"products": [
"Send 1 to 1000 products."
]
}
}Lister les catégories de produits
Liste les catégories utilisées par les produits actifs, par ordre alphabétique, avec le nombre de produits actifs dans chacune. Les produits archivés ne sont pas comptés. Renvoie 1 000 catégories au maximum, sans pagination. Nécessite une clé API avec la portée full.
Les catégories proviennent des categories de chaque produit. Utilisez un nom de catégorie avec le paramètre category de Lister les produits.
/products/categories{
"data": [
{
"name": "Accessories",
"products": 18
},
{
"name": "Running",
"products": 12
},
{
"name": "Shoes",
"products": 27
}
]
}Supprimer un produit
Retire un produit de votre catalogue. Les commandes qui le contiennent gardent leurs articles, qui conservent leur propre titre, leur prix et l’ID du produit. Pour masquer un produit sans le supprimer, passez plutôt son status à archived. Nécessite une clé API avec la portée full.
Si le script de suivi signale la consultation d’un produit supprimé avec son titre, le produit est de nouveau ajouté au catalogue à partir des données de la page.
/products/{id}Paramètres de chemin
idstringObligatoireL’ID du produit (prd_...) ou l’ID du produit dans votre boutique.
{
"object": "product",
"id": "prd_3r6HHUGUSl8yjYDscEA6aYA8wrA",
"deleted": true
}{
"error": "Product not found",
"message": "Product not found."
}