API Reference
API REST pour intégrer la cabine d'essayage virtuel IA dans vos boutiques e-commerce, et tracker les conversions générées.
https://cabine.ai/api/v1
· Format : application/json
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.
X-Api-Key: vf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Authorization: Bearer vf_live_xxxxxxxxxxxxxxxxxxxxxxxx
Toutes les réponses d'erreur suivent ce format :
{
"success": false,
"error": "error_code",
"message": "Description lisible en français"
}
| HTTP | Code erreur | Endpoint(s) | Description |
|---|---|---|---|
| 400 | invalid_json | tous | Corps JSON malformé |
| 401 | authentication_error | tous | Clé API manquante, invalide ou révoquée |
| 402 | no_active_subscription | /generate | Aucun abonnement actif sur ce compte |
| 403 | model_not_allowed | /generate | Modèle non inclus dans votre plan |
| 422 | invalid_param | tous | Paramètre manquant, invalide ou image non décodable |
| 422 | invalid_model | /generate | Identifiant de modèle inconnu — consultez /models |
| 429 | quota_exceeded | /generate | Quota de crédits mensuel épuisé |
| 500 | generation_failed | /generate | Erreur API Gemini ou génération impossible |
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.
product_image_* et user_photo_* acceptent chacun 3 formats. Priorité : URL > base64 > multipart. Utilisez celui qui correspond à votre architecture.
| Paramètre | Type | Description | |
|---|---|---|---|
| IMAGE PRODUIT — fournir exactement l'un des 3 | |||
| product_image_url | string | URL | URL HTTPS publique de l'image produit. Doit être accessible depuis nos serveurs. |
| product_image_b64 | string | base64 | Image encodée en base64, avec ou sans préfixe data:image/...;base64,. Min. 1 Ko décodé. |
| product_image | file | multipart | Fichier image en multipart/form-data. Formats acceptés : JPEG, PNG, WebP. |
| PHOTO UTILISATEUR — fournir exactement l'un des 3 | |||
| user_photo_url | string | URL | URL HTTPS publique de la photo de la personne. |
| user_photo_b64 | string | base64 | Photo encodée en base64. |
| user_photo | file | multipart | Fichier photo en multipart/form-data. |
| OPTIONS | |||
| model | string | optionnel | Identifiant du modèle IA. Défaut : gemini-3-pro-image-preview. Consultez GET /models pour la liste complète. |
| prompt | string | optionnel | Instructions 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_id | int | recommandé | ID du produit côté CMS. Utilisé pour lier automatiquement les conversions à cette génération. |
| cart_id | int | recommandé | ID du panier côté CMS. Clé de jonction principale avec l'endpoint POST /conversion. |
| customer_id | int | optionnel | ID du client côté CMS. Pour filtrage et exports. |
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
}'
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
}'
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"
{
"success": true,
"result_url": "https://cabine.ai/generation/a3f8...b2/download",
"generation_id": 1042,
"credits_used": 1,
"credits_remaining": 163,
"processing_time_ms": 8420
}
| Champ | Type | Description |
|---|---|---|
| success | bool | true si la génération a réussi |
| result_url | string | URL de téléchargement (token 64 hex, accessible sans authentification). Sauvegardez-la en BDD. |
| generation_id | int | ID interne de la génération — à conserver pour le lien avec POST /conversion |
| credits_used | int | Crédits consommés (toujours 1 par essayage) |
| credits_remaining | int | Crédits restants sur votre abonnement ce mois-ci |
| processing_time_ms | int | Durée de traitement en millisecondes |
HTTP 410 Gone.
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.
product_id et cart_id lors du POST /generate, l'API retrouve la génération correspondante et remplit linked_generation_id automatiquement.
| Paramètre | Type | Description | |
|---|---|---|---|
| order_id | string | requis | ID ou référence de la commande côté CMS (PrestaShop, WooCommerce…). Accepte les références alphanumériques. |
| product_id | int | recommandé | ID du produit acheté côté CMS. Utilisé pour retrouver la génération d'origine. |
| cart_id | int | recommandé | ID du panier à l'origine de la commande. Clé de jonction principale avec la génération. |
| customer_id | int | optionnel | ID du client côté CMS. |
| metadata | object | optionnel | Données complémentaires libres : montant, devise, SKU, etc. (JSON arbitraire) |
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"
}
}'
{
"success": true,
"conversion_id": 58,
"linked_generation_id": 1042,
"already_recorded": false
}
{
"success": true,
"conversion_id": 58,
"linked_generation_id": 1042,
"already_recorded": true
}
| Champ | Type | Description |
|---|---|---|
| success | bool | true dans tous les cas de succès |
| conversion_id | int | ID interne de la conversion enregistrée |
| linked_generation_id | int|null | ID de la génération liée automatiquement, ou null si aucune génération trouvée pour ce cart_id + product_id |
| already_recorded | bool | true si la conversion existait déjà (réponse idempotente) |
// À 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
]])
);
}
}
5s). Ne laissez pas une éventuelle erreur réseau bloquer la confirmation de commande côté boutique.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"
{
"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"
}
| Champ | Type | Description |
|---|---|---|
| plan | string | Nom lisible du plan actif |
| plan_slug | string | Identifiant machine du plan |
| credits_total | int | Crédits mensuels inclus dans le plan |
| credits_used | int | Crédits consommés ce mois-ci |
| credits_bonus | int | Crédits bonus ajoutés manuellement (hors quota mensuel) |
| credits_remaining | int | Crédits restants (inclut les crédits bonus) |
| usage_percent | int | Pourcentage d'utilisation des crédits du plan (hors bonus) |
| renews_at | string | Date de renouvellement du quota (format YYYY-MM-DD) |
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"
{
"success": true,
"models": [
{
"id": "gemini-3-pro-image-preview",
"label": "Flash Image — défaut ✅",
"credits_per_generation": 1,
"available": true
},
// ...
]
}
| Champ | Type | Description |
|---|---|---|
| id | string | Identifiant à passer dans le champ model de POST /generate |
| label | string | Nom lisible du modèle |
| credits_per_generation | int | Toujours 1 — 1 essayage = 1 crédit, quel que soit le modèle |
| available | bool | true si le modèle est inclus dans votre plan actif |
Le module cabin_ai supporte nativement l'API cabine.ai en mode SaaS. Configurez votre clé API depuis Mon compte → Clés API.
# 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
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
// 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
}
gemini-3-pro-image-preview.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.
product_id et cart_id dans POST /generate pour activer le lien automatique avec les conversionsPOST /conversion depuis un hook de confirmation de commande, avec un timeout court et ignore_errors: true pour ne pas bloquer la boutiqueresult_url en base de données — les fichiers sont conservés selon la durée de votre planGET /quota avant un batch pour anticiper les erreurs 429Des questions ? support@cabine.ai
Créer un compte gratuit →