Skip to content

VanceAI Open API documentation

VanceAI API

Introduction

Exécutez le traitement IA d'images et de vidéos de VanceAI directement depuis votre application. Une seule clé API, une API de tâches unifiée pour les deux types de média, et des noms d'outils clairs qui masquent tous les détails de stockage, d'upload et de planification.

Ce que vous pouvez faire

L'API expose le moteur de traitement de VanceAI via un ensemble réduit et stable de points de terminaison REST. Vous soumettez une tâche avec un fichier ou une URL, vous interrogez son état, puis vous téléchargez le résultat. Les outils image et vidéo relèvent de la même ressource /v1/jobs — le tool choisi détermine le type de média et l'opération.

MédiaExemples d'outils
ImageAgrandissement, netteté, débruitage, suppression d'arrière-plan, restauration, cartoonisation, photo d'identité
VidéoAgrandissement

URL de base

Toutes les requêtes API sont envoyées à :

text
https://cloud-vanceai.vanceai.com/api/v1

Chaque réponse est application/json. Toutes les requêtes doivent être authentifiées avec une clé API — voir Authentification.

Comment ça marche

L'API est entièrement asynchrone et repose sur trois étapes :

text
POST /v1/jobs            → returns a job_id immediately (status: "queued")
GET  /v1/jobs/{id}       → poll until status is "succeeded" or "failed"
GET  /v1/jobs/{id}/result → fetch a fresh, never-expiring download link

Un POST ne bloque jamais pendant l'upload ou le traitement. Il valide votre requête, réserve la tâche et renvoie un job_id en quelques millisecondes. Un worker en arrière-plan gère ensuite l'upload, le traitement et le résultat — ainsi, même des vidéos de plusieurs gigaoctets fonctionnent sans atteindre les délais d'expiration HTTP.

Concepts clés

ConceptRésumé
Tâches et cycle de vieUne unité de traitement. Créée avec POST, interrogée avec GET, avec un cycle de vie : queued → processing → succeeded / failed / canceled.
OutilsDes noms clairs et stables (p. ex. upscale, video_upscale) qui sélectionnent le type de média et l'opération.
Crédits et facturationLe traitement consomme des crédits. Ils sont réservés (gelés) au démarrage d'une tâche et intégralement remboursés en cas d'échec ou d'annulation.
Gestion des clés APILes clés sk_live_ identifient votre compte. Créées et révoquées depuis le tableau de bord de votre compte.

Uniquement le polling en v1

Il n'y a pas de webhooks en v1 — vous interrogez GET /v1/jobs/{id} pour la complétion. Les rappels par webhook sont prévus pour la v1.1. Consultez le journal des modifications pour le périmètre complet de la v1.

Étapes suivantes

Prise en main

Authentification

L'API VanceAI authentifie les requêtes avec une clé API. Votre clé porte les privilèges de votre compte : gardez-la secrète.

Clés API

Les clés ressemblent à ceci et commencent toujours par le préfixe sk_live_ :

text
sk_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6

Créez et révoquez les clés depuis le tableau de bord de votre compte VanceAI. La clé complète n'est affichée qu'une seule fois, à la création — conservez-la en lieu sûr. En cas de perte, révoquez la clé et créez-en une nouvelle. Voir Gestion des clés API.

Authentifier les requêtes

Envoyez votre clé dans l'en-tête Authorization sous forme de bearer token à chaque requête :

text
Authorization: Bearer sk_live_a1b2c3d4e5f6...

Par exemple, pour vérifier votre solde de crédits :

bash
curl https://cloud-vanceai.vanceai.com/api/v1/credits \
  -H "Authorization: Bearer sk_live_a1b2c3d4e5f6..."

Gardez votre clé secrète

  • N'exposez jamais les clés sk_live_ dans du code côté client, des applications mobiles ou des dépôts publics.
  • Effectuez les appels API uniquement depuis votre propre backend.
  • Utilisez des clés distinctes par application ou environnement afin de pouvoir en révoquer une sans affecter les autres.

Erreurs d'authentification

Une clé manquante, malformée ou révoquée renvoie 401 avec un code d'erreur stable :

json
{
  "error": {
    "code": "invalid_api_key",
    "message": "The API key provided is invalid or has been disabled.",
    "type": "auth"
  }
}

Consultez Erreurs pour la liste complète des codes et leur gestion.

