API Panier
REST · JSON v1.0 07 November 2019

API Panier

Envoyez à Optico les données de panier et de commande en temps réel. Associez les achats aux sessions visiteurs et aux interactions du centre d'appels.

Introduction #

L'API Cart envoie à Optico les données de panier et de commande en temps réel. Couplée au service Optico Tracking, elle relie chaque achat à la session visiteur, à la source, aux mots-clés et aux appels passés. Les agents voient le panier en cours, l'historique des commandes et le parcours de navigation de l'appelant directement dans l'interface du centre d'appels, et Optico rattache le chiffre d'affaires au coût marketing qui l'a généré.

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
Noms des paramètressnake_case dans les requêtes, camelCase dans les réponses
Timeout5 secondes recommandées
Un plugin Prestashop est disponible pour intégrer l'API Cart directement dans Prestashop. Contactez Optico pour le demander.

Authentification #

Chaque requête doit inclure votre key en tant que champ POST. La clé est unique pour l'ensemble de vos domaines enregistrés et elle est délivrée à la création de votre compte sur www.optico.fr.

Exemple
key=b7e2c8a14f9d3650a1e7c4d8b2f6a395e

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é dans votre compte Optico, sous Gérer les API.
Missing required parameterUn ou plusieurs champs obligatoires sont absents ou vides.Loggez le payload envoyé et comparez-le au tableau des paramètres de l'endpoint.
Invalid products formatLe tableau products n'a pas pu être parsé.Envoyez un tableau valide d'objets produit (voir Objet Products).
Unknown visit_idLe visit_id ne correspond à aucune visite trackée.Vérifiez que le cookie Optico Tracking est positionné avant l'envoi des données panier/commande.

Idempotence

Les deux endpoints sont idempotents sur votre champ id : renvoyer le même id de panier ou de commande met à jour l'enregistrement existant au lieu d'en créer un doublon. C'est un choix de conception pour que votre intégration puisse réessayer sans risque sur les défaillances transitoires.

Réessais & timeouts

Utilisez un timeout client de 5 secondes. Un timeout réseau ou une réponse HTTP 5xx peut être réessayé sans risque avec un backoff exponentiel (par exemple 1s, 2s, 4s) car les endpoints sont idempotents. Ne réessayez pas sur un corps JSON {"status":"error"}. La requête a été reçue puis rejetée ; inspectez le message et corrigez le payload.

Limites de taux

Aucune limite de taux publique fixe n'est appliquée pour le trafic normal. L'API est conçue pour être appelée à chaque modification de panier et de commande. Si vous prévoyez un backfill en masse ou un trafic soutenu au-delà de quelques centaines de requêtes par seconde, contactez Optico à l'avance pour dimensionner le canal pour votre compte.

Endpoints #

EndpointMéthodeObjet
/api/customer-cartPOSTInsérer ou mettre à jour un panier. À appeler à chaque modification du panier.
/api/customer-orderPOSTInsérer ou mettre à jour une commande. À appeler à chaque création de commande et changement de statut.

POST /api/customer-cart #

POSThttps://www.optico.fr/api/customer-cart

Insère ou met à jour un panier. Appelez cet endpoint à chaque modification du panier.

Paramètres

NomTypeDescription
keystringObligatoire Votre clé API (commune à tous vos domaines): "b7e2c8a14f9d3650a1e7c4d8b2f6a395e"
idstringObligatoire Votre id de panier: "1"
currencystringObligatoire Code devise ISO 4217: "EUR"
visit_idstringObligatoire Id de session visiteur. Voir Notes d'intégration pour la lecture depuis les cookies: "3617898c651df0f8617f70a0"
productsarrayObligatoire Articles du panier. Voir la section Objet Products pour la structure de l'objet.
is_logged_inintegerObligatoire 1 si l'acheteur est authentifié, 0 sinon.
call_idintegerOptionnel Id de l'appel courant en complément de l'API Call Center ; relie le panier à cet appel.
agentstringOptionnel Nom d'utilisateur de l'agent en complément de l'API Call Center ; relie le panier à cet agent.

Exemple de requête

bash
curl -X POST https://www.optico.fr/api/customer-cart \
  --max-time 5 \
  -d "key=b7e2c8a14f9d3650a1e7c4d8b2f6a395e" \
  -d "id=1" \
  -d "currency=EUR" \
  -d "visit_id=3617898c651df0f8617f70a0" \
  -d "is_logged_in=1" \
  --data-urlencode 'products[0][id]=1' \
  --data-urlencode 'products[0][name]=Product 1' \
  --data-urlencode 'products[0][quantity]=2' \
  --data-urlencode 'products[0][price]=29.99'
// Lecture du visit ID depuis le cookie (JS : optico_visitId / API : optico_visit_id)
$visitId = $_COOKIE['optico_visit_id'] ?? '';

$params = [
    'key'          => 'b7e2c8a14f9d3650a1e7c4d8b2f6a395e',
    'id'           => '1',
    'currency'     => 'EUR',
    'visit_id'     => $visitId,
    'is_logged_in' => 1,
    'products'     => [[
        'id'       => 1,
        'name'     => 'Product 1',
        'quantity' => 2,
        'price'    => 29.99,
        'details'  => 'some product details',
    ]],
];

$ch = curl_init('https://www.optico.fr/api/customer-cart');
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);
// Node 18+ (fetch natif). Lisez visit_id depuis votre stockage de cookies.
const params = new URLSearchParams();
params.append('key', 'b7e2c8a14f9d3650a1e7c4d8b2f6a395e');
params.append('id', '1');
params.append('currency', 'EUR');
params.append('visit_id', visitId);
params.append('is_logged_in', '1');
params.append('products[0][id]', '1');
params.append('products[0][name]', 'Product 1');
params.append('products[0][quantity]', '2');
params.append('products[0][price]', '29.99');

