API Reference

Documentation API

API REST pour intégrer la cabine d'essayage virtuel IA dans vos boutiques e-commerce, et tracker les conversions générées.

Base URL : https://cabine.ai/api/v1 · Format : application/json

Authentification

Toutes les requêtes nécessitent une clé API dans l'en-tête HTTP. Générez votre clé depuis Mon compte → Clés API.

Via l'en-tête X-Api-Key (recommandé)

X-Api-Key: vf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Via Authorization Bearer

Authorization: Bearer vf_live_xxxxxxxxxxxxxxxxxxxxxxxx
⚠️ Ne commitez jamais votre clé API dans votre code source. Stockez-la dans une variable d'environnement ou dans la configuration de votre module.

Gestion des erreurs

Toutes les réponses d'erreur suivent ce format :

{
  "success": false,
  "error":   "error_code",
  "message": "Description lisible en français"
}
HTTPCode erreurEndpoint(s)Description
400invalid_jsontousCorps JSON malformé
401authentication_errortousClé API manquante, invalide ou révoquée
402no_active_subscription/generateAucun abonnement actif sur ce compte
403model_not_allowed/generateModèle non inclus dans votre plan
422invalid_paramtousParamètre manquant, invalide ou image non décodable
422invalid_model/generateIdentifiant de modèle inconnu — consultez /models
429quota_exceeded/generateQuota de crédits mensuel épuisé
500generation_failed/generateErreur API Gemini ou génération impossible

Génération d'essayage

POST /api/v1/generate Lance une génération IA

Envoie deux images (produit + photo du client) et retourne une URL de téléchargement de l'image générée. Consomme 1 crédit par appel.

Sources d'images — 3 modes (mixables)

Les champs product_image_* et user_photo_* acceptent chacun 3 formats. Priorité : URL > base64 > multipart. Utilisez celui qui correspond à votre architecture.
ParamètreTypeDescription
IMAGE PRODUIT — fournir exactement l'un des 3
product_image_urlstringURLURL HTTPS publique de l'image produit. Doit être accessible depuis nos serveurs.
product_image_b64stringbase64Image encodée en base64, avec ou sans préfixe data:image/...;base64,. Min. 1 Ko décodé.
product_imagefilemultipartFichier image en multipart/form-data. Formats acceptés : JPEG, PNG, WebP.
PHOTO UTILISATEUR — fournir exactement l'un des 3
user_photo_urlstringURLURL HTTPS publique de la photo de la personne.
user_photo_b64stringbase64Photo encodée en base64.
user_photofilemultipartFichier photo en multipart/form-data.
OPTIONS
modelstringoptionnelIdentifiant du modèle IA. Défaut : gemini-3-pro-image-preview. Consultez GET /models pour la liste complète.
promptstringoptionnelInstructions personnalisées. Si absent, le prompt haute-fidélité par défaut est utilisé.
TRACKING — optionnels mais fortement recommandés pour le suivi des conversions
product_idintrecommandéID du produit côté CMS. Utilisé pour lier automatiquement les conversions à cette génération.
cart_idintrecommandéID du panier côté CMS. Clé de jonction principale avec l'endpoint POST /conversion.
customer_idintoptionnelID du client côté CMS. Pour filtrage et exports.

Mode 1 — URL publique (JSON)

curl -X POST https://cabine.ai/api/v1/generate \
  -H "X-Api-Key: vf_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "product_image_url": "https://maboutique.com/img/robe.jpg",
    "user_photo_url":    "https://maboutique.com/uploads/client.jpg",
    "product_id":         42,
    "cart_id":            67890,
    "customer_id":        12345
  }'

Mode 2 — Base64 ✅ recommandé pour PrestaShop

curl -X POST https://cabine.ai/api/v1/generate \
  -H "X-Api-Key: vf_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "product_image_b64": "data:image/jpeg;base64,/9j/4AAQ...",
    "user_photo_b64":    "data:image/jpeg;base64,/9j/4AAQ...",
    "product_id":         42,
    "cart_id":            67890,
    "customer_id":        12345
  }'

Mode 3 — Multipart/form-data (upload direct)

curl -X POST https://cabine.ai/api/v1/generate \
  -H "X-Api-Key: vf_live_xxx" \
  -F "product_image=@/chemin/robe.jpg" \
  -F "user_photo=@/chemin/client.jpg" \
  -F "product_id=42" \
  -F "cart_id=67890" \
  -F "customer_id=12345"

Réponse succès (200)

{
  "success":             true,
  "result_url":          "https://cabine.ai/generation/a3f8...b2/download",
  "generation_id":       1042,
  "credits_used":        1,
  "credits_remaining":   163,
  "processing_time_ms":  8420
}