Prise en main

Démarrage rapide

Ce guide parcourt une tâche d'agrandissement d'image complète : soumission, polling, téléchargement. Cela prend quelques minutes et n'utilise que curl.

1. Soumettre une tâche

Envoyez l'image en multipart form data, avec le tool et sa config. Vous pouvez uploader un fichier directement (jusqu'à 200 Mo) ou fournir une image_url publique.

Uploader un fichier
curl https://cloud-vanceai.vanceai.com/api/v1/jobs \
  -H "Authorization: Bearer sk_live_..." \
  -F [email protected] \
  -F tool=upscale \
  -F 'config={"scale":4,"face_enhance":true}' \
  -F output_format=jpg

Ou soumettez une URL avec un corps JSON :

Soumettre une URL
curl https://cloud-vanceai.vanceai.com/api/v1/jobs \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "image_url": "https://example.com/photo.jpg",
    "tool": "upscale",
    "config": { "scale": 4, "face_enhance": true },
    "output_format": "jpg"
  }'

La réponse renvoie immédiatement un job_id et un statut queued :

json
{
  "job_id": "job_3f2a9c...",
  "status": "queued",
  "tool": "upscale",
  "media": "image",
  "credits_estimated": 1.0,
  "credits_charged": 0,
  "created_at": "2026-06-11T08:30:00Z"
}

2. Interroger jusqu'à la fin

Interrogez GET /v1/jobs/{job_id} jusqu'à ce que status passe à succeeded (ou failed). Pour les images, un polling toutes les ~2 secondes suffit largement.

bash
curl https://cloud-vanceai.vanceai.com/api/v1/jobs/job_3f2a9c... \
  -H "Authorization: Bearer sk_live_..."
json
{
  "job_id": "job_3f2a9c...",
  "status": "succeeded",
  "progress": 100,
  "tool": "upscale",
  "result_url": "https://.../preview?sign=...",
  "result": { "width": 4000, "height": 3000, "size": 2451234 },
  "error": null,
  "created_at": "2026-06-11T08:30:00Z",
  "finished_at": "2026-06-11T08:30:42Z"
}

3. Télécharger le résultat

Le result_url de l'étape 2 est un lien signé qui finit par expirer. Pour un lien qui n'expire jamais, appelez le point de terminaison de résultat, qui re-signe à la demande :

bash
curl -L https://cloud-vanceai.vanceai.com/api/v1/jobs/job_3f2a9c.../result \
  -H "Authorization: Bearer sk_live_..." \
  -o upscaled.jpg

C'est toute la boucle

Soumettre → interroger → télécharger est identique pour chaque outil — seuls le nom du tool et la config changent. La vidéo ajoute une étape au début : uploadez le fichier avec l'upload en deux étapes et passez son upload_id au lieu d'une image. Parcourez la liste complète sur la page Outils.

Guides

Tâches et cycle de vie

Une tâche représente un traitement — image ou vidéo. Vous la créez, vous interrogez son statut, puis vous téléchargez le résultat. Cette page est la référence complète de la ressource /v1/jobs.

Le cycle de vie d'une tâche

Chaque tâche passe par ces statuts :

statusSignification
queuedAcceptée et en attente d'un worker. Peut rester ici brièvement selon la file d'attente.
processingEn cours de traitement. Le champ phase détaille la sous-étape.
succeededTerminée. result_url et result sont disponibles.
failedÉchouée. error contient un code stable.
canceledAnnulée par vous. Les crédits réservés sont remboursés.

Pendant processing, le champ phase précise l'étape : uploadingsyncingprocessing. Le progress numérique (0–100) n'a de sens qu'une fois phase à processing ; pendant l'upload/la sync, il reste à 0. Pour les grandes vidéos, la phase d'upload peut prendre plusieurs minutes — jugez « est-ce bloqué ? » d'après phase, pas progress.

Uploader une vidéo

Les vidéos sont uploadées directement vers le stockage en deux étapes : les octets ne transitent pas par l'API et les fichiers de plusieurs gigaoctets ne sont pas limités par la taille de requête. Appelez d'abord POST /v1/uploads pour obtenir une URL d'upload présignée à usage unique, puis faites un PUT du fichier dessus. Les images sautent cette étape — uploadez-les directement lors de la création de la tâche (voir ci-dessous). L'upload vidéo multipart direct n'est pas pris en charge ; source_url reste accepté en alternative.