const res = await fetch('https://www.optico.fr/api/customer-cart', {
  method: 'POST',
  body:   params,
  signal: AbortSignal.timeout(5000),
});
const data = await res.json();

Réponse

Succès

json
{ "status": "success" }

Erreur

json
{ "status": "error",
  "message": "..." }

POST /api/customer-order #

POSThttps://www.optico.fr/api/customer-order

Insère ou met à jour une commande. Appelez cet endpoint lorsqu'une commande est créée et à chaque changement de statut.

Paramètres

NomTypeDescription
keystringObligatoire Votre clé API: "b7e2c8a14f9d3650a1e7c4d8b2f6a395e"
idstringObligatoire Votre id de commande: "1"
cart_idstringObligatoire Id du panier dont est issue cette commande: "1"
currencystringObligatoire Code devise ISO 4217: "EUR"
visit_idstringObligatoire Id de session visiteur. Voir Notes d'intégration: "3617898c651df0f8617f70a0"
productsarrayObligatoire Articles de la commande. Voir la section Objet Products.
statusstringObligatoire Statut courant de la commande: "Completed". Utilisez une orthographe et une langue cohérentes ; les mêmes valeurs doivent être déclarées dans Optico sous Agents / Paramètres.
call_idintegerOptionnel Id de l'appel courant en complément de l'API Call Center.
agentstringOptionnel Nom d'utilisateur de l'agent en complément de l'API Call Center.

Exemple de requête

bash
curl -X POST https://www.optico.fr/api/customer-order \
  --max-time 5 \
  -d "key=b7e2c8a14f9d3650a1e7c4d8b2f6a395e" \
  -d "id=1" \
  -d "cart_id=1" \
  -d "currency=EUR" \
  -d "visit_id=3617898c651df0f8617f70a0" \
  -d "status=Completed" \
  --data-urlencode 'products[0][id]=1' \
  --data-urlencode 'products[0][name]=Product 1' \
  --data-urlencode 'products[0][quantity]=2' \
  --data-urlencode 'products[0][price]=29.99'
$visitId = $_COOKIE['optico_visit_id'] ?? '';

$params = [
    'key'      => 'b7e2c8a14f9d3650a1e7c4d8b2f6a395e',
    'id'       => '1',
    'cart_id'  => '1',
    'currency' => 'EUR',
    'visit_id' => $visitId,
    'status'   => 'Completed',
    'products' => [[
        'id'       => 1,
        'name'     => 'Product 1',
        'quantity' => 2,
        'price'    => 29.99,
    ]],
];

$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 params = new URLSearchParams();
params.append('key', 'b7e2c8a14f9d3650a1e7c4d8b2f6a395e');
params.append('id', '1');
params.append('cart_id', '1');
params.append('currency', 'EUR');
params.append('visit_id', visitId);
params.append('status', 'Completed');
params.append('products[0][id]', '1');
params.append('products[0][name]', 'Product 1');
params.append('products[0][quantity]', '2');
params.append('products[0][price]', '29.99');

const res = await fetch('https://www.optico.fr/api/customer-order', {
  method: 'POST',
  body:   params,
  signal: AbortSignal.timeout(5000),
});
const data = await res.json();

Réponse

Succès

json
{ "status": "success" }

Erreur

json
{ "status": "error",
  "message": "..." }

Objet Products #

Chaque élément du tableau products est un objet produit avec les clés suivantes :

ChampTypeDescription
idmixedObligatoireId du produit dans votre catalogue: 1
namestringObligatoireNom affiché: "Product 1"
quantityintegerObligatoireNombre d'unités: 2
pricefloatObligatoirePrix unitaire: 29.99
detailsstring ou arrayOptionnelInformations libres sur le produit, affichées telles quelles dans le tableau de bord agent. Peut être une simple chaîne ou un tableau imbriqué avec des clés arbitraires.

Exemples du champ details

Chaîne simple

PHP
'details' => 'some product details'

Tableau imbriqué

PHP
'details' => [
  'color'      => 'blue',
  'dimensions' => [
    'width'  => '20cm',
    'height' => '20cm',
    'length' => '20cm'
  ]
]

Notes d'intégration #

Obtenir le visit_id

Le visit_id provient du service Optico Tracking et identifie la session du visiteur. Lisez-le depuis le cookie approprié selon votre méthode de tracking :

Méthode de trackingNom du cookieExemple de valeur
Tracking JSoptico_visitId3617898c651df0f8617f70a0
Tracking API (avec l'exemple PHP Optico)optico_visit_id3617898c651df0f8617f70a0

Flux d'intégration

Mise en place du tracking
Votre siteintègre Optico Tracking → le cookie visit_id est positionné à chaque chargement de page
Activité panier
Visiteurajoute / modifie des articles dans le panier
Votre sitePOST vers /api/customer-cart avec visit_id + products
Optico{ "status": "success" }
Commande passée
Visiteurfinalise le checkout
Votre sitePOST vers /api/customer-order avec visit_id + cart_id + products + status
Optico{ "status": "success" }
Appel
Visiteurappelle un numéro de téléphone tracké
Opticopousse les données panier + commande vers le tableau de bord agent en temps réel

Relier les paniers et les commandes aux appels

Lorsqu'un visiteur appelle alors que l'API Call Center est active, vous pouvez avoir accès au call_id courant et au nom d'utilisateur de l'agent qui prend l'appel. Transmettez ces champs optionnels pour associer directement l'enregistrement panier ou commande à l'appel et à l'agent ; cela enrichit la timeline d'appel visible côté agent.