Schéma du catalogue
Quand tu upload un catalogue via l’API Dialog, le JSON doit respecter ce schéma. L’assistant IA Dialog utilise ces données structurées pour comprendre tes produits et recommander juste.
À quoi Dialog utilise le catalogue
Section intitulée « À quoi Dialog utilise le catalogue »- Comprendre les features, variantes et specs des produits.
- Faire des comparaisons produit intelligentes.
- Fournir des recommandations contextuelles selon les besoins du client.
- Répondre aux questions détaillées sur ton inventaire.
Plus ton catalogue est complet et structuré, meilleures sont les réponses.
JSON Schema
Section intitulée « JSON Schema »Colle-le dans ton validateur (Ajv, jsonschema, Pydantic via model_json_schema, etc.) pour valider tes payloads avant l’upload.
{ "$schema": "http://json-schema.org/draft-07/schema#", "title": "Dialog product catalog", "type": "object", "required": ["products"], "properties": { "products": { "type": "array", "items": { "$ref": "#/definitions/product" } } }, "definitions": { "product": { "type": "object", "required": ["id", "title", "status", "variants", "metafields", "collections", "tags"], "properties": { "id": { "type": "string", "description": "Identifiant unique du produit dans ton système. Doit être stable entre imports." }, "title": { "type": "string" }, "url": { "type": "string", "format": "uri", "description": "URL canonique de la fiche produit. Utilisée pour les liens dans les recommandations du chat." }, "status": { "$ref": "#/definitions/status" }, "variants": { "type": "array", "minItems": 1, "items": { "$ref": "#/definitions/productVariant" } }, "metafields": { "type": "array", "items": { "$ref": "#/definitions/metafield" } }, "collections": { "type": "array", "items": { "$ref": "#/definitions/collection" } }, "tags": { "type": "array", "items": { "type": "string" } }, "description": { "type": "string" }, "translations": { "$ref": "#/definitions/productTranslations" }, "featuredImage": { "$ref": "#/definitions/image" }, "images": { "type": "array", "items": { "$ref": "#/definitions/image" } }, "options": { "type": "array", "items": { "$ref": "#/definitions/option" } } } }, "productVariant": { "type": "object", "required": ["id", "displayName", "inStock", "price"], "properties": { "id": { "type": "string" }, "displayName": { "type": "string" }, "url": { "type": "string", "format": "uri", "description": "URL de la fiche spécifique à la variante. Fortement recommandée — les recommandations du chat pointent vers cette URL pour les variantes en stock. Fallback sur l'URL du produit si absente." }, "inStock": { "type": "boolean" }, "price": { "type": "array", "minItems": 1, "items": { "$ref": "#/definitions/price" }, "description": "Une entrée par devise supportée." }, "translations": { "$ref": "#/definitions/variantTranslations" }, "selectedOptions": { "type": "array", "items": { "$ref": "#/definitions/selectedOption" } }, "metafields": { "type": "array", "items": { "$ref": "#/definitions/metafield" } }, "compareAtPrice": { "type": "array", "items": { "$ref": "#/definitions/price" }, "description": "Prix d'origine, pour afficher la remise." }, "image": { "$ref": "#/definitions/image" } } }, "image": { "type": "object", "required": ["url"], "properties": { "url": { "type": "string", "format": "uri", "description": "URL directe — HTTPS fortement recommandé." } } }, "price": { "type": "object", "required": ["amount", "currencyCode"], "properties": { "amount": { "type": "string", "pattern": "^\\d+(\\.\\d+)?$", "description": "Décimal encodé en string, ex. \"29.99\". Pas un nombre." }, "currencyCode": { "$ref": "#/definitions/currencyCode" } } }, "metafield": { "type": "object", "required": ["name", "value"], "properties": { "name": { "type": "string", "description": "ex. \"material\", \"weight\", \"brand\"." }, "value": { "type": "string", "description": "ex. \"cotton\", \"2.5kg\", \"Nike\"." } } }, "collection": { "type": "object", "required": ["title"], "properties": { "title": { "type": "string" }, "description": { "type": "string" } } }, "option": { "type": "object", "required": ["id", "name", "values", "position"], "properties": { "id": { "type": "string" }, "name": { "type": "string", "description": "ex. \"Color\", \"Size\", \"Material\"." }, "values": { "type": "array", "items": { "type": "string" } }, "position": { "type": "integer", "minimum": 0, "description": "Ordre d'affichage 0-based." }, "translations": { "type": "array", "items": { "$ref": "#/definitions/optionTranslations" } } } }, "selectedOption": { "type": "object", "required": ["name", "value"], "properties": { "name": { "type": "string" }, "value": { "type": "string" }, "translations": { "type": "object", "description": "Map locale → nom/valeur traduits.", "additionalProperties": { "type": "object", "required": ["name", "value"], "properties": { "name": { "type": "string" }, "value": { "type": "string" } } } } } }, "productTranslations": { "type": "object", "description": "Map locale (ISO en minuscules, ex. \"en\", \"fr\") → champs traduits.", "additionalProperties": { "type": "object", "required": ["title"], "properties": { "title": { "type": "string" }, "description": { "type": "string" }, "url": { "type": "string", "format": "uri", "description": "URL de la fiche produit spécifique à la locale. Tu peux aussi la définir par variante dans `productVariant.translations`." } } } }, "variantTranslations": { "type": "object", "description": "Map locale → champs traduits.", "additionalProperties": { "type": "object", "required": ["displayName"], "properties": { "displayName": { "type": "string" }, "url": { "type": "string", "format": "uri", "description": "URL de la fiche variante spécifique à la locale." } } } }, "optionTranslations": { "type": "object", "required": ["key", "value"], "properties": { "key": { "type": "string" }, "value": { "type": "string" } } }, "currencyCode": { "type": "string", "enum": ["EUR", "USD", "CAD", "GBP", "PLN"] }, "status": { "type": "string", "enum": ["ACTIVE", "ARCHIVED", "DRAFT", "UNLISTED"], "description": "ACTIVE : disponible à la vente. ARCHIVED : plus disponible, gardé pour référence. DRAFT : pas encore prêt à la vente. UNLISTED : caché des recommandations." } }}Payload exemple
Section intitulée « Payload exemple »{ "products": [ { "id": "prod_001", "title": "T-shirt premium en coton", "url": "https://example.com/products/premium-cotton-tshirt", "description": "T-shirt confortable 100% coton bio, parfait pour tous les jours.", "status": "ACTIVE", "collections": [ { "title": "Collection Été", "description": "Essentiels d'été légers et respirants" }, { "title": "Eco-Friendly" } ], "tags": ["coton", "été", "casual", "bio"], "metafields": [ { "name": "material", "value": "100% coton bio" }, { "name": "care_instructions", "value": "Lavage à froid, séchage doux" } ], "featuredImage": { "url": "https://example.com/images/tshirt-main.jpg" }, "images": [ { "url": "https://example.com/images/tshirt-front.jpg" }, { "url": "https://example.com/images/tshirt-back.jpg" } ], "options": [ { "id": "color", "name": "Color", "values": ["Red", "Blue", "Green"], "position": 0 }, { "id": "size", "name": "Size", "values": ["S", "M", "L", "XL"], "position": 1 } ], "variants": [ { "id": "var_001", "displayName": "T-shirt rouge - Medium", "url": "https://example.com/products/premium-cotton-tshirt?variant=red-m", "inStock": true, "price": [ { "amount": "29.99", "currencyCode": "USD" }, { "amount": "25.99", "currencyCode": "EUR" } ], "selectedOptions": [ { "name": "Color", "value": "Red" }, { "name": "Size", "value": "M" } ], "compareAtPrice": [{ "amount": "39.99", "currencyCode": "USD" }], "image": { "url": "https://example.com/images/tshirt-red-m.jpg" } } ] } ]}Tips de validation
Section intitulée « Tips de validation »- L’objet racine doit contenir
productsen array. - Chaque produit doit avoir au moins une variante.
price.amountest une string, pas un nombre.- Utilise les codes ISO en minuscules pour les locales (
en,fr,es). urlest fortement recommandée sur chaque variante et sur chaque produit — sans ça, les recommandations dans le chat ne peuvent pas renvoyer vers ton site.
Comportement du clic
Section intitulée « Comportement du clic »Quand un utilisateur clique sur un produit dans le widget, Dialog choisit l’URL de destination dans cet ordre :
- L’
urlde la variante sélectionnée (si la variante est connue et a une URL). - L’
urldu produit.
Envoie toujours au moins l’url du produit — et une url par variante quand les variantes vivent sur des pages distinctes (ex. ?variant=red-m).
Upload le fichier en utilisant l’URL pré-signée de la Référence API.