# Produits API

> Gardez le catalogue de votre boutique dans Emailit pour les grilles de produits, les recommandations et les articles des commandes.

URL de base : `https://api.emailit.com/v2`. Authentifiez-vous avec `Authorization: Bearer <API key>`.

## Créer ou mettre à jour un produit — POST /products

> Ajoutez un produit à votre catalogue, ou mettez-le à jour, en l’identifiant par l’ID du produit dans votre boutique. Alpha : réservé à l’équipe Emailit.

# 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`.

> **Commerce est en alpha:** Commerce est réservé à l’équipe Emailit pendant que nous le testons. Les autres requêtes renvoient `403` avec `error: "commerce_alpha"`. Les clés API ne fonctionnent que dans les espaces de travail qui appartiennent à l’équipe Emailit. Consultez [Qui peut utiliser Commerce](/fr/docs/commerce/#who-can-use-commerce).

`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](/fr/docs/api-reference/products/batch/).

Les grilles de produits, les recommandations et les articles des commandes dans les e-mails puisent dans le catalogue. Consultez [Produits, coupons et panier](/fr/docs/campaigns/products-and-coupons/).

`POST /products`

## Corps de la requête

- `id` (string | number, obligatoire): L’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`.

- `title` (string): Nom du produit, 500 caractères au maximum. Vous pouvez aussi l’envoyer sous le nom `name`. Obligatoire pour un nouveau produit.

- `sku` (string): Référence de stock (SKU), 255 caractères au maximum.

- `description` (string): Description du produit, 10 000 caractères au maximum.

- `url` (string): Page du produit dans votre boutique. Une URL `http` ou `https`, 2 048 caractères au maximum.

- `image_url` (string): Image du produit. Une URL `http` ou `https`, 2 048 caractères au maximum.

- `price` (number | string): Prix 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_price` (number | string): Prix avant réduction, au même format que `price`. Quand il est supérieur à `price`, le produit est considéré comme en promotion.

- `currency` (string): Code 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.

- `categories` (string[]): 50 noms de catégorie au maximum, de 191 caractères chacun au maximum. Les doublons sont supprimés.

- `brand` (string): Nom de la marque, 191 caractères au maximum.

- `inventory_quantity` (integer | null): Unités en stock. `null` signifie que vous ne suivez pas le stock. Les grilles de produits des e-mails excluent les produits à `0`.

- `status` (string): `active` ou `archived`. Les nouveaux produits sont `active`. Les produits archivés sont masqués par défaut dans [Lister les produits](/fr/docs/api-reference/products/list/) et exclus des grilles de produits.

- `metadata` (object): Vos 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](/fr/docs/api-reference/products/get/) 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.
**Requête** `POST /products`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/products \
  -H "Authorization: Bearer your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "8123456789",
    "title": "Trail running shoe",
    "sku": "TRS-BLU-42",
    "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
  }'
```

**201**

```json
{
  "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"
}
```

**422**

```json
{
  "message": "Validation failed. price: must not be negative",
  "errors": {
    "price": [
      "must not be negative"
    ]
  }
}
```

---
Source: https://emailit.com/fr/docs/api-reference/products/create/

## Récupérer un produit — GET /products/{id}

> Récupérez un produit de votre catalogue par son ID Emailit ou par l’ID du produit dans votre boutique. Alpha : réservé à l’équipe Emailit.

# 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`.

> **Commerce est en alpha:** Commerce est réservé à l’équipe Emailit pendant que nous le testons. Les autres requêtes renvoient `403` avec `error: "commerce_alpha"`. Les clés API ne fonctionnent que dans les espaces de travail qui appartiennent à l’équipe Emailit. Consultez [Qui peut utiliser Commerce](/fr/docs/commerce/#who-can-use-commerce).

`GET /products/{id}`

## Paramètres de chemin

- `id` (string, obligatoire): L’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

- `object` (string): Toujours `product`.

- `id` (string): ID du produit dans Emailit (`prd_...`).

- `external_id` (string): L’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.

- `sku` (string | null): Référence de stock (SKU).

- `title` (string): Nom du produit.

- `description` (string | null): Description du produit.

- `url` (string | null): Page du produit dans votre boutique.

- `image_url` (string | null): Image du produit.

- `price` (number | null): Prix actuel.

- `compare_at_price` (number | null): Prix avant réduction. Un produit est en promotion quand `compare_at_price` est supérieur à `price`.

- `currency` (string | null): Code ISO 4217 à trois lettres des prix.

- `categories` (string[]): Noms des catégories.

- `brand` (string | null): Nom de la marque.

- `inventory_quantity` (integer | null): Unités en stock. `null` signifie que le stock n’est pas suivi. Les grilles de produits des e-mails excluent les produits à `0`.

- `status` (string): `active` ou `archived`. Les grilles de produits des e-mails excluent les produits archivés.

- `metadata` (object): Vos propres données clé-valeur.

- `created_at` (string): Date d’ajout du produit, au format ISO 8601 UTC.

- `updated_at` (string): Date de la dernière modification du produit, au format ISO 8601 UTC.

**Requête** `GET /products/{id}`

**cURL**

```bash
curl https://api.emailit.com/v2/products/prd_3r6HHUGUSl8yjYDscEA6aYA8wrA \
  -H "Authorization: Bearer your_api_key"
```

**200**

```json
{
  "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"
}
```

**404**

```json
{
  "error": "Product not found",
  "message": "Product not found."
}
```

---
Source: https://emailit.com/fr/docs/api-reference/products/get/

## Mettre à jour un produit — POST /products/{id}

> Modifiez certains champs d’un produit de votre catalogue. Alpha : réservé à l’équipe Emailit.

# 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`.

> **Commerce est en alpha:** Commerce est réservé à l’équipe Emailit pendant que nous le testons. Les autres requêtes renvoient `403` avec `error: "commerce_alpha"`. Les clés API ne fonctionnent que dans les espaces de travail qui appartiennent à l’équipe Emailit. Consultez [Qui peut utiliser Commerce](/fr/docs/commerce/#who-can-use-commerce).

Pour créer des produits et les mettre à jour avec le même appel, utilisez [Créer ou mettre à jour un produit](/fr/docs/api-reference/products/create/).

`POST /products/{id}`

## Paramètres de chemin

- `id` (string, obligatoire): L’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](/fr/docs/api-reference/products/create/) 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](/fr/docs/api-reference/products/get/) mis à jour. Renvoie `404` si aucun produit ne correspond à `id` et `422` quand un champ n’est pas valide.
**Requête** `POST /products/{id}`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/products/8123456789 \
  -H "Authorization: Bearer your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "price": 79, "inventory_quantity": 20 }'
```

**200**

```json
{
  "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"
}
```

**404**

```json
{
  "error": "Product not found",
  "message": "Product not found."
}
```

**422**

```json
{
  "message": "Validation failed. image_url: must be an http(s) URL",
  "errors": {
    "image_url": [
      "must be an http(s) URL"
    ]
  }
}
```

---
Source: https://emailit.com/fr/docs/api-reference/products/update/

## Lister les produits — GET /products

> Listez les produits de votre catalogue, du plus récent au plus ancien, avec des filtres de recherche, de catégorie et de statut. Alpha : réservé à l’équipe Emailit.

# 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`.

> **Commerce est en alpha:** Commerce est réservé à l’équipe Emailit pendant que nous le testons. Les autres requêtes renvoient `403` avec `error: "commerce_alpha"`. Les clés API ne fonctionnent que dans les espaces de travail qui appartiennent à l’équipe Emailit. Consultez [Qui peut utiliser Commerce](/fr/docs/commerce/#who-can-use-commerce).

`GET /products`

## Paramètres de requête

- `page` (integer): Numéro de page pour la pagination (minimum : 1, par défaut : 1).

- `limit` (integer): Nombre de produits à renvoyer (minimum : 1, maximum : 100, par défaut : 25).

- `search` (string): Correspondance insensible à la casse sur le titre, l’ID du produit dans votre boutique (`external_id`) ou le SKU.

- `category` (string): Uniquement les produits de cette catégorie. Le nom doit correspondre exactement, casse comprise.

- `status` (string): `active` (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.

- `ids` (string): Liste 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.

- `match` (string): `all` (par défaut) exige que chaque filtre `key.condition` corresponde. `or` accepte n’importe lequel d’entre eux. Consultez [Filtrage et tri](/fr/docs/api-reference/filtering/).

- `sort` (string): Clé de tri : `created_at` (par défaut), `updated_at`, `title` ou `price`.

- `order` (string): Sens du tri : `asc` ou `desc` (par défaut).

## Filtres

Clés de filtre et de tri : voir [Filtrage et tri](https://emailit.com/fr/docs/api-reference/filtering/).

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](/fr/docs/api-reference/products/get/) 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.
**Requête** `GET /products`

**cURL**

```bash
curl "https://api.emailit.com/v2/products?category=Running&sort=price&order=asc&limit=25" \
  -H "Authorization: Bearer your_api_key"
```

**200**

```json
{
  "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
}
```

---
Source: https://emailit.com/fr/docs/api-reference/products/list/

## Créer ou mettre à jour des produits par lots — POST /products/batch

> Envoyez jusqu’à 1 000 produits en une requête. Chacun est créé ou mis à jour selon l’ID du produit dans votre boutique. Alpha : réservé à l’équipe Emailit.

# 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](/fr/docs/api-reference/products/create/) : 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`.

> **Commerce est en alpha:** Commerce est réservé à l’équipe Emailit pendant que nous le testons. Les autres requêtes renvoient `403` avec `error: "commerce_alpha"`. Les clés API ne fonctionnent que dans les espaces de travail qui appartiennent à l’équipe Emailit. Consultez [Qui peut utiliser Commerce](/fr/docs/commerce/#who-can-use-commerce).

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`.

`POST /products/batch`

## Corps de la requête

- `products` (object[], obligatoire): De 1 à 1 000 produits, chacun avec les champs de [Créer ou mettre à jour un produit](/fr/docs/api-reference/products/create/).

## Réponse

- `created` (integer): Nombre de nouveaux produits.

- `updated` (integer): Nombre de produits existants qui ont été mis à jour.

- `rejected` (object[]): 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.
**Requête** `POST /products/batch`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/products/batch \
  -H "Authorization: Bearer your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "products": [
      { "id": "8123456789", "title": "Trail running shoe", "price": 89, "currency": "USD", "categories": ["Shoes", "Running"] },
      { "id": "8123456790", "title": "Merino running socks", "price": 18, "currency": "USD", "categories": ["Accessories"] },
      { "id": "8123456791", "price": 49, "currency": "USD" }
    ]
  }'
```

**200**

```json
{
  "created": 1,
  "updated": 1,
  "rejected": [
    {
      "index": 2,
      "errors": {
        "products.2.title": [
          "is required"
        ]
      }
    }
  ]
}
```

**422**

```json
{
  "message": "Validation failed. products: Send 1 to 1000 products.",
  "errors": {
    "products": [
      "Send 1 to 1000 products."
    ]
  }
}
```

---
Source: https://emailit.com/fr/docs/api-reference/products/batch/

## Lister les catégories de produits — GET /products/categories

> Listez les catégories des produits actifs de votre catalogue, avec le nombre de produits dans chacune. Alpha : réservé à l’équipe Emailit.

# 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`.

> **Commerce est en alpha:** Commerce est réservé à l’équipe Emailit pendant que nous le testons. Les autres requêtes renvoient `403` avec `error: "commerce_alpha"`. Les clés API ne fonctionnent que dans les espaces de travail qui appartiennent à l’équipe Emailit. Consultez [Qui peut utiliser Commerce](/fr/docs/commerce/#who-can-use-commerce).

Les catégories proviennent des `categories` de chaque produit. Utilisez un nom de catégorie avec le paramètre `category` de [Lister les produits](/fr/docs/api-reference/products/list/).

`GET /products/categories`

**Requête** `GET /products/categories`

**cURL**

```bash
curl https://api.emailit.com/v2/products/categories \
  -H "Authorization: Bearer your_api_key"
```

**200**

```json
{
  "data": [
    {
      "name": "Accessories",
      "products": 18
    },
    {
      "name": "Running",
      "products": 12
    },
    {
      "name": "Shoes",
      "products": 27
    }
  ]
}
```

---
Source: https://emailit.com/fr/docs/api-reference/products/categories/

## Supprimer un produit — DELETE /products/{id}

> Retirez un produit de votre catalogue. Alpha : réservé à l’équipe Emailit.

# 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`.

> **Commerce est en alpha:** Commerce est réservé à l’équipe Emailit pendant que nous le testons. Les autres requêtes renvoient `403` avec `error: "commerce_alpha"`. Les clés API ne fonctionnent que dans les espaces de travail qui appartiennent à l’équipe Emailit. Consultez [Qui peut utiliser Commerce](/fr/docs/commerce/#who-can-use-commerce).

Si le [script de suivi](/fr/docs/commerce/connect-your-shop/#the-tracking-script) 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.

`DELETE /products/{id}`

## Paramètres de chemin

- `id` (string, obligatoire): L’ID du produit (`prd_...`) ou l’ID du produit dans votre boutique.

**Requête** `DELETE /products/{id}`

**cURL**

```bash
curl -X DELETE https://api.emailit.com/v2/products/prd_3r6HHUGUSl8yjYDscEA6aYA8wrA \
  -H "Authorization: Bearer your_api_key"
```

**200**

```json
{
  "object": "product",
  "id": "prd_3r6HHUGUSl8yjYDscEA6aYA8wrA",
  "deleted": true
}
```

**404**

```json
{
  "error": "Product not found",
  "message": "Product not found."
}
```

---
Source: https://emailit.com/fr/docs/api-reference/products/delete/