POST/v1/uploads

Paramètres de la requête

FieldTypeDescription
file_namerequiredstringLe nom du fichier, avec une extension vidéo (p. ex. clip.mp4). Sert à dériver la clé de stockage et le type de contenu.
file_sizenumberFacultatif. Taille du fichier en octets. Si elle est fournie, la requête échoue immédiatement si elle dépasse la limite de téléversement unique (max_bytes dans la réponse, ~4,9 Go) ; la limite est de toute façon appliquée au moment du téléversement.
content_typestringType MIME facultatif (p. ex. video/mp4). Déduit de l'extension si omis.

Exemple

bash
curl https://cloud-vanceai.vanceai.com/api/v1/uploads \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "file_name": "clip.mp4",
    "file_size": 734003200,
    "content_type": "video/mp4"
  }'

Réponse — 201 Created

json
{
  "upload_id": "upl_8f3b1c2a...",
  "put_url": "https://<bucket>.r2.cloudflarestorage.com/...&X-Amz-Signature=...",
  "expires_at": "2026-06-13T08:30:00Z",
  "max_bytes": 5261334937
}

put_url est une URL présignée valable 24 heures. Uploadez-y les octets bruts avec un seul PUT — sans en-tête d'authentification, juste le fichier :

Uploader le fichier
curl -X PUT --upload-file clip.mp4 \
  -H "Content-Type: video/mp4" \
  "https://<bucket>.r2.cloudflarestorage.com/...&X-Amz-Signature=..."

Une fois le PUT réussi, créez la tâche en passant l'upload_id au lieu d'un fichier — voir Créer une tâche. Chaque upload_id est à usage unique.

bash
curl https://cloud-vanceai.vanceai.com/api/v1/jobs \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "upload_id": "upl_8f3b1c2a...",
    "tool": "video_upscale",
    "config": { "scale": 2, "codec": "h264" }
  }'
Réponse — 202 Accepted
{
  "job_id": "job_3f2a9c...",
  "status": "queued",
  "tool": "video_upscale",
  "media": "video",
  "credits_estimated": 0,
  "credits_charged": 0,
  "created_at": "2026-06-11T08:30:00Z"
}

Limites de taille et expiration

Un seul PUT peut atteindre ~4,9 Go (le plafond exact en octets est max_bytes). Demander un upload pour un fichier plus grand renvoie 413 file_too_large. L'URL présignée expire après 24 heures ; un upload_id inutilisé devient alors upload_expired et vous devez en demander un nouveau.

Créer une tâche

POST/v1/jobs

La manière de fournir le média dépend du type. Images : un upload de fichier direct (multipart) ou une URL publique. Vidéos : un upload_id issu de l'étape d'upload ci-dessus, ou une source_url publique. Le tool sélectionne le type de média et l'opération.

Paramètres de la requête

FieldTypeDescription
image / filefileImage uniquement : upload binaire (multipart). file est un alias accepté. Pour la vidéo, utilisez upload_id.
upload_idstringVidéo uniquement : l'upload_id renvoyé par POST /v1/uploads après l'upload du fichier. À usage unique.
image_url / source_urlstringUne URL publiquement accessible à récupérer (image ou vidéo). À utiliser à la place d'un fichier / upload_id. source_url est un alias accepté.
toolrequiredstringL'opération, p. ex. upscale ou video_upscale. Voir Outils.
configobjectOptions spécifiques à l'outil (les options image et vidéo diffèrent). Voir Outils.
output_formatstringImage uniquement : jpg (défaut), png ou webp. Ignoré pour la vidéo (utilisez config.codec).

Idempotence

Passez un en-tête Idempotency-Key pour réessayer en toute sécurité une requête de création sans dupliquer la tâche. Voir Limites de débit et idempotence.

Exemple

bash
curl https://cloud-vanceai.vanceai.com/api/v1/jobs \
  -H "Authorization: Bearer sk_live_..." \
  -H "Idempotency-Key: a-unique-string" \
  -F [email protected] \
  -F tool=upscale \
  -F 'config={"scale":4,"face_enhance":true}'

Réponse — 202 Accepted

json
{
  "job_id": "job_3f2a9c...",
  "status": "queued",
  "tool": "upscale",
  "media": "image",
  "credits_estimated": 1.0,
  "credits_charged": 0,
  "created_at": "2026-06-11T08:30:00Z"
}

