Référence API

Vidéos

POST/v1/videos
GET/v1/videos/{task_id}
GET/v1/videos/{task_id}/content

Génération vidéo asynchrone (Seedance, Kling, Veo, Wan, Grok Imagine …). /v1/videos accepte les entrées texte vers vidéo et image vers vidéo dans une seule requête au format OpenAI. Elle renvoie un task_id à interroger — ou enregistrez un webhook lors de la soumission.

#Paramètres de la requête

  • modelstringobligatoire

    Un ID de modèle vidéo issu de la page des modèles, par ex. doubao-seedance-2.5.

  • promptstringobligatoire

    Description de la scène ; pour image2video, elle oriente le mouvement.

  • imagestringfacultatif

    image2video uniquement : première image de la vidéo, en URL ou en base64.

  • imagesarrayfacultatif

    Images de référence pour les fournisseurs qui acceptent plusieurs images dans une même tâche.

  • durationnumberfacultatif

    Durée du clip en secondes — une dimension de palier ; valeurs prises en charge selon la fiche du modèle.

  • secondsnumberfacultatif

    Alias utilisé par certaines familles de modèles pour la durée du clip ; privilégiez le champ duration.

  • resolutionstringfacultatif

    Palier de résolution de sortie, comme 720p ou 1080p, lorsque le modèle l'expose.

  • sizestringfacultatif

    Sélecteur de format ou de taille pour les familles de modèles qui utilisent un dimensionnement largeur x hauteur.

  • webhook_urlstringfacultatif

    URL HTTPS appelée dès que la tâche atteint un état final — voir le guide vidéo pour le contrat de callback.

  • webhook_secretstringfacultatif

    Si défini, les envois portent X-Xiaoxiang-Signature: sha256=hex(HMAC-SHA256(body, secret)).

Transmission des paramètres fournisseur

Les familles de modèles acceptent des paramètres supplémentaires propres au fournisseur (aspect_ratio, cfg_scale, negative_prompt …) transmis tels quels — la fiche du modèle les documente ; les champs inconnus sont rejetés en amont, pas par la passerelle.

Les tâches échouées sont remboursées automatiquement

Les tâches vidéo sont débitées à la soumission et intégralement remboursées si la tâche se termine en échec — le registre enregistre le remboursement avec un lien vers le débit d'origine.

#Annuler une tâche en cours

DELETE/v1/videos/:task_id

Arrête une tâche qui n'a pas atteint d'état final. En cas de succès, le quota réservé est remboursé, la tâche est enregistrée comme échouée avec le motif "cancelled by user", et tout webhook enregistré se déclenche en task.failed.

La plupart des fournisseurs ne permettent pas l'annulation

L'annulation est transmise au fournisseur en amont, et seuls certains la proposent. Tous les autres répondent 501 task_cancel_not_supported. Traitez l'annulation comme une simple tentative dans votre interface : continuez d'interroger, et ne promettez pas de remboursement à l'utilisateur avant que l'appel ne renvoie 200.
curl -X DELETE https://www.aisplice.store/v1/videos/task_xxx \
  -H "Authorization: Bearer sk-YOUR_KEY"
cancelled.json
{
  "id": "task_xxx",
  "task_id": "task_xxx",
  "status": "cancelled"
}

Notez que "cancelled" n'apparaît que dans cette réponse. Une interrogation ultérieure indique que la tâche a échoué, car c'est l'état vers lequel elle a été déplacée.

  • 404 task_not_existID de tâche inconnu, ou appartenant à un autre compte.
  • 409 task_not_cancellableLa tâche est déjà terminée — il n'y a rien à arrêter.
  • 501 task_cancel_not_supportedCe fournisseur n'expose aucune API d'annulation.

Table complète des codes d'erreur →

#Remixer une vidéo existante

POST/v1/videos/:video_id/remix

Régénère une vidéo terminée avec un nouveau prompt, sur les modèles qui le permettent. N'envoyez que prompt : le modèle, la durée, la résolution et les facteurs de prix sont hérités de la tâche d'origine, et la requête est liée au canal qui l'a produite.

curl https://www.aisplice.store/v1/videos/task_xxx/remix \
  -H "Authorization: Bearer sk-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: remix-of-task_xxx" \
  -d '{"prompt": "Same shot, at night"}'
remix.json
{
  "task_id": "task_yyy",
  "status": "queued",
  "remixed_from_video_id": "task_xxx"
}

Un remix est une nouvelle tâche facturable

Il coûte le même prix que l'original, suit le même cycle de vie et renvoie son propre task_id. Interrogez le nouvel id — l'original reste intact.
  • 400 invalid_requestprompt est obligatoire pour un remix.
  • 400 task_not_existL'id de la vidéo source est inconnu ou appartient à un autre compte.
  • 400 task_channel_disableLe canal qui a produit la vidéo d'origine n'est plus activé.

Table complète des codes d'erreur →

#Erreurs associées

  • 404 not_foundChemin inconnu, nom de modèle inconnu, ou task_id expiré / appartenant à un autre compte.
  • 422 unprocessable_entityLe fournisseur a rejeté des valeurs de paramètres transmises par la passerelle (par ex. taille ou durée non prise en charge).
  • 401Jeton bearer invalide ou manquant. Pas de error.code sur ce chemin — basez-vous sur le statut.
  • 402 insufficient_user_quotaLe solde du portefeuille ne couvre pas l'estimation préréservée.
  • 429Limitation par clé. Corps vide ; attendez Retry-After. Un 429 qui contient insufficient_user_quota correspond en revanche à un plafond de dépenses quotidien.
  • 503 model_not_foundModèle inconnu, ou aucun canal opérationnel ne le sert actuellement.

Table complète des codes d'erreur →

#Exemple de requête

# submit
curl https://www.aisplice.store/v1/videos \
  -H "Authorization: Bearer sk-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "doubao-seedance-2.5", "prompt": "A drone shot of a lighthouse at dawn"}'

# poll every 5s
curl https://www.aisplice.store/v1/videos/$TASK_ID -H "Authorization: Bearer sk-YOUR_KEY"

# download when completed
curl -L https://www.aisplice.store/v1/videos/$TASK_ID/content -o out.mp4 -H "Authorization: Bearer sk-YOUR_KEY"

#Réponse

response.json
// POST — submit accepted
{"task_id": "task_xxx", "status": "queued"}

// GET /v1/videos/{task_id}
{
  "task_id": "task_xxx",
  "status": "in_progress",      // queued | in_progress | completed | failed
  "progress": "45%"
}

// terminal state
{
  "task_id": "task_xxx",
  "status": "completed",
  "metadata": {"url": "https://…"}
}

Toujours bloqué ?

Envoyez-nous l'ID de requête ou le message d'erreur, et nous examinerons le problème.