Aller au contenu principal

Solution API vidéo

D’une invite ou d’une image fixe à une vidéo livrable.

La vidéo est le résultat le plus cher de la plupart des produits et le plus long à revenir. Trois champs du corps décident des deux, et la tâche continue bien après la disparition de la requête qui l’a lancée.

L’enjeu

Ce qui distingue la vidéo de toutes les autres tâches

Une requête vidéo n’est pas une requête d’image plus lente. La durée, la résolution et l’interrupteur audio fixent ce que vous payez et ce que vous attendez, avant même la première image.

01

Durée et résolution sont des molettes de prix, pas des valeurs par défaut

La plupart des points d’accès vidéo facturent à la seconde produite dans la résolution choisie. Passer duration_seconds de 5 à 10 double à peu près la facture ; monter d’un cran en résolution recommence. Les deux sont marqués comme influant sur le prix dans le schéma : l’estimation va à côté du contrôle, pas sur la facture.

02

L’audio généré relève d’un autre tarif

Là où generate_audio existe, ce booléen bascule la requête sur un autre tarif. Un formulaire qui le masque enverra discrètement la version la plus chère à chaque fois.

03

La réponse HTTP n’est pas la vidéo

createTask répond 202 Accepted avec un taskId à l’état queued. La génération se poursuit côté serveur pendant plusieurs minutes. Tout code qui attend sur la connexion d’origine expirera pendant que la tâche, et la facture, continuent.

La méthode

Fixer le prix d’abord, envoyer une seule fois ensuite

Faites estimer le corps exact avec POST /api/v1/jobs/quote, affichez le montant, puis envoyez ce même corps à createTask avec quoteId, expectedCost et une clé Idempotency-Key conservée. Un prix qui a bougé entre les deux appels échoue avec le code métier 40901 plutôt que de surgir sur la facture.

Un appel de création transporte le modèle, l’entrée validée et un rappel facultatif. HTTP 202 signifie accepté, pas terminé.

POST /api/v1/jobs/createTask

POST /api/v1/jobs/createTask
Authorization: Bearer $SPICY_API_KEY
Idempotency-Key: 7b1f0c2e-9a4d-4f31-8c67-2b5e0d9a1c44
Content-Type: application/json
{
  "model": "<publisher>/<model>/text-to-video",
  "input": {
    "prompt": "A slow aerial drift over a misty pine forest at sunrise",
    "duration_seconds": 5,
    "resolution": "1080p",
    "generate_audio": true
  },
  "callBackUrl": "https://example.com/hooks/spicyapi"
}

202 Accepted

HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3

{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_create",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued",
    "estimatedCost": "0.750000"
  }
}

Contrat

Les points à figer d’emblée

API vidéo générative : comparer, tester, intégrer — Les points à figer d’emblée
Champ ou en-têteValeur ou limite
POST /api/v1/jobs/createTask202 Accepted · state queued
duration_seconds · resolution · generate_audioprice-affecting fields
Idempotency-Key24 h · scoped to one API key
output.assets[].expiresAtsigned URL · results kept 14 days

Balayez horizontalement pour voir toutes les colonnes.

Intégration

Du premier appel à la production

  1. 01Choisissez le point d’accès sur sa page modèle et copiez la valeur model telle quelle ; le suffixe de tâche en fait partie.
  2. 02Faites estimer le corps que vous comptez envoyer et affichez estimatedCost, quantity et unit à côté du bouton d’envoi.
  3. 03Envoyez depuis le backend avec une clé d’idempotence, stockez data.taskId dans votre enregistrement et répondez immédiatement au client.
  4. 04Terminez sur le rappel signé, gardez recordInfo avec backoff exponentiel en secours, et téléchargez le fichier avant expiration de l’URL.

Pertinence

Quand cette voie convient

À choisir si

  • Vous avez besoin de fichiers vidéo finis — publicités, bandes-annonces, boucles, formats sociaux — et tolérez quelques minutes par clip.
  • La durée, la résolution et l’audio doivent être choisis par l’utilisateur, et chaque combinaison doit avoir un prix avant validation.

À éviter si

  • Vous voulez une réponse dans le cycle de la requête. Les modèles de texte diffusent en flux, pas la vidéo.
  • Vous comptez annuler en cours de génération. Une tâche acceptée va jusqu’à un état terminal ; seule la réservation inutilisée revient.

Vérifications

Ce que vous pouvez contrôler vous-même

Chaque champ vient du schéma publié

Le formulaire de chaque page modèle est généré depuis l’input_schema du point d’accès, et le serveur valide contre le même document. Un champ non déclaré renvoie 400 au lieu d’être ignoré.

L’estimation est un plafond, pas une supposition

createTask réserve le montant estimé et le renvoie dans cost avec settled: false. La facturation finale ne dépasse jamais la réservation ; un échec ou une expiration la libère intégralement.

Chaque clé a son propre plafond de dépense

Plafonnez une clé par jour, par mois et sur toute sa durée de vie, restreignez-la à certains modèles et adresses IP, et envoyez chaque écriture avec la même clé d’idempotence.

Avant la mise en production

Comportements de la plateforme à confirmer

  • Vérifiez que le point d’accès est appelable aujourd’hui ; la disponibilité est publiée par point d’accès, pas par famille.
  • Conservez ensemble taskId et clé d’idempotence, hors de la session du navigateur.
  • Vérifiez la signature du rappel avant de lire le corps, et traitez les livraisons comme répétables.
  • Copiez les médias finis dans votre propre stockage ; les résultats sont conservés 14 jours.

Questions fréquentes

Ce qu’on nous demande sur cette page

Cela dépend du point d’accès, de la durée demandée et de la file d’attente du moment : c’est pourquoi l’API est asynchrone. Traitez le 202 comme la fin de votre requête, et le rappel ou une interrogation bornée comme la fin de la tâche. Il n’existe pas de point d’accès vidéo synchrone.