La réponse revient avant tout débit de crédits (credits_charged vaut 0). credits_estimated est une estimation préalable ; le débit définitif apparaît une fois la tâche en processing. Voir Crédits et facturation.

Fichiers volumineux et URLs

Les uploads directs d'images sont plafonnés à 200 Mo ; les images plus grandes renvoient 413 file_too_large — passez à source_url. Les vidéos ne passent jamais par le multipart — uploadez-les via l'étape d'upload (un seul PUT jusqu'à ~4,9 Go) ou fournissez une source_url. La récupération d'URL côté serveur est protégée contre le SSRF : seuls http/https sont autorisés et les cibles de réseau privé/interne sont rejetées.

Récupérer une tâche

GET/v1/jobs/{job_id}

Renvoie le statut actuel d'une tâche. Interrogez jusqu'à ce que la tâche atteigne un statut final.

Réponse — 200 (processing)

json
{
  "job_id": "job_3f2a9c...",
  "status": "processing",
  "phase": "uploading",
  "progress": 0,
  "tool": "video_upscale",
  "media": "video",
  "result_url": null,
  "result": null,
  "error": null,
  "created_at": "2026-06-11T08:30:00Z",
  "finished_at": null
}

Réponse — 200 (succeeded)

json
{
  "job_id": "job_3f2a9c...",
  "status": "succeeded",
  "progress": 100,
  "tool": "upscale",
  "result_url": "https://.../preview?sign=...",
  "result": { "width": 4000, "height": 3000, "size": 2451234 },
  "error": null,
  "created_at": "2026-06-11T08:30:00Z",
  "finished_at": "2026-06-11T08:30:42Z"
}

La forme de result est { width, height, size } pour les images et { width, height, duration, size, codec } pour la vidéo. Le result_url est un lien signé qui expirera — pour un lien permanent, utilisez le point de terminaison de résultat ci-dessous.

Obtenir le résultat

GET/v1/jobs/{job_id}/result

Redirige (302) vers une URL de résultat fraîchement signée — re-signée à chaque appel, donc le lien n'expire jamais. Utilisez ceci à chaque fois que vous devez télécharger la sortie, plutôt que de mettre en cache result_url.

bash
curl -L https://cloud-vanceai.vanceai.com/api/v1/jobs/job_3f2a9c.../result \
  -H "Authorization: Bearer sk_live_..." \
  -o result.jpg

Résultat pas encore prêt

Juste après le succès d'une tâche, l'objet résultat peut avoir besoin de quelques instants pour se synchroniser. Le point de terminaison réessaie en interne, mais pour de très grandes vidéos il peut renvoyer brièvement 202 result_not_ready — réessayez peu après. Le téléchargement du résultat ne coûte jamais de crédits supplémentaires.

Annuler une tâche

POST/v1/jobs/{job_id}/cancel

Annule une tâche encore queued ou processing. Surtout utile pour les longues tâches vidéo. Les crédits réservés sont intégralement remboursés.

Réponse — 200
{ "job_id": "job_3f2a9c...", "status": "canceled" }

Une tâche déjà succeeded, failed ou canceled renvoie 409 not_cancelable.

Supprimer une tâche

DELETE/v1/jobs/{job_id}

Supprime un enregistrement de tâche et son résultat associé — utile pour nettoyer les ressources traitées pour la confidentialité ou la conformité. Si la tâche est en cours, elle est d'abord annulée (et les crédits remboursés).

Réponse — 200
{ "job_id": "job_3f2a9c...", "deleted": true }
  • Supprimer une tâche déjà supprimée renvoie toujours 200 { "deleted": true } (idempotent).
  • Vous ne pouvez supprimer que les tâches de votre propre compte ; les autres renvoient 404 job_not_found.

Guides

Outils

Le tool passé à POST /v1/jobs sélectionne à la fois le type de média et l'opération. Les outils image utilisent des noms simples ; les outils vidéo sont préfixés par video_.

Outils image

Les outils image prennent un objet config. L'option face_enhance (booléen) est facultative sur la plupart des outils. Définissez output_format dans la requête pour choisir jpg / png / webp.

