API Vente
Enregistrez les commandes e-commerce et attribuez le chiffre d'affaires aux appels, agents et sources marketing pour un suivi ROI complet.
Introduction #
L'API Optico Sales (Customer Order API) enregistre les commandes e-commerce et les associe aux appels pour le suivi des conversions. Votre centre d'appels peut alors attribuer le chiffre d'affaires et les conversions à des appels, agents, mots-clés et sources marketing précis, et savoir ce que chaque appel rapporte.
https://www.optico.fr
Transport & conventions
| Méthode | Tous les endpoints utilisent POST |
| Content-Type | application/x-www-form-urlencoded |
| Format de réponse | application/json |
| Timeout | 5 secondes recommandées |
Démarrage #
L'API Sales est l'étape finale de l'intégration du centre d'appels Optico. Elle relie votre système de gestion de commandes e-commerce à la plateforme de call tracking pour boucler la chaîne d'attribution entre coût marketing et chiffre d'affaires.
visit_id via le cookie optico_visit_id.- Un domaine avec la fonctionnalité Call Center activée dans Optico.
- Une clé API Customer, disponible dans les paramètres du domaine dans le back-end Optico.
- Des statuts de commande configurés dans les paramètres du centre d'appels Optico (certains statuts marqués « is_sale » déclenchent le suivi des conversions).
Authentification #
Chaque requête doit inclure votre key en tant que champ POST. Il s'agit de la clé API Customer de votre domaine, la même clé que celle utilisée par l'API Cart.
key=cust_b7e2c8a14f9dcdef01234567
Erreurs #
Enveloppe de réponse
Chaque requête renvoie 200 OK avec une enveloppe JSON. Branchez-vous sur le champ status plutôt que sur le code HTTP.
Succès
{ "status": "success" }
Erreur
{ "status": "error",
"message": "Invalid api key" }
Messages d'erreur courants
| Message | Cause | Correction |
|---|---|---|
Invalid api key | La key est manquante, révoquée, ou non enregistrée pour le domaine appelant. | Vérifiez la clé API Customer dans les paramètres de votre domaine. |
Missing required parameter | L'un de id, status ou key est absent ou vide. | Loggez le payload de la requête et confirmez la présence des champs obligatoires. |
Unknown status | Le status envoyé n'est pas déclaré dans les paramètres de votre centre d'appels Optico. | Déclarez le statut sous Centre d'appels > Statuts, puis réessayez. Voir Statuts. |
Invalid products format | Le champ products n'est pas un JSON valide. | Encodez le tableau de produits en JSON avant l'envoi. Voir Objet Products. |
Idempotence
L'endpoint est idempotent sur votre id : renvoyer le même id de commande met à jour l'enregistrement existant au lieu d'en créer un doublon. Envoyez à la création de la commande et à chaque changement de statut.
Réessais & timeouts
Utilisez un timeout client de 5 secondes. Les timeouts réseau et les réponses HTTP 5xx peuvent être réessayés sans risque avec un backoff exponentiel (1s, 2s, 4s) car l'endpoint est idempotent. Ne réessayez pas sur un corps JSON {"status":"error"}. Corrigez le payload et renvoyez.
Limites de taux
Aucune limite de taux publique fixe n'est appliquée pour le trafic normal de commandes. Pour un backfill en masse (migrations, imports historiques), contactez le support Optico afin que le canal soit dimensionné pour votre compte.
Endpoints #
| Endpoint | Méthode | Objet |
|---|---|---|
/api/customer-order | POST | Créer ou mettre à jour un enregistrement de commande, lié à un appel ou à une session visiteur. |
POST /api/customer-order #
Crée ou met à jour une commande dans Optico. Si une commande avec le même id existe déjà pour le domaine, elle est mise à jour, rendant cet endpoint idempotent. Envoyez à la création de la commande et à chaque changement de statut.
Paramètres
| Paramètre | Type | Description | |
|---|---|---|---|
key | string | Obligatoire | Clé API Customer du domaine. |
id | string | Obligatoire | ID externe de la commande issu de votre système e-commerce. Sert à associer les mises à jour suivantes à la même commande. |
status | string | Obligatoire | Chaîne de statut de la commande. Doit correspondre à un statut configuré dans les paramètres du centre d'appels Optico. Détermine si la commande compte comme une vente. Voir Statuts. |
cart_id | string | Optionnel | ID externe du panier reliant cette commande à un panier précédemment envoyé (depuis l'API Cart). |
visit_id | integer | Optionnel | ID de visite Optico issu du cookie optico_visit_id. Relie la commande à la session visiteur. |
call_id | integer | Optionnel | ID d'appel Optico. Associe directement la commande à un enregistrement d'appel spécifique. |
agent | string | Optionnel | Nom d'utilisateur de l'agent du centre d'appels qui a traité cette commande. |
currency | string | Optionnel | Code devise ISO 4217 (ex. EUR, USD, GBP). Par défaut, devise du domaine. |
products | chaîne JSON | Optionnel | Tableau d'objets produit encodé en JSON. Voir Objet Products. |
Exemple de requête
curl -X POST https://www.optico.fr/api/customer-order \ --max-time 5 \ -d "key=cust_b7e2c8a14f9dcdef01234567" \ -d "id=ORDER-5678" \ -d "cart_id=CART-1234" \ -d "visit_id=3617898c651df0f8617f70a0" \ -d "status=confirmed" \ -d "currency=EUR" \ -d "agent=agent_john" \ --data-urlencode 'products=[{"id":"PROD-001","name":"Blue Widget","quantity":2,"cost_per_unit":29.99},{"id":"PROD-007","name":"Red Gadget","quantity":1,"cost_per_unit":59.00}]'
$visitId = intval($_COOKIE['optico_visit_id'] ?? 0); $params = [ 'key' => 'cust_b7e2c8a14f9dcdef01234567', 'id' => 'ORDER-5678', 'cart_id' => 'CART-1234', 'visit_id' => $visitId, 'status' => 'confirmed', 'currency' => 'EUR', 'agent' => 'agent_john', 'products' => json_encode([ ['id' => 'PROD-001', 'name' => 'Blue Widget', 'quantity' => 2, 'cost_per_unit' => 29.99], ['id' => 'PROD-007', 'name' => 'Red Gadget', 'quantity' => 1, 'cost_per_unit' => 59.00], ]), ]; $ch = curl_init('https://www.optico.fr/api/customer-order'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($params), CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 5, ]); $response = json_decode(curl_exec($ch), true); curl_close($ch);
const products = [ { id: 'PROD-001', name: 'Blue Widget', quantity: 2, cost_per_unit: 29.99 }, { id: 'PROD-007', name: 'Red Gadget', quantity: 1, cost_per_unit: 59.00 }, ]; const body = new URLSearchParams({ key: 'cust_b7e2c8a14f9dcdef01234567', id: 'ORDER-5678', cart_id: 'CART-1234', visit_id: visitId, status: 'confirmed', currency: 'EUR', agent: 'agent_john', products: JSON.stringify(products), }); const res = await fetch('https://www.optico.fr/api/customer-order', { method: 'POST', body, signal: AbortSignal.timeout(5000), }); const data = await res.json();
Objet Products #
Le paramètre products doit être une chaîne encodée en JSON contenant un tableau d'objets produit.
| Champ | Type | Description |
|---|---|---|
id | string | ID externe du produit issu de votre catalogue. |
name | string | Nom d'affichage du produit. |
quantity | integer | Nombre d'unités commandées. |
cost_per_unit | float | Prix unitaire. Optico calcule total_cost = somme(quantity × cost_per_unit). |
details | object | Paires clé-valeur pour tout attribut produit supplémentaire. |
Statuts #
Le champ status doit correspondre à l'un des statuts configurés dans votre compte Optico sous Centre d'appels > Statuts. Chaque statut peut optionnellement être marqué is_sale.
| Type de statut | Exemples de valeurs | Effet dans Optico |
|---|---|---|
| Statut de vente | confirmed, paid, shipped | La commande compte comme une conversion. L'événement e-commerce Google Analytics est déclenché automatiquement. Le chiffre d'affaires est attribué au mot-clé/source/agent de l'appel. |
| Statut hors vente | pending, cancelled, refunded | La commande est enregistrée et visible dans les rapports mais ne compte pas comme une conversion. Aucun événement GA déclenché. |
pending → confirmed). Les mises à jour suivantes ne le redéclenchent pas.Cycle de vie #
Le flux suivant montre comment l'API Sales s'intègre dans une intégration complète du centre d'appels Optico :
visit_id ni call_id n'est fourni, la commande est enregistrée mais n'est pas attribuée à un appel ou une session visiteur. L'attribution, les taux de conversion et les événements Google Analytics seront manquants. Incluez toujours visit_id issu du cookie optico_visit_id.