Démarrage rapide avec les SDK officiels
Les SDK officiels encapsulent tout le parcours (création → polling → téléchargement) avec des clés d’idempotence automatiques et des erreurs typées. Le SDK Node n’a aucune dépendance ; le SDK Python dépend uniquement de httpx. Ils sont pour l’instant distribués sous forme de dépôts GitHub ; les publications sur npm et PyPI seront annoncées séparément.
Node
npm install github:openaiav/sdk-node # npm release to be announced
import { OpenAiav } from '@openaiav/sdk'
const client = new OpenAiav({ apiKey: process.env.OPENAIAV_API_KEY })
const task = await client.generations.createAndWait({
model: 'seedance-2.5-oa', prompt: 'She walks into the sunlight.',
resolution: '480p', aspectRatio: 'adaptive', durationSeconds: 4,
generateAudio: false
})
await client.generations.downloadToFile(task.id, './out.mp4')Python
pip install git+https://github.com/openaiav/sdk-python # PyPI release to be announced
from openaiav import OpenAiav
client = OpenAiav(os.environ["OPENAIAV_API_KEY"])
task = client.generations.create_and_wait({
"model": "seedance-2.5-oa", "prompt": "She walks into the sunlight.",
"resolution": "480p", "aspectRatio": "adaptive", "durationSeconds": 4,
"generateAudio": False,
})
client.generations.download_to_file(task["id"], "./out.mp4")Intégration en quatre étapes
- Utilisez la variable d’environnement
OPENAIAV_API_KEYcôté serveur pour appeler https://api.openaiav.com/v1/models et lire les clés de modèle, les tarifs et les reference_modes actuels. - Envoyez prompt, referenceMode et referenceImages en POST à /v1/generations. Les images de référence sont des URL HTTPS publiques et ne nécessitent aucun préenregistrement. La réussite renvoie HTTP 201.
- Enregistrez l’id renvoyé et interrogez le même GET /v1/generations/{id} après poll_after_ms. Continuez d’attendre pour processing, result_pending et submission_unknown ; ne créez pas d’autre tâche.
- Une fois le statut succeeded, téléchargez avec GET /v1/generations/{id}/content. Une réponse complète renvoie HTTP 200 et une plage d’octets unique 206.
Authentification et idempotence
export OPENAIAV_API_KEY='oav_...'
# One Idempotency-Key per create intent: every run of this script makes a new one.
# Reuse it only when retrying this same create. No uuidgen? IDEMPOTENCY_KEY=$(python3 -c 'import uuid;print(uuid.uuid4())')
IDEMPOTENCY_KEY=$(uuidgen | tr 'A-Z' 'a-z')
echo "Idempotency-Key: $IDEMPOTENCY_KEY (reuse this value only when retrying this same create)"Envoyez Authorization: Bearer oav_... à chaque requête et conservez la clé côté serveur. La création requiert generation:create ; le polling et le téléchargement requièrent generation:read. Générez une nouvelle Idempotency-Key (un UUID) pour chaque intention de création, afin que chaque exécution d’un exemple obtienne une nouvelle clé ; ne la réutilisez que pour relancer cette même création après un résultat réseau incertain, et n’associez jamais une même clé à des corps différents.
En-têtes de requête
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
| Authorization | string | Obligatoire | Chaque requête /v1 utilise Bearer oav_... ; conservez la clé sur votre serveur. |
| Idempotency-Key | string | Obligatoire pour créer une tâche | Générez une nouvelle valeur (par exemple un UUID) pour chaque intention de création et ne la réutilisez que pour relancer cette même création ; avec la même valeur et le même corps, rien n’est créé ni facturé deux fois. |
| Content-Type | string | Obligatoire pour POST | La création de générations utilise application/json. |
Endpoints
| Méthode | Chemin | Réussite | Permission | Description |
|---|---|---|---|---|
| GET | /v1/models | 200 | Toute clé API valide | Lit les modèles disponibles à la vente, leurs tarifs, résolutions, durées et reference_modes. Vérifiez les fonctionnalités dans le catalogue avant l’envoi. |
| POST | /v1/generation-quotes | 201 | generation:create | Affiche le prix actuel sans le bloquer. La création recalcule le prix et débite exactement le reserved_usd de sa réponse comme montant fixe ; une tâche échouée est intégralement remboursée. quoteId reste accepté et expires_at indique seulement quand actualiser. |
| POST | /v1/generations | 201 | generation:create | Crée une tâche asynchrone ; envoyez les images de référence et referenceMode dans la même requête JSON. |
| GET | /v1/generations/{id} | 200 | generation:read | Interroge la même tâche selon poll_after_ms jusqu’à ce qu’elle atteigne un état final. |
| GET | /v1/generations/{id}/content | 200 / 206 | generation:read | Télécharge le résultat après réussite ; une requête sur une seule plage d’octets renvoie 206. |
Étape 1 : lire les fonctionnalités des modèles
Ne codez pas en dur les fonctionnalités des modèles. N’envoyez que les modes listés dans reference_modes, et masquez ou bloquez les combinaisons incompatibles avant l’envoi. L’exemple minimal montre une requête de 4 secondes en 480p, sans audio, avec seedance-2.5-oa.
curl --fail-with-body 'https://api.openaiav.com/v1/models' \
--header "Authorization: Bearer $OPENAIAV_API_KEY"Exemple vidéo public minimal
L’exemple contient tout le parcours : création → polling de la même tâche → téléchargement. first_frame utilise une image de référence et adaptive ; generateAudio=false évite de demander de l’audio. Les codes de réussite sont 201, 200 et 200/206 ; en cas d’échec, examinez d’abord le code HTTP, puis error.code.
# Keep OPENAIAV_API_KEY in an environment variable; do not paste secrets into shell history.
# One Idempotency-Key per create intent: every run of this script makes a new one.
# Reuse it only when retrying this same create. No uuidgen? IDEMPOTENCY_KEY=$(python3 -c 'import uuid;print(uuid.uuid4())')
IDEMPOTENCY_KEY=$(uuidgen | tr 'A-Z' 'a-z')
echo "Idempotency-Key: $IDEMPOTENCY_KEY (reuse this value only when retrying this same create)"
# 1. Create — success: HTTP 201. On failure, the response body contains error.code.
# Lost response (timeout or dropped connection)? Re-run this same command in this shell:
# the unchanged $IDEMPOTENCY_KEY returns the original task instead of creating a second one.
curl --fail-with-body --request POST 'https://api.openaiav.com/v1/generations' \
--header "Authorization: Bearer $OPENAIAV_API_KEY" \
--header "Idempotency-Key: $IDEMPOTENCY_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "seedance-2.5-oa",
"prompt": "A young woman finishes a letter and walks from a stone cottage into the morning sunlight",
"resolution": "480p",
"aspectRatio": "adaptive",
"durationSeconds": 4,
"referenceMode": "first_frame",
"referenceImages": [
"https://developers.openaiav.com/samples/seedance-letter-reference.webp"
],
"generateAudio": false,
"outputFormat": "mp4"
}'
# 2. Save the returned id as TASK_ID. Poll the same id — success: HTTP 200.
curl --fail-with-body 'https://api.openaiav.com/v1/generations/TASK_ID' \
--header "Authorization: Bearer $OPENAIAV_API_KEY"
# Repeat step 2 after poll_after_ms until status is succeeded or failed.
# Never recreate a task whose status is submission_unknown.
# 3. After succeeded, download — success: HTTP 200 (or 206 with Range).
curl --fail-with-body --location 'https://api.openaiav.com/v1/generations/TASK_ID/content' \
--header "Authorization: Bearer $OPENAIAV_API_KEY" \
--output 'result.mp4'Paramètres de la requête
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
| model | string | Obligatoire | Utilisez la valeur model renvoyée par GET /v1/models ; l’exemple vidéo minimal utilise seedance-2.5-oa. |
| prompt | string | Obligatoire | De 1 à 4000 caractères. La référence omni peut désigner les images dans l’ordre du tableau : @Image1, @Image2, etc. |
| resolution | string | Facultatif | Doit figurer dans les resolutions du modèle choisi ; l’exemple vidéo minimal utilise 480p. |
| aspectRatio | string | Facultatif | Doit figurer dans les aspect_ratios du modèle choisi ; utilisez adaptive lorsque le modèle l’exige pour les requêtes avec première image. Pour les modèles d’image qui indiquent image_size_options, envoyez une paire resolution et aspectRatio issue de cette liste : tous les formats ne sont pas disponibles dans toutes les résolutions. |
| durationSeconds | integer | Facultatif | La durée vidéo doit être indiquée avec durationSeconds comme nombre entier dans la plage duration_seconds du catalogue ; si elle est omise, le minimum du modèle est utilisé. L’exemple minimal utilise 4 secondes. |
| referenceMode | first_frame | omni_reference | Obligatoire avec des images de référence vidéo | À utiliser uniquement avec les modèles vidéo Seedance qui indiquent explicitement le mode dans reference_modes. Une requête ne peut choisir qu’un seul mode. |
| referenceImages | string[] | À fournir avec referenceMode | URL d’images HTTPS publiques. first_frame exige exactement une image ; la limite de omni_reference figure dans reference_images_max. |
| inputImages | string[] | Facultatif | Images d’entrée (images de référence) pour la génération image vers image, uniquement pour les modèles d’image. Chaque élément est une URL d’image HTTPS publique ou une data URL de la forme data:image/png;base64,…, data:image/jpeg;base64,… ou data:image/webp;base64,…. Consultez les limites de chaque modèle dans GET /v1/models : input_images_max, input_image_max_bytes (par image, par URL ou data URL) et input_image_mime_types. Les images de référence peuvent augmenter le montant facturé. Ne les combinez pas avec un mode de référence vidéo. |
| generateAudio | boolean | Facultatif | Vaut true par défaut pour les modèles vidéo qui prennent en charge l’audio. L’exemple le moins cher envoie explicitement false ; le catalogue actuel ne prévoit aucun supplément audio distinct, et GET /v1/models fait toujours foi pour la facturation. |
| outputFormat | mp4 | mov | Facultatif | Choisissez uniquement parmi les output_formats du catalogue ; l’exemple minimal utilise mp4. |
Modes de référence
first_frame
first_frame : l’image de référence devient la première image et fixe la composition. Envoyez exactement un élément dans referenceImages ; aspectRatio provient des aspect_ratios du modèle et est fixé à adaptive lorsque le catalogue le propose (le résultat suit l’image de référence).
first_last_frame : envoyez exactement 2 referenceImages. L’ordre du tableau est la première image, puis la dernière, et le modèle génère l’intervalle. Les deux images n’ont pas besoin d’avoir les mêmes dimensions. Les modes d’image ne peuvent pas être combinés avec omni_reference.
{
"model": "seedance-2.5-oa",
"prompt": "A young woman finishes a letter and walks from a stone cottage into the morning sunlight",
"resolution": "480p",
"aspectRatio": "adaptive",
"durationSeconds": 4,
"referenceMode": "first_frame",
"referenceImages": [
"https://developers.openaiav.com/samples/seedance-letter-reference.webp"
],
"generateAudio": false,
"outputFormat": "mp4"
}omni_reference
omni_reference : les médias de référence assurent la cohérence du sujet, du style et de la scène sans devenir la première image. En plus de referenceImages, les modèles compatibles acceptent aussi referenceVideos et referenceAudios ; les limites par type figurent dans le tableau ci-dessous, et tout type non déclaré par le catalogue renvoie une erreur 400 à l’envoi. Les prompts désignent les éléments selon leur ordre dans chaque type : @Image1, @Video1, @Audio1.
{
"model": "seedance-2.5-oa",
"prompt": "Keep the identity and outfit from @Image1; a young woman walks from a stone cottage into the morning sunlight",
"resolution": "480p",
"aspectRatio": "16:9",
"durationSeconds": 4,
"referenceMode": "omni_reference",
"referenceImages": [
"https://developers.openaiav.com/samples/seedance-letter-reference.webp"
],
"generateAudio": false,
"outputFormat": "mp4"
}Compatibilité actuelle
Une seule intégration pour tous les modèles vidéo : même endpoint, mêmes champs. Changer de modèle revient à modifier model uniquement. Toutes les différences sont déclarées par le catalogue, et le tableau ci-dessous est ce catalogue : pour chaque modèle, les modes de référence pris en charge et la quantité acceptée pour chaque type de média. Tout ce que le catalogue ne déclare pas est refusé explicitement à l’envoi, jamais ignoré en silence.
Détails sur la première image et relais de la dernière image
Détails sur la première image : first_frame et omni_reference s’excluent mutuellement, une requête en choisit donc un seul. Avec la référence omni, vous pouvez orienter une image de référence vers le plan d’ouverture via le prompt ; mais si la première image doit être strictement identique, envoyez cette image en mode first_frame. Sur Seedance 2.5, les tâches avec première image fixent le format d’image à adaptive (le résultat suit la première image). Relais de la dernière image : passez returnLastFrame: true à la création, et une tâche réussie renvoie aussi last_frame_url (un PNG sans filigrane à la taille de la vidéo, conservé 24 heures). Utilisez directement cette URL comme referenceImages du first_frame de la requête suivante pour enchaîner plusieurs plans, sans étape de préenregistrement.
Tarification des vidéos de référence
- Les vidéos de référence dont la durée est mesurable sont facturées à prix fixe, que vous pouvez prévisualiser d’abord. Si leur durée ne peut pas être mesurée, la prévisualisation est refusée sans frais.
- Appelez
POST /v1/generation-quotespour voir le prix actuel. Les vidéos URL sont remesurées et revalorisées à la création ; lereserved_usdde la réponse est le montant réel.quoteIdne bloque pas le prix etexpires_atsuggère seulement une actualisation. - Le catalogue fixe les durées par vidéo et au total, le nombre de vidéos et la durée minimale facturable. Chaque vidéo de référence doit durer de 2 à 15 secondes pour la série Seedance 2.0 et de 2 à 30 secondes pour les autres modèles compatibles. Une durée mesurée hors limites renvoie 422
REFERENCE_DURATION_OUT_OF_RANGEsans frais. - Utilisez un lien direct HTTPS public vers un MP4/MOV. Une taille connue supérieure à 200 MiB renvoie
REFERENCE_VIDEO_TOO_LARGE; une taille inconnue peut être chiffrée. Les URL privées renvoientREFERENCE_URL_NOT_PUBLICet les sondes occupées 429REFERENCE_PROBE_BUSY. Les téléversements console sont limités à 32 MiB. - Pour chaque tâche, le prix de son devis,
reserved_usd, est débité à la création ; en cas de réussite, ce montant est définitif, et en cas d’échec il est intégralement remboursé. Leprice_usdd’une prévisualisation correspond à ce que coûterait la création à ce moment-là ; précisez la durée, sans -1. - Les URL publiques de vidéo sont vérifiées pour la prévisualisation puis à la création, avant d'être transmises directement sans stockage ni enregistrement. Gardez leur contenu stable. Les téléversements suivent une autre voie ; les restrictions relatives aux visages réels restent applicables.
Tarifs des modèles d’image
- Les modèles d’image sont facturés à l’image selon
resolutionetaspectRatio(image_pricing.rates). Pour les modèlesgpt-image-*etnano-banana-*, les prix affichés correspondent à un prompt court sans image de référence. - Pour ces modèles, les images de référence et les prompts plus longs augmentent le montant facturé. Avant de créer une tâche, appelez
POST /v1/generation-quotesavec le même corps :price_usdest le montant facturé pour cette requête aux prix actuels. Une tâche échouée est entièrement remboursée.
Polling et téléchargement
Seuls succeeded et failed sont des états finaux. submission_unknown signifie que l’acceptation est en cours de confirmation et result_pending en cours de finalisation : conservez l’ID de tâche d’origine, continuez l’interrogation et ne rejouez jamais la création. Après réussite, utilisez le chemin authentifié /content plutôt qu’une adresse extérieure à Open AIav. Les résultats sont conservés 24 heures (la réponse de détail contient output_expires_at ; les téléchargements expirés renvoient 410 OUTPUT_EXPIRED, enregistrez-les donc rapidement).
| État | Final | Action |
|---|---|---|
| processing | Non | Acceptée ; interrogez à nouveau après poll_after_ms. |
| result_pending | Non | Le résultat est en cours de finalisation. Conservez l’ID et interrogez la même tâche ; ne la recréez pas. |
| submission_unknown | Non | L’acceptation est en cours de confirmation ; ne rejouez pas la création. Conservez l’ID de tâche d’origine et continuez de l’interroger. |
| succeeded | Oui | Réussie ; téléchargez le résultat avec /content. |
| failed | Oui | Échec définitif, le montant a été intégralement remboursé ; consultez error_code. |
Migration des endpoints supprimés
/v1/assets, /v1/assets/content, /v1/assets/{id}, /v1/asset-groups et /v1/asset-groups/{id} sont supprimés ; une clé valide disposant de l’ancien scope correspondant reçoit HTTP 410 / ENDPOINT_RETIRED. Les nouvelles intégrations ne doivent pas appeler ces chemins ; placez referenceMode et referenceImages dans la même requête de génération.Référence des codes d’erreur
Référence complète : statut HTTP, code, signification, action conseillée et classe d’erreur du SDK. Ce tableau partage sa source de données avec la correspondance des erreurs du SDK ; les nouveaux codes inconnus sont traités par le SDK selon leur statut HTTP.
| HTTP | Code | Signification | Action conseillée | SDK |
|---|---|---|---|---|
| 401 | UNAUTHENTICATED | Clé API absente ou non reconnue. | Envoyez Authorization: Bearer oav_… ; conservez la clé côté serveur. | AuthenticationError |
| 401 | INVALID_API_KEY | La clé API est invalide ou révoquée. | Vérifiez la clé dans la console ; renouvelez-la pour en obtenir une nouvelle si nécessaire. | AuthenticationError |
| 403 | INSUFFICIENT_SCOPE | La clé n’a pas la permission (scope) requise pour cette opération. | La création requiert generation:create ; le polling et le téléchargement requièrent generation:read. | PermissionError |
| 429 | RATE_LIMITED | Les requêtes ont dépassé la limite de débit de la clé. | Patientez selon Retry-After / retryAfterSeconds avant de réessayer ; le SDK le fait automatiquement. | RateLimitError |
| 400 | IDEMPOTENCY_KEY_REQUIRED | La création requiert un en-tête Idempotency-Key. | Générez une clé unique pour chaque nouvelle requête et réutilisez-la pour les nouvelles tentatives. Le SDK en génère une automatiquement. | InvalidRequestError |
| 409 | IDEMPOTENCY_KEY_CONFLICT | La même clé d’idempotence a été utilisée avec un corps différent. | Utilisez une nouvelle clé pour des paramètres différents ; gardez la clé et le corps identiques lors des nouvelles tentatives. | InvalidRequestError |
| 400 | MODEL_NOT_FOUND | ID de modèle inconnu. | Utilisez les ID renvoyés par GET /v1/models (p. ex. seedance-2.5-oa). | InvalidRequestError |
| 503 | MODEL_NOT_AVAILABLE | Le modèle ne peut pas être appelé pour le moment. | Rien n’a été facturé. Vérifiez le status du modèle dans GET /v1/models, puis réessayez plus tard. | ServerError |
| 400 | INVALID_PROMPT | Le prompt est vide ou trop long. | Les prompts doivent comporter de 1 à 4000 caractères. | InvalidRequestError |
| 400 | INVALID_DURATION | durationSeconds sort de la plage du modèle. | Indiquez la durée vidéo par un entier durationSeconds dans la plage du catalogue. | InvalidRequestError |
| 400 | INVALID_RESOLUTION | Le modèle ne prend pas en charge cette résolution. | Choisissez une valeur parmi les resolutions du catalogue. | InvalidRequestError |
| 400 | INVALID_ASPECT_RATIO | Le modèle ne prend pas en charge ce format d’image. | Choisissez parmi les aspect_ratios du catalogue ; first_frame impose souvent adaptive. | InvalidRequestError |
| 400 | INVALID_REFERENCE_IMAGES | referenceImages doit être un tableau d’URL HTTPS publiques. | Fournissez des URL d’images https:// lisibles pendant toute la durée de la tâche. | InvalidRequestError |
| 400 | INVALID_REFERENCE_IMAGE | Un élément des images de référence n’est pas une URL valide. | Le message indique l’index (referenceImages[i]) ; corrigez cet élément. | InvalidRequestError |
| 400 | REFERENCE_IMAGE_URL_NOT_HTTPS | Une URL d’image de référence n’est pas en HTTPS public. | Les URL http, de réseau privé et data sont refusées ; hébergez l’image publiquement en HTTPS. | InvalidRequestError |
| 400 | REFERENCE_MODE_REQUIRES_IMAGES | referenceMode a été défini sans image de référence. | Fournissez referenceMode et referenceImages ensemble. | InvalidRequestError |
| 400 | REFERENCE_MODE_NOT_SUPPORTED | Le modèle ne prend pas en charge le mode de référence demandé. | Choisissez first_frame / omni_reference selon les reference_modes du catalogue. | InvalidRequestError |
| 400 | FIRST_FRAME_REQUIRES_ONE_IMAGE | first_frame accepte exactement une image de référence. | Envoyez exactement une image ; pour plusieurs images, utilisez omni_reference. | InvalidRequestError |
| 400 | TOO_MANY_REFERENCES | Le nombre d’images de référence dépasse la limite du catalogue. | Voir reference_images_max dans le catalogue. | InvalidRequestError |
| 400 | INVALID_INPUT_IMAGES | inputImages doit être un tableau. | Chaque élément est une URL HTTPS ou un base64 data:image/*. | InvalidRequestError |
| 400 | INVALID_INPUT_IMAGE | Un élément des images d’entrée est mal formé. | Chaque élément doit être une URL HTTPS ou un base64 data:image/* ; le message indique l’index. | InvalidRequestError |
| 400 | INPUT_IMAGE_URL_NOT_HTTPS | Une URL d’image d’entrée n’utilise pas HTTPS. | Utilisez une URL https:// ou une data URL comme data:image/png;base64,…. | InvalidRequestError |
| 400 | INPUT_IMAGE_TOO_LARGE | Une image intégrée dépasse 10 Mio. | Compressez-la à moins de 10 Mio. Les modèles qui indiquent input_image_max_bytes appliquent la même limite aux URL HTTPS : une image trop lourde fait échouer la tâche avec REFERENCE_INPUT_INVALID, entièrement remboursée. | InvalidRequestError |
| 400 | IMAGE_INPUT_NOT_SUPPORTED | Le modèle n’accepte pas d’image en entrée. | Seuls les modèles d’image avec input_images_max>0 acceptent inputImages. | InvalidRequestError |
| 400 | TOO_MANY_INPUT_IMAGES | Trop d’images d’entrée. | Voir input_images_max dans le catalogue. | InvalidRequestError |
| 422 | REFERENCE_DURATION_OUT_OF_RANGE | La durée mesurée de la vidéo de référence dépasse les limites du modèle. | Vérifiez dans le catalogue les limites par vidéo, de durée totale et de nombre, puis prévisualisez de nouveau le prix ; aucun montant n’a été facturé. | InvalidRequestError |
| 422 | REFERENCE_DURATION_UNVERIFIED | La durée de la vidéo de référence n’a pas pu être mesurée. | Utilisez un MP4/MOV standard, de préférence faststart, hébergé sur un serveur prenant en charge les requêtes Range. | InvalidRequestError |
| 422 | REFERENCE_URL_NOT_PUBLIC | L’URL de la vidéo de référence n’est pas une adresse HTTPS publique. | Utilisez une URL HTTPS publique de fichier sur le port 443, accessible sans connexion. | InvalidRequestError |
| 422 | CONTENT_TYPE_MISMATCH | L’URL de la vidéo de référence ne renvoie pas le format vidéo requis. | Assurez-vous que l’URL renvoie les octets d’un MP4/MOV, et non une page web ou une image. | InvalidRequestError |
| 422 | REFERENCE_VIDEO_TOO_LARGE | La vidéo de référence dépasse la limite de taille. | Les URL publiques sont limitées à 200 MiB et les téléversements console à 32 MiB. Compressez ou raccourcissez le fichier, puis prévisualisez de nouveau le prix. | InvalidRequestError |
| 429 | REFERENCE_PROBE_BUSY | Trop de vidéos de référence sont mesurées simultanément. | Réessayez après retry_after_seconds ; aucun montant n’a été facturé. | RateLimitError |
| 400 | INSUFFICIENT_BALANCE | Le solde est insuffisant pour cette tâche. | Rechargez ou utilisez un code dans le portefeuille, puis réessayez. | InvalidRequestError |
| 400 | LEGACY_ASSET_REFERENCE_RETIRED | Les références par ID de ressource sont supprimées. | Envoyez referenceMode + referenceImages (HTTPS public) dans la même requête. | InvalidRequestError |
| 404 | NOT_FOUND | La tâche n’existe pas ou appartient à un autre compte. | Vérifiez que l’ID de tâche et la clé appartiennent au même compte. | InvalidRequestError |
| 409 | OUTPUT_NOT_READY | Le résultat n’est pas encore prêt. | Continuez d’interroger la tâche selon poll_after_ms jusqu’à un état final. | InvalidRequestError |
| 410 | OUTPUT_EXPIRED | La période de téléchargement (24 h après réussite) est terminée. | Enregistrez les résultats rapidement ; après expiration, il faut relancer la génération. Utilisez output_expires_at pour afficher un compte à rebours. | OutputExpiredError |
Codes d’échec des tâches d’image
Lorsqu’une tâche d’image se termine avec status=failed, lisez error_code et comparez-le au tableau ci-dessous. Une tâche échouée est entièrement remboursée. Les SDK lèvent GenerationFailedError avec le même code.
| Code | Signification |
|---|---|
| CONTENT_POLICY_REJECTED | Le contenu n’a pas passé la vérification. Modifiez-le avant de le renvoyer. |
| REFERENCE_INPUT_INVALID | Vérifiez le format, la taille de la référence et les exigences du modèle. |
| REFERENCE_SOURCE_UNREACHABLE | L’URL de référence est illisible. Vérifiez sa validité ou importez à nouveau le fichier. |
| REFERENCE_SERVICE_UNAVAILABLE | Le traitement des références est indisponible. Contactez le support avec l’ID de tâche ; il n’est pas nécessaire de remplacer l’image. |
| GENERATION_INPUT_INVALID | Les paramètres de génération ne respectent pas les exigences de ce modèle. |
| GENERATION_RATE_LIMITED | Le service de génération est temporairement limité. Réessayez plus tard. |
| GENERATION_REJECTED | La requête de génération a été refusée. Contactez le support avec l’ID de tâche pour en connaître la raison. |
| GENERATION_SERVICE_UNAVAILABLE | Le service de génération est temporairement indisponible. |
| GENERATION_FAILED | La tâche n’a pas pu aboutir. Contactez le support avec son ID. |
Codes renvoyés uniquement dans la console
| HTTP | Code | Signification | Action conseillée |
|---|---|---|---|
| 400 | REFERENCE_UPLOAD_NOT_FOUND | La référence d’import est absente, expirée ou appartient à un autre compte. | Importez à nouveau le fichier dans le Playground et relancez (les imports sont de courte durée). |
| 429 | UPLOAD_QUOTA_EXCEEDED | Trop d’imports inutilisés. | Lancez une tâche qui utilise vos imports, ou attendez qu’ils expirent. |
| 429 | WEBHOOK_ENDPOINT_LIMIT | Nombre maximal d’endpoints de webhook atteint. | Supprimez ou désactivez un endpoint inutilisé. |
| 400 | INVALID_WEBHOOK_URL | L’URL de rappel n’est pas une adresse HTTPS accessible publiquement. | Utilisez une adresse HTTPS publique ; les hôtes privés et de bouclage sont refusés. |