tooloptions de config
upscalescale (2 / 4 / 8, défaut 2), face_enhance
sharpenface_enhance
denoiseface_enhance
remove_bgnone
restoreface_enhance
cartoonizestyle, face_enhance
passport_photonone
customprompt, face_enhance
Exemple de config — upscale
{ "scale": 4, "face_enhance": true }

Validation

upscale.scale doit être 2, 4 ou 8 ; custom exige un prompt non vide. Les valeurs invalides renvoient 400 invalid_parameter. Vous n'avez pas besoin d'envoyer les dimensions source — elles sont détectées à l'upload et servent à calculer la taille cible.

Outils vidéo

Les outils vidéo sont traités de bout en bout (pas de mode aperçu en v1). Les options quality (high / medium / low) et codec (h264 / h265) s'appliquent uniquement à video_hdr et video_face_enhance. Pour video_upscale, l'encodage de sortie est déterminé par le moteur d'upscaling, donc quality / codec ne sont pas utilisés (les envoyer n'a aucun effet).

tooloptions de config
video_upscalescale (2 / 4, défaut 2), fps
video_hdrquality, codec, hdr_color_gamut
video_face_enhanceface_enhanced_mode, quality, codec
Exemple de config — video_upscale
{ "scale": 2 }

Les dimensions source sont mesurées côté serveur

Pour une facturation exacte, le serveur mesure la largeur, la hauteur, la durée et la fréquence d'images réelles de votre vidéo (via ffprobe) après l'upload — il ne fait pas confiance aux valeurs déclarées par le client. Vous pouvez éventuellement inclure source_width / source_height / duration dans config pour obtenir une estimation préalable des crédits, mais le débit définitif repose toujours sur les valeurs mesurées. La résolution de sortie est plafonnée (côté long 4096, côté court 2160) ; la dépasser fait échouer la tâche avec resolution_limit_exceeded avant tout débit de crédits.

Outils non pris en charge

Demander un outil qui n'existe pas — ou qui n'est pas encore disponible (les opérations vidéo translate, colorize et subtitle ne sont pas en v1) — renvoie 400 unsupported_tool.

Guides

Crédits et facturation

Le traitement consomme des crédits de votre compte. Les crédits sont réservés au démarrage d'une tâche, puis confirmés en cas de succès ou intégralement remboursés en cas d'échec ou d'annulation.

Comment fonctionne la facturation

Le flux des crédits sur la durée de vie d'une tâche :

ÉtapeCe qui arrive aux crédits
Tâche créée (queued)Rien n'est encore débité — credits_charged vaut 0.
Le worker démarre le traitementLes crédits sont réservés (gelés). Si votre solde est trop bas, la tâche échoue avec insufficient_credits.
Tâche succeededLa réservation est confirmée — les crédits sont déduits.
Tâche failed / canceledLa réservation est libérée — les crédits sont intégralement remboursés.
Téléchargement du résultatGratuit — jamais facturé à nouveau.

Vérification préalable à la soumission

Quand vous faites un POST de tâche, l'API effectue une vérification rapide du solde avant la mise en file. Si le coût estimé dépasse déjà votre solde disponible, vous obtenez immédiatement 402 insufficient_credits — ainsi un gros upload n'est pas gaspillé. La réservation définitive a toujours lieu au démarrage du worker.

Obtenir votre solde

GET/v1/credits
bash
curl https://cloud-vanceai.vanceai.com/api/v1/credits \
  -H "Authorization: Bearer sk_live_..."
Response: 200
{ "balance": 999.8, "used": 234.2, "frozen": 12.5 }
FieldTypeDescription
balancenumberCrédits disponibles à dépenser immédiatement (excluant déjà tout ce qui est gelé).
usednumberCrédits consommés par les tâches terminées.
frozennumberCrédits actuellement réservés par les tâches en cours (pas encore confirmés ni libérés).

Les montants de crédits sont décimaux (certaines opérations coûtent une fraction de crédit).

Guides

Limites de débit et idempotence

Deux limites protègent la plateforme : un débit de requêtes par clé et un plafond de tâches simultanées par compte. Les clés d'idempotence permettent de réessayer la création de tâche en toute sécurité.

Débit de requêtes (par clé)

Chaque clé API a une limite de débit. La dépasser renvoie 429 rate_limited avec des en-têtes décrivant votre fenêtre actuelle :

text
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1718093460

Les réponses peuvent aussi inclure un en-tête Retry-After (secondes) — respectez-le avant de réessayer.