Champs de la réponse

ChampTypeDescription
successbooltrue si la génération a réussi
result_urlstringURL de téléchargement (token 64 hex, accessible sans authentification). Sauvegardez-la en BDD.
generation_idintID interne de la génération — à conserver pour le lien avec POST /conversion
credits_usedintCrédits consommés (toujours 1 par essayage)
credits_remainingintCrédits restants sur votre abonnement ce mois-ci
processing_time_msintDurée de traitement en millisecondes
result_url est accessible publiquement via un token sécurisé de 64 caractères. Durée de conservation selon votre plan :
Starter : 7 jours · Growth : 30 jours · Scale : 90 jours.
Après expiration, la route retourne HTTP 410 Gone.

Enregistrement de conversion

POST /api/v1/conversion Lie une commande à un essayage

Enregistre une conversion : une commande passée après qu'un client a effectué un essayage virtuel. L'API relie automatiquement la commande à la génération d'origine grâce au cart_id et au product_id envoyés lors de l'essayage.

Cet endpoint est idempotent : un second appel avec le même order_id retourne la conversion déjà enregistrée sans créer de doublon.

💡 Lien automatique : si vous avez fourni product_id et cart_id lors du POST /generate, l'API retrouve la génération correspondante et remplit linked_generation_id automatiquement.

Paramètres

ParamètreTypeDescription
order_idstringrequisID ou référence de la commande côté CMS (PrestaShop, WooCommerce…). Accepte les références alphanumériques.
product_idintrecommandéID du produit acheté côté CMS. Utilisé pour retrouver la génération d'origine.
cart_idintrecommandéID du panier à l'origine de la commande. Clé de jonction principale avec la génération.
customer_idintoptionnelID du client côté CMS.
metadataobjectoptionnelDonnées complémentaires libres : montant, devise, SKU, etc. (JSON arbitraire)

Exemple — appel depuis PrestaShop

curl -X POST https://cabine.ai/api/v1/conversion \
  -H "X-Api-Key: vf_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "order_id":    "PS-00012345",
    "product_id":  42,
    "cart_id":     67890,
    "customer_id": 12345,
    "metadata": {
      "amount":   89.90,
      "currency": "EUR",
      "sku":      "ROBE-BLEU-M"
    }
  }'

Réponse succès (201 Created)

{
  "success":               true,
  "conversion_id":         58,
  "linked_generation_id":  1042,
  "already_recorded":      false
}

Réponse — conversion déjà enregistrée (200, idempotent)

{
  "success":               true,
  "conversion_id":         58,
  "linked_generation_id":  1042,
  "already_recorded":      true
}

Champs de la réponse

ChampTypeDescription
successbooltrue dans tous les cas de succès
conversion_idintID interne de la conversion enregistrée
linked_generation_idint|nullID de la génération liée automatiquement, ou null si aucune génération trouvée pour ce cart_id + product_id
already_recordedbooltrue si la conversion existait déjà (réponse idempotente)

Intégration PrestaShop — hook actionOrderStatusPostUpdate

// À appeler depuis le hook de confirmation de commande
public function hookActionOrderStatusPostUpdate($params)
{
    $order  = $params['order'];
    $status = $params['newOrderStatus'];

    // Ne déclencher que sur commandes validées/payées
    if (!in_array($status->id, [2, 12])) return;

    foreach ($order->getProducts() as $product) {
        $payload = json_encode([
            'order_id'    => (string) $order->reference,
            'product_id'  => (int) $product['product_id'],
            'cart_id'     => (int) $order->id_cart,
            'customer_id' => (int) $order->id_customer,
            'metadata'    => [
                'amount'   => (float) $order->total_paid,
                'currency' => Context::getContext()->currency->iso_code,
                'sku'      => $product['reference'],
            ],
        ]);

        file_get_contents('https://cabine.ai/api/v1/conversion', false,
            stream_context_create(['http' => [
                'method'  => 'POST',
                'header'  => "X-Api-Key: vf_live_xxx\r\nContent-Type: application/json",
                'content' => $payload,
                'timeout' => 5,
                'ignore_errors' => true, // Ne pas bloquer la confirmation commande
            ]])
        );
    }
}
⚠️ L'endpoint conversion doit être appelé en tâche de fond ou avec un timeout court (5s). Ne laissez pas une éventuelle erreur réseau bloquer la confirmation de commande côté boutique.

Consulter son quota

GET /api/v1/quota Solde de crédits

Retourne le détail des crédits de l'abonnement actif. Aucun paramètre requis.

curl https://cabine.ai/api/v1/quota \
  -H "X-Api-Key: vf_live_xxx"

