API Vente
REST · JSON v1.0 17 October 2019

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.

URL de base https://www.optico.fr

Transport & conventions

MéthodeTous les endpoints utilisent POST
Content-Typeapplication/x-www-form-urlencoded
Format de réponseapplication/json
Timeout5 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.

L'API Call Tracking suit les visiteurs et émet les valeurs visit_id via le cookie optico_visit_id.
L'API Cart enregistre le contenu du panier en direct, visible par les agents en temps réel pendant les appels.
Cette API L'API Sales enregistre les commandes confirmées et les associe aux appels, permettant des rapports de taux de conversion et de ROI par mot-clé, source, agent et campagne.
Prérequis :
  • 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.

Exemple
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

json
{ "status": "success" }

Erreur

json
{ "status": "error",
  "message": "Invalid api key" }

Messages d'erreur courants

MessageCauseCorrection
Invalid api keyLa 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 parameterL'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 statusLe 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 formatLe 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 #

EndpointMéthodeObjet
/api/customer-orderPOSTCréer ou mettre à jour un enregistrement de commande, lié à un appel ou à une session visiteur.

POST /api/customer-order #

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ètreTypeDescription
keystringObligatoireClé API Customer du domaine.
idstringObligatoireID externe de la commande issu de votre système e-commerce. Sert à associer les mises à jour suivantes à la même commande.
statusstringObligatoireChaî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_idstringOptionnelID externe du panier reliant cette commande à un panier précédemment envoyé (depuis l'API Cart).
visit_idintegerOptionnelID de visite Optico issu du cookie optico_visit_id. Relie la commande à la session visiteur.
call_idintegerOptionnelID d'appel Optico. Associe directement la commande à un enregistrement d'appel spécifique.
agentstringOptionnelNom d'utilisateur de l'agent du centre d'appels qui a traité cette commande.
currencystringOptionnelCode devise ISO 4217 (ex. EUR, USD, GBP). Par défaut, devise du domaine.
productschaîne JSONOptionnelTableau d'objets produit encodé en JSON. Voir Objet Products.

Exemple de requête

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

ChampTypeDescription
idstringID externe du produit issu de votre catalogue.
namestringNom d'affichage du produit.
quantityintegerNombre d'unités commandées.
cost_per_unitfloatPrix unitaire. Optico calcule total_cost = somme(quantity × cost_per_unit).
detailsobjectPaires clé-valeur pour tout attribut produit supplémentaire.
La valeur totale de la commande (utilisée dans les événements e-commerce de Google Analytics) est calculée automatiquement comme la somme de quantity × cost_per_unit sur tous les produits. Indiquez toujours des coûts produit exacts pour un reporting de chiffre d'affaires correct.

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 statutExemples de valeursEffet dans Optico
Statut de venteconfirmed, paid, shippedLa 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 ventepending, cancelled, refundedLa commande est enregistrée et visible dans les rapports mais ne compte pas comme une conversion. Aucun événement GA déclenché.
L'événement de conversion Google Analytics est déclenché la première fois qu'une commande passe à un statut de vente (par exemple pendingconfirmed). 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 :

1 · Chargement de page
Votre siteappelle /ospView → Optico émet visitId → positionne le cookie optico_visit_id
2 · Activité panier
Visiteurajoute des articles au panier
Votre sitePOST vers /api/customer-cart (API Cart) avec visit_id + products
3 · Appel
Visiteurappelle un numéro tracké ; Optico associe l'appel à la visite via visitId
Agentvoit le contenu du panier en temps réel via le push de l'API Agent
4 · Commande créée
Votre sitePOST vers /api/customer-order avec id, status=pending, cart_id, products
Optico{ "status": "success" } ; commande enregistrée, pas encore une vente
5 · Commande confirmée (vente)
Votre sitePOST vers /api/customer-order avec id, status=confirmed
Opticoenregistre la commande, déclenche l'événement e-commerce Google Analytics, attribue le chiffre d'affaires à la source de l'appel
Si ni 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.