> ## Documentation Index
> Fetch the complete documentation index at: https://docs.chataigne.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Ressources et identifiants du catalogue

> Comprenez l’identité, les relations, produits, modifiers et formules.

## Identité limitée au parent

Chaque `id` fourni par votre intégration reste immuable. Les ressources déjà présentes dans un catalogue créé par un POS ou le dashboard conservent leur ID provider lorsqu’il existe ; sinon Chataigne attribue un ID public opaque et stable. Les IDs privés de la base de données et des SKU ne servent jamais de fallback.

* Un ID de catalogue est unique dans un établissement.
* Les IDs de catégorie, produit, groupe de modifiers et formule sont uniques dans un catalogue.
* Un ID de modifier est unique dans son groupe.
* Un ID de ligne est unique dans sa formule.

Les mêmes IDs `delivery-menu`, `burger-classic` ou `sauces` peuvent être utilisés dans plusieurs établissements. Chataigne résout toujours un ID avec l’intégralité de son chemin parent.

<Warning>
  N’utilisez jamais un nom d’affichage comme clé de relation. Les noms peuvent changer. Utilisez
  `category_id`, `modifier_group_ids` et `product_ids`.
</Warning>

## Catégories

Les catégories regroupent produits et formules. `id` et `name` sont requis ; `description` et `image_url` sont optionnels.

## Produits

Un produit représente l’article vendable public complet :

```json theme={null}
{
  "id": "burger-classic",
  "object": "product",
  "name": "Burger classique",
  "category_id": "burgers",
  "description": null,
  "image_url": null,
  "price": { "amount": 12.9, "currency": "EUR" },
  "modifier_group_ids": ["sauces"],
  "disabled": false,
  "out_of_stock": false,
  "restrictions": [],
  "price_overrides": [],
  "bundle_only": false,
  "order": 10,
  "created_at": "2026-08-06T12:00:00.000Z",
  "updated_at": "2026-08-06T12:00:00.000Z"
}
```

Il n’existe aucune ressource SKU publique. Chataigne maintient un SKU principal privé pour sa compatibilité interne avec les commandes, mais son ID n’apparaît jamais dans cette API. Les concepts de produit stockés avec ce SKU en interne, comme `price_overrides` et `bundle_only`, sont remontés directement sur le produit public.

`order` est optionnel en écriture et toujours présent dans les réponses. À la création, son omission ajoute le produit à la fin de sa catégorie. Dans un snapshot complet, les produits sans ordre suivent les produits explicitement ordonnés de leur catégorie.

## Groupes de modifiers et modifiers

Un groupe définit les limites de sélection et contient des modifiers. `min_selections` vaut `0` par défaut ; `max_selections: null` signifie sans limite. Un groupe avec `min_selections > 0` doit contenir au moins un modifier. Un modifier possède un nom et un prix optionnel ; sans prix, il vaut zéro dans la devise de l’établissement. Les modifiers exposent les mêmes champs opérationnels que les produits.

## Formules

Une formule possède un prix fixe et une ou plusieurs lignes de sélection. Chaque ligne référence des produits publics avec `product_ids`. Les limites de sélection s’appliquent à la ligne. Les formules exposent les mêmes champs opérationnels que les produits, sauf `bundle_only` et `order`.

## État opérationnel et restrictions

`disabled` et `out_of_stock` sont indépendants. Une ressource désactivée est masquée et ne peut pas être commandée. Une ressource en rupture reste visible mais ne peut pas être sélectionnée jusqu’au retour en stock.

Chaque entrée de `restrictions` est une fenêtre de disponibilité. `days_of_week` contient les jours de la semaine, `start_time` et `end_time` utilisent `HH:MM`, `start_date` et `end_date` utilisent des dates-heures ISO 8601, et `service_types` contient `delivery`, `collection` ou les deux. Une ressource est disponible dès qu’une restriction correspond. Un tableau vide signifie sans restriction.

## Prix et prix conditionnels

Les prix utilisent `{ "amount": 12.9, "currency": "EUR" }`. Le montant doit être positif ou nul, avec deux décimales maximum. La devise doit correspondre à celle de l’établissement.

Chaque entrée de `price_overrides` contient un `price` et des `conditions`. Les conditions peuvent sélectionner un `service_type`, un ou plusieurs `days_of_week` et un intervalle local `start_time`/`end_time`. Au moins une condition non nulle est requise. Lorsque plusieurs prix correspondent, le plus spécifique l’emporte ; le prix de base reste le fallback. Un tableau vide supprime tous les prix conditionnels.