Concurrence (par compte)

Comme une seule tâche vidéo peut durer plusieurs minutes, le débit de requêtes seul ne suffit pas. Il existe aussi un plafond sur le nombre de tâches que votre compte peut avoir en cours (queued ou processing) simultanément — généralement plus bas pour la vidéo que pour les images.

Soumettre au-delà du plafond renvoie 429 concurrency_limit_exceeded. Attendez que des tâches en cours se terminent, puis réessayez. Le décompte est agrégé par compte ; répartir le travail sur plusieurs clés ne le contourne pas.

Conseils de polling

La v1 n'a pas de webhooks, vous interrogez donc GET /v1/jobs/{id}. Pour éviter de surcharger l'API :

  • Intervalle suggéré : environ 2 s pour les images, 5 à 10 s pour la vidéo.
  • Respectez l'en-tête Retry-After lorsqu'il est présent — c'est une indication pour le prochain polling.
  • Arrêtez le polling une fois que la tâche atteint un statut final (succeeded / failed / canceled).

Idempotence

Des coupures réseau peuvent vous laisser incertain quant au succès d'un POST /v1/jobs. Pour réessayer en toute sécurité, envoyez un en-tête Idempotency-Key unique :

bash
curl https://cloud-vanceai.vanceai.com/api/v1/jobs \
  -H "Authorization: Bearer sk_live_..." \
  -H "Idempotency-Key: 8f3b1c2a-...-unique" \
  -F [email protected] \
  -F tool=upscale
  • Rejouer la même clé renvoie la tâche d'origine — pas de doublon, pas de double facturation.
  • Générez une nouvelle clé par requête logique (un UUID convient bien).
  • Réutiliser une clé avec un tool ou une config différents renvoie 409 idempotency_conflict.

Durée de validité d'une clé

Une clé reste liée à sa tâche tant que celle-ci existe. Supprimer la tâche libère la clé. Il n'y a pas de fenêtre d'expiration distincte.

Guides

Erreurs