Réponse succès (200)

{
  "success":            true,
  "plan":               "Growth",
  "plan_slug":          "growth",
  "credits_total":      200,
  "credits_used":       37,
  "credits_bonus":      0,
  "credits_remaining":  163,
  "usage_percent":      18,
  "renews_at":          "2025-02-01"
}

Champs de la réponse

ChampTypeDescription
planstringNom lisible du plan actif
plan_slugstringIdentifiant machine du plan
credits_totalintCrédits mensuels inclus dans le plan
credits_usedintCrédits consommés ce mois-ci
credits_bonusintCrédits bonus ajoutés manuellement (hors quota mensuel)
credits_remainingintCrédits restants (inclut les crédits bonus)
usage_percentintPourcentage d'utilisation des crédits du plan (hors bonus)
renews_atstringDate de renouvellement du quota (format YYYY-MM-DD)

Modèles disponibles

GET /api/v1/models Liste les modèles selon votre plan

Retourne la liste des modèles IA disponibles et indique lesquels sont accessibles avec votre plan. Aucun paramètre requis.

curl https://cabine.ai/api/v1/models \
  -H "X-Api-Key: vf_live_xxx"

Réponse succès (200)

{
  "success": true,
  "models": [
    {
      "id":                     "gemini-3-pro-image-preview",
      "label":                  "Flash Image — défaut ✅",
      "credits_per_generation": 1,
      "available":             true
    },
    // ...
  ]
}

Champs par modèle

ChampTypeDescription
idstringIdentifiant à passer dans le champ model de POST /generate
labelstringNom lisible du modèle
credits_per_generationintToujours 1 — 1 essayage = 1 crédit, quel que soit le modèle
availablebooltrue si le modèle est inclus dans votre plan actif

Intégration PrestaShop

Le module cabin_ai supporte nativement l'API cabine.ai en mode SaaS. Configurez votre clé API depuis Mon compte → Clés API.

Configuration du module

# BO PrestaShop → Modules → cabin_ai → Configurer
Mode          : SaaS (API externe)
API Endpoint  : https://cabine.ai/api/v1/generate
API Key       : vf_live_xxxxxxxx...   ← Depuis Mon compte → Clés API

Flux complet recommandé

1. Client clique "Essayer ce vêtement" sur la fiche produit
2. Upload photo → module encode en base64
   POST /api/v1/generate avec product_id, cart_id, customer_id
3. API génère l'image (~15-90s selon le modèle)
4. API retourne result_url + generation_id → module affiche l'image
5. Client passe commande
6. Webhook PrestaShop → POST /api/v1/conversion avec order_id, product_id, cart_id
7. L'API relie automatiquement la commande à l'essayage d'origine

Appel génération — exemple PHP complet

// Dans le controller AJAX du module (controllers/front/ajax.php)
$payload = json_encode([
    'product_image_b64' => 'data:image/jpeg;base64,' . base64_encode(file_get_contents($productImagePath)),
    'user_photo_b64'    => 'data:image/jpeg;base64,' . base64_encode(file_get_contents($userPhotoTmpPath)),
    'product_id'        => (int) Tools::getValue('id_product'),
    'cart_id'           => (int) Context::getContext()->cart->id,
    'customer_id'       => (int) Context::getContext()->customer->id, // 0 si visiteur
]);

$response = file_get_contents('https://cabine.ai/api/v1/generate', false,
    stream_context_create(['http' => [
        'method'  => 'POST',
        'header'  => "X-Api-Key: vf_live_xxx\r\nContent-Type: application/json",
        'content' => $payload,
        'timeout' => 120,
        'ignore_errors' => true,
    ]])
);

$data = json_decode($response, true);
if ($data['success']) {
    $resultUrl    = $data['result_url'];    // À sauvegarder en BDD
    $generationId = $data['generation_id']; // Optionnel, pour vos logs
}
Pourquoi base64 et non URL ? Votre boutique PrestaShop peut être en local, staging ou derrière un VPN — le serveur cabine.ai ne pourrait pas accéder à une URL interne. Le base64 encode l'image directement dans la requête et fonctionne dans tous les environnements.

Modèle de crédits

1 essayage = 1 crédit, quel que soit le modèle utilisé. Le modèle par défaut est gemini-3-pro-image-preview.
Vous pouvez spécifier un autre modèle via le champ model, sans surcoût.

Les crédits sont renouvelés le 1er de chaque mois. Les crédits non utilisés ne sont pas reportés. Les crédits bonus (ajoutés manuellement par le support) s'ajoutent aux crédits du plan et sont inclus dans credits_remaining.

Bonnes pratiques

Des questions ? support@cabine.ai

Créer un compte gratuit →