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édia | Exemples d'outils |
|---|---|
| Image | Agrandissement, netteté, débruitage, suppression d'arrière-plan, restauration, cartoonisation, photo d'identité |
| Vidéo | Agrandissement |
URL de base
Toutes les requêtes API sont envoyées à :
https://cloud-vanceai.vanceai.com/api/v1Chaque 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 :
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 linkUn 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
| Concept | Résumé |
|---|---|
| Tâches et cycle de vie | Une unité de traitement. Créée avec POST, interrogée avec GET, avec un cycle de vie : queued → processing → succeeded / failed / canceled. |
| Outils | Des noms clairs et stables (p. ex. upscale, video_upscale) qui sélectionnent le type de média et l'opération. |
| Crédits et facturation | Le 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 API | Les 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
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
- Authentification — obtenez et utilisez votre clé API.
- Démarrage rapide — votre première tâche en quelques minutes.
- Tâches et cycle de vie — la référence complète des points de terminaison.
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_ :
sk_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6Cré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 :
Authorization: Bearer sk_live_a1b2c3d4e5f6...Par exemple, pour vérifier votre solde de crédits :
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 :
{
"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.
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=jpgOu soumettez une URL avec un corps JSON :
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 :
{
"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.
curl https://cloud-vanceai.vanceai.com/api/v1/jobs/job_3f2a9c... \
-H "Authorization: Bearer sk_live_..."{
"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 :
curl -L https://cloud-vanceai.vanceai.com/api/v1/jobs/job_3f2a9c.../result \
-H "Authorization: Bearer sk_live_..." \
-o upscaled.jpgC'est toute la boucle
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 :
| status | Signification |
|---|---|
queued | Acceptée et en attente d'un worker. Peut rester ici brièvement selon la file d'attente. |
processing | En cours de traitement. Le champ phase détaille la sous-étape. |
succeeded | Terminée. result_url et result sont disponibles. |
failed | Échouée. error contient un code stable. |
canceled | Annulée par vous. Les crédits réservés sont remboursés. |
Pendant processing, le champ phase précise l'étape : uploading → syncing → processing. 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.
/v1/uploadsParamètres de la requête
| Field | Type | Description |
|---|---|---|
| file_namerequired | string | Le 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_size | number | Facultatif. 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_type | string | Type MIME facultatif (p. ex. video/mp4). Déduit de l'extension si omis. |
Exemple
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
{
"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 :
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.
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" }
}'{
"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
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
/v1/jobsLa 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
| Field | Type | Description |
|---|---|---|
| image / file | file | Image uniquement : upload binaire (multipart). file est un alias accepté. Pour la vidéo, utilisez upload_id. |
| upload_id | string | Vidéo uniquement : l'upload_id renvoyé par POST /v1/uploads après l'upload du fichier. À usage unique. |
| image_url / source_url | string | Une URL publiquement accessible à récupérer (image ou vidéo). À utiliser à la place d'un fichier / upload_id. source_url est un alias accepté. |
| toolrequired | string | L'opération, p. ex. upscale ou video_upscale. Voir Outils. |
| config | object | Options spécifiques à l'outil (les options image et vidéo diffèrent). Voir Outils. |
| output_format | string | Image 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
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
{
"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
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
/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)
{
"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)
{
"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
/v1/jobs/{job_id}/resultRedirige (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.
curl -L https://cloud-vanceai.vanceai.com/api/v1/jobs/job_3f2a9c.../result \
-H "Authorization: Bearer sk_live_..." \
-o result.jpgRésultat pas encore prêt
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
/v1/jobs/{job_id}/cancelAnnule 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.
{ "job_id": "job_3f2a9c...", "status": "canceled" }Une tâche déjà succeeded, failed ou canceled renvoie 409 not_cancelable.
Supprimer une tâche
/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).
{ "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.
| tool | options de config |
|---|---|
upscale | scale (2 / 4 / 8, défaut 2), face_enhance |
sharpen | face_enhance |
denoise | face_enhance |
remove_bg | none |
restore | face_enhance |
cartoonize | style, face_enhance |
passport_photo | none |
custom | prompt, face_enhance |
{ "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).
| tool | options de config |
|---|---|
video_upscale | scale (2 / 4, défaut 2), fps |
video_hdr | quality, codec, hdr_color_gamut |
video_face_enhance | face_enhanced_mode, quality, codec |
{ "scale": 2 }Les dimensions source sont mesurées côté serveur
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 :
| Étape | Ce 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 traitement | Les crédits sont réservés (gelés). Si votre solde est trop bas, la tâche échoue avec insufficient_credits. |
Tâche succeeded | La réservation est confirmée — les crédits sont déduits. |
Tâche failed / canceled | La réservation est libérée — les crédits sont intégralement remboursés. |
| Téléchargement du résultat | Gratuit — jamais facturé à nouveau. |
Vérification préalable à la soumission
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
/v1/creditscurl https://cloud-vanceai.vanceai.com/api/v1/credits \
-H "Authorization: Bearer sk_live_..."{ "balance": 999.8, "used": 234.2, "frozen": 12.5 }| Field | Type | Description |
|---|---|---|
| balance | number | Crédits disponibles à dépenser immédiatement (excluant déjà tout ce qui est gelé). |
| used | number | Crédits consommés par les tâches terminées. |
| frozen | number | Cré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 :
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1718093460Les 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-Afterlorsqu'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 :
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
toolou uneconfigdifférents renvoie409 idempotency_conflict.
Durée de validité d'une clé
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
{
"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 :
| HTTP | code | Quand |
|---|---|---|
| 401 | invalid_api_key | Clé API manquante, invalide ou désactivée. |
| 401 | unauthorized | Échec de l'authentification. |
| 402 | insufficient_credits | Échec de la vérification de solde préalable à la soumission. |
| 400 | invalid_parameter | Un paramètre est manquant ou invalide. |
| 400 | unsupported_tool | L'outil n'existe pas ou n'est pas disponible en v1. |
| 403 | geo_restricted | Bloqué dans votre région. |
| 404 | job_not_found | Aucune tâche de ce type dans votre compte. |
| 413 | file_too_large | Upload direct d'image > 200 Mo, ou upload vidéo > limite de PUT unique (~4,9 Go). |
| 415 | unsupported_format | L'upload direct est dans un format non pris en charge. |
| 409 | not_cancelable | La tâche est déjà dans un état final. |
| 409 | idempotency_conflict | Même clé d'idempotence utilisée avec un tool/config différent. |
| 404 | upload_not_found | L'upload_id n'existe pas ou appartient à un autre compte. |
| 409 | upload_already_consumed | L'upload_id a déjà été utilisé par une autre tâche (usage unique). |
| 410 | upload_expired | L'upload_id a expiré (24 h) avant utilisation — demandez-en un nouveau. |
| 202 | result_not_ready | Résultat encore en synchronisation — réessayez /result peu après. |
| 429 | rate_limited | Débit de requêtes par clé dépassé. |
| 429 | concurrency_limit_exceeded | Trop de tâches en cours pour le compte. |
| 503 | service_unavailable | Une dépendance en aval est temporairement indisponible — réessayez. |
| 500 | internal_error | Erreur 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` | type | Quand |
|---|---|---|
processing_failed | processing | Le moteur de traitement n'a pas pu terminer la tâche. |
processing_timeout | processing | La tâche a dépassé le temps de traitement maximal (crédits remboursés). |
file_too_large | validation | Un source_url récupéré a dépassé 200 Mo. |
unsupported_format | validation | Un source_url récupéré avait un type ne correspondant pas à l'outil. |
ssrf_blocked | validation | Le source_url a résolu vers une adresse interdite (privée/interne). |
insufficient_credits | billing | Le solde a été consommé avant la réservation définitive. |
upload_incomplete | validation | L'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_exceeded | validation | La résolution de sortie dépasse la limite du moteur (côté long 4096, côté court 2160). Non facturé. |
Réessayer
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
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}etGET /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 étapes —
POST /v1/uploadsémet une URL présignée pour uploader les vidéos directement vers le stockage (un seulPUTjusqu'à ~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.