Les erreurs arrivent dans une forme JSON cohérente avec un code stable sur lequel vous pouvez vous brancher. Il y a deux types : les erreurs de requête (renvoyées avec un statut HTTP d'erreur) et les erreurs de tâche (renvoyées sur un polling HTTP réussi avec status: failed).

Format d'erreur

json
{
  "error": {
    "code": "insufficient_credits",
    "message": "Your account does not have enough credits for this operation.",
    "type": "billing"
  }
}

code est une chaîne stable — branchez-vous dessus. message est lisible et peut changer. type est la grande catégorie : auth, billing, validation, processing, rate_limit ou server.

Erreurs de requête (statut HTTP)

Quand une requête est rejetée d'emblée, vous obtenez le statut HTTP correspondant et un corps error :

HTTPcodeQuand
401invalid_api_keyClé API manquante, invalide ou désactivée.
401unauthorizedÉchec de l'authentification.
402insufficient_creditsÉchec de la vérification de solde préalable à la soumission.
400invalid_parameterUn paramètre est manquant ou invalide.
400unsupported_toolL'outil n'existe pas ou n'est pas disponible en v1.
403geo_restrictedBloqué dans votre région.
404job_not_foundAucune tâche de ce type dans votre compte.
413file_too_largeUpload direct d'image > 200 Mo, ou upload vidéo > limite de PUT unique (~4,9 Go).
415unsupported_formatL'upload direct est dans un format non pris en charge.
409not_cancelableLa tâche est déjà dans un état final.
409idempotency_conflictMême clé d'idempotence utilisée avec un tool/config différent.
404upload_not_foundL'upload_id n'existe pas ou appartient à un autre compte.
409upload_already_consumedL'upload_id a déjà été utilisé par une autre tâche (usage unique).
410upload_expiredL'upload_id a expiré (24 h) avant utilisation — demandez-en un nouveau.
202result_not_readyRésultat encore en synchronisation — réessayez /result peu après.
429rate_limitedDébit de requêtes par clé dépassé.
429concurrency_limit_exceededTrop de tâches en cours pour le compte.
503service_unavailableUne dépendance en aval est temporairement indisponible — réessayez.
500internal_errorErreur serveur inattendue.

Erreurs de tâche (status: failed)

Quand une tâche échoue *de façon asynchrone*, interroger GET /v1/jobs/{id} renvoie HTTP 200 avec status: "failed" et un code dans error.code. N'attendez pas de 5xx pour une tâche échouée — la requête elle-même a réussi.

`error.code`typeQuand
processing_failedprocessingLe moteur de traitement n'a pas pu terminer la tâche.
processing_timeoutprocessingLa tâche a dépassé le temps de traitement maximal (crédits remboursés).
file_too_largevalidationUn source_url récupéré a dépassé 200 Mo.
unsupported_formatvalidationUn source_url récupéré avait un type ne correspondant pas à l'outil.
ssrf_blockedvalidationLe source_url a résolu vers une adresse interdite (privée/interne).
insufficient_creditsbillingLe solde a été consommé avant la réservation définitive.
upload_incompletevalidationL'objet uploadé est manquant ou incomplet — le fichier n'a pas été entièrement PUT avant la création de la tâche.
resolution_limit_exceededvalidationLa résolution de sortie dépasse la limite du moteur (côté long 4096, côté court 2160). Non facturé.

Réessayer

Considérez service_unavailable et les réponses 5xx transitoires comme réessayables (idéalement avec backoff). Considérez les erreurs billing, auth et validation comme permanentes — corrigez la requête plutôt que de réessayer.

Compte

Gestion des clés API

Les clés API sont créées et gérées depuis le tableau de bord de votre compte VanceAI. Chaque clé appartient à votre compte et puise dans le solde de crédits de votre compte.

Créer une clé

Dans votre tableau de bord, créez une nouvelle clé et donnez-lui un nom reconnaissable (par exemple my-app-prod). Le secret complet — commençant par sk_live_ — n'est affiché qu'une seule fois, juste après la création.

Copiez votre clé immédiatement

Nous ne stockons qu'un hachage de votre clé, jamais le texte en clair. Une fois la boîte de dialogue de création fermée, la clé complète ne peut plus être récupérée. En cas de perte, révoquez la clé et créez-en une nouvelle.

Consulter les clés

Le tableau de bord liste vos clés par nom, statut, un court préfixe (p. ex. sk_live_a1b2) pour l'identification, et la date de dernière utilisation de chaque clé. Le secret complet n'est plus jamais affiché — seulement le préfixe.

Révoquer une clé

La désactivation d'une clé prend effet immédiatement — toute requête ultérieure avec celle-ci renvoie 401 invalid_api_key.

  • La révocation est permanente. Pas de réactivation ; créez plutôt une nouvelle clé.
  • Vous ne pouvez gérer que les clés appartenant à votre propre compte.

Faire tourner les clés en toute sécurité

Plusieurs clés actives peuvent coexister, ce qui rend la rotation transparente : créez une nouvelle clé, basculez votre application dessus, confirmez que le trafic a migré, puis révoquez l'ancienne clé. Utiliser une clé distincte par application ou environnement limite l'impact en cas de fuite.

Ressources

Versions et journal des modifications

L'API est versionnée dans le chemin de l'URL. La version actuelle est la v1, servie sous /api/v1.

v1 — actuelle

La première version stable inclut :

  • API de tâches unifiée pour image et vidéo — POST /v1/jobs, GET /v1/jobs/{id}, GET /v1/jobs/{id}/result, POST /v1/jobs/{id}/cancel, DELETE /v1/jobs/{id} et GET /v1/credits.
  • 8 outils image et 1 outil vidéo (agrandissement).
  • Fichiers volumineux : uploads directs d'images jusqu'à 200 Mo ; vidéos via upload direct en deux étapes ; tout média via source_url (protégé contre le SSRF).
  • Traitement asynchrone avec une vérification préalable des crédits et un worker en arrière-plan.
  • Réservations de crédits avec remboursement intégral en cas d'échec ou d'annulation.
  • Codes d'erreur stables, prise en charge de Idempotency-Key, limites de débit par clé et limites de concurrence par compte.
  • Upload vidéo direct en deux étapesPOST /v1/uploads émet une URL présignée pour uploader les vidéos directement vers le stockage (un seul PUT jusqu'à ~4,9 Go), en contournant la limite de taille de requête.
  • Facturation vidéo exacte — le serveur mesure la résolution, la durée et la fréquence d'images avec ffprobe, et vérifie au préalable la résolution de sortie par rapport à la limite du moteur.