DocumentationOuvrir Moon AI
Parcourir la documentation

Vidéos

Référence de POST /v1/videos et des routes GET /v1/videos : lancer une vidéo, suivre la tâche, la télécharger, lister vos vidéos, avec les délais et les coûts.

Sur cette page

Une vidéo prend plusieurs minutes. Le lancement répond tout de suite avec une tâche ; vous suivez ensuite la tâche, puis téléchargez la vidéo une fois terminée. Les points d’accès suivent l’API vidéo d’OpenAI.

MéthodeCheminRôle
POST/v1/videosLancer une vidéo
GET/v1/videos/{id}Suivre une vidéo
GET/v1/videos/{id}/contentTélécharger la vidéo
GET/v1/videosLister vos vidéos

Une tâche passe par les statuts queued (en file), in_progress (en cours), puis completed (terminée) ou failed (en échec). Elle appartient au workspace de la clé qui l’a lancée : toute clé de ce workspace peut la suivre et la télécharger.

Exemple completLien vers la section Exemple complet

cURL
# 1. Lancer la vidéo
curl https://api.realmoon.ai/v1/videos \
  -H "Authorization: Bearer $MOONAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "alibaba/wan-2.6", "prompt": "Une vague au coucher du soleil", "seconds": "5"}'
# => {"id": "video_3c9e…", "status": "queued", …}

# 2. Suivre la tâche (toutes les 10 secondes environ)
curl https://api.realmoon.ai/v1/videos/video_3c9e... \
  -H "Authorization: Bearer $MOONAI_API_KEY"

# 3. Télécharger la vidéo une fois "completed"
curl https://api.realmoon.ai/v1/videos/video_3c9e.../content \
  -H "Authorization: Bearer $MOONAI_API_KEY" -o vague.mp4
Python
import os
import time
from openai import OpenAI

client = OpenAI(base_url="https://api.realmoon.ai/v1", api_key=os.environ["MOONAI_API_KEY"])

job = client.videos.create(
    model="alibaba/wan-2.6",
    prompt="Une vague au coucher du soleil",
    seconds="5",
    extra_body={"resolution": "720p", "aspect_ratio": "16:9"},
)
while job.status in ("queued", "in_progress"):
    time.sleep(10)
    job = client.videos.retrieve(job.id)

if job.status == "completed":
    client.videos.download_content(job.id).write_to_file("vague.mp4")
else:
    print("Échec :", job.error)
JavaScript
import fs from 'node:fs';
import OpenAI from 'openai';

const client = new OpenAI({ baseURL: 'https://api.realmoon.ai/v1', apiKey: process.env.MOONAI_API_KEY });

let job = await client.videos.create({
  model: 'alibaba/wan-2.6',
  prompt: 'Une vague au coucher du soleil',
  seconds: '5',
  resolution: '720p', // paramètre propre à Moon AI, envoyé tel quel
});
while (job.status === 'queued' || job.status === 'in_progress') {
  await new Promise((r) => setTimeout(r, 10_000));
  job = await client.videos.retrieve(job.id);
}

if (job.status === 'completed') {
  const content = await client.videos.downloadContent(job.id);
  fs.writeFileSync('vague.mp4', Buffer.from(await content.arrayBuffer()));
} else {
  console.error('Échec :', job.error);
}

Lancer une vidéoLien vers la section Lancer une vidéo

HTTP
POST https://api.realmoon.ai/v1/videos
  • Authentification : clé sk-moon-… avec la portée inference (voir Authentification).
  • Corps : JSON, ou multipart/form-data (avec l’en-tête Content-Length) pour envoyer les images de départ et de fin comme fichiers. 60 Mo au plus.
  • Réponse : l’objet vidéo de la tâche, au statut queued, avec l’en-tête X-Moon-Request-Id qui sert à lire le coût sur /v1/generation.

ParamètresLien vers la section Paramètres

ParamètreTypeObligatoireDescription
modelchaîneouiUn modèle de type video de GET /v1/models?type=video.
promptchaîneouiDescription de la vidéo, 4 000 caractères au plus.
seconds (ou duration)entier ou chaînenonDurée en secondes, parmi les durations du modèle. Par défaut : la première durée d’au moins 5 secondes, sinon la plus longue.
resolutionchaînenonParmi les resolutions du modèle (480p, 720p, 1080p, 4K…). Par défaut 720p quand le modèle le propose, sinon sa première résolution.
sizechaînenonLARGEURxHAUTEUR, par exemple 1280x720 : la résolution et le format les plus proches en sont déduits, si vous ne les donnez pas.
aspect_ratiochaînenonParmi les aspect_ratios du modèle (16:9, 9:16…). Par défaut, le premier de la liste.
generate_audiobooléennonAvec ou sans son, pour les modèles qui font du son (audio: true). Par défaut, avec son si le modèle en fait. true sur un modèle muet : 400 unsupported_value.
seedentiernonGraine, de 0 à 2 147 483 647.
input_reference, image ou first_frameimagenonImage de départ : adresse https://, adresse data: en base64, base64 seul, ou fichier en multipart. Pour les modèles où first_frame vaut true.
last_frameimagenonImage de fin, avec une image de départ, pour les modèles où last_frame vaut true.
userchaînenonAccepté, sans effet.

Tout autre paramètre est refusé avec 400 unknown_parameter. Une image fait 20 Mo au plus (PNG, JPEG, WebP ou GIF). Une image à une adresse https:// est lue par le fournisseur du modèle, pas par Moon AI.

ExempleLien vers la section Exemple

cURL
curl https://api.realmoon.ai/v1/videos \
  -H "Authorization: Bearer $MOONAI_API_KEY" \
  -F model=kwaivgi/kling-v3.0-std \
  -F prompt="La photo s’anime : les nuages défilent" \
  -F seconds=5 \
  -F generate_audio=false \
  -F first_frame=@paysage.png
Python
job = client.videos.create(
    model="kwaivgi/kling-v3.0-std",
    prompt="La photo s’anime : les nuages défilent",
    seconds="5",
    input_reference=open("paysage.png", "rb"),
    extra_body={"generate_audio": False},
)
print(job.id, job.status)
JavaScript
const job = await client.videos.create({
  model: 'kwaivgi/kling-v3.0-std',
  prompt: 'La photo s’anime : les nuages défilent',
  seconds: '5',
  input_reference: fs.createReadStream('paysage.png'),
  generate_audio: false, // paramètre propre à Moon AI, envoyé tel quel
});
console.log(job.id, job.status);

L’objet vidéoLien vers la section L’objet vidéo

POST /v1/videos, GET /v1/videos/{id} et GET /v1/videos renvoient des objets vidéo.

Objet vidéo terminé
{
  "id": "video_3c9e2f6a8b1d4e7f9a0b2c4d6e8f1a3b",
  "object": "video",
  "model": "alibaba/wan-2.6",
  "status": "completed",
  "progress": 100,
  "created_at": 1793577600,
  "completed_at": 1793577780,
  "seconds": "5",
  "size": "1280x720",
  "resolution": "720p",
  "aspect_ratio": "16:9",
  "generate_audio": true,
  "remixed_from_video_id": null,
  "error": null,
  "content_url": "/v1/videos/video_3c9e2f6a8b1d4e7f9a0b2c4d6e8f1a3b/content",
  "expires_at": 1793581380,
  "usage": { "seconds": 5, "credits": 2800 }
}
ChampTypeDescription
idchaîneIdentifiant de la tâche : video_ suivi de 32 caractères.
objectchaîneToujours video.
modelchaîneLe modèle appelé.
statuschaînequeued, in_progress, completed ou failed.
progressentierAvancement de 0 à 100, quand le fournisseur le donne ; 100 une fois terminée.
created_at, completed_atentierDates en secondes Unix. completed_at vaut null avant la fin.
secondschaîneDurée demandée au modèle.
sizechaîneDimensions qui correspondent à la résolution et au format, par exemple 1280x720.
resolution, aspect_ratio, generate_audiochaîne, chaîne, booléenCe qui a été demandé au modèle.
remixed_from_video_idnullToujours null, gardé pour la compatibilité.
content_urlchaîneUne fois terminée : l’adresse de téléchargement.
expires_atentierUne fois terminée : la date jusqu’à laquelle la vidéo reste disponible (environ une heure après la fin).
errorobjet ou nullEn cas d’échec : {"code", "message"}.
usageobjetUne fois la tâche réglée : seconds (durée) et credits (crédits facturés).

Codes de error.code d’une tâche en échec, toujours sans frais :

codeCause
generation_failedLe modèle n’a pas pu faire la vidéo.
content_policy_violationLe système de sécurité du modèle a refusé la demande.
timeoutLa vidéo n’était pas finie au bout de 6 heures et a été abandonnée.
not_foundLe fournisseur ne connaît plus la tâche.

Suivre une vidéoLien vers la section Suivre une vidéo

HTTP
GET https://api.realmoon.ai/v1/videos/{id}

Renvoie l’objet vidéo à jour.

  • Authentification : clé sk-moon-… du workspace qui a lancé la vidéo, avec la portée inference.
  • Paramètre de chemin : id, l’identifiant video_… de la tâche.
  • Interrogez la tâche toutes les 10 secondes environ : Moon AI ne demande pas l’état au fournisseur plus d’une fois toutes les 5 secondes.
  • La lecture n’est pas facturée.
cURL
curl https://api.realmoon.ai/v1/videos/video_3c9e2f6a8b1d4e7f9a0b2c4d6e8f1a3b \
  -H "Authorization: Bearer $MOONAI_API_KEY"
Python
job = client.videos.retrieve("video_3c9e2f6a8b1d4e7f9a0b2c4d6e8f1a3b")
print(job.status, job.progress)
JavaScript
const job = await client.videos.retrieve('video_3c9e2f6a8b1d4e7f9a0b2c4d6e8f1a3b');
console.log(job.status, job.progress);

Télécharger la vidéoLien vers la section Télécharger la vidéo

HTTP
GET https://api.realmoon.ai/v1/videos/{id}/content

Envoie le fichier vidéo, en général video/mp4, avec l’en-tête Content-Disposition qui propose le nom <id>.mp4.

  • Authentification : clé sk-moon-… du workspace qui a lancé la vidéo, avec la portée inference.
  • Avant la fin : 409 video_not_ready.
  • Moon AI ne garde pas la vidéo : elle est lue chez le fournisseur au moment du téléchargement. Téléchargez-la dans l’heure qui suit la fin et gardez votre copie. Quand le fournisseur ne l’a plus : 410 video_expired.
  • Au plus 4 téléchargements à la fois par workspace (au-delà : 429 too_many_concurrent).
  • Le téléchargement n’est pas facturé.
cURL
curl https://api.realmoon.ai/v1/videos/video_3c9e2f6a8b1d4e7f9a0b2c4d6e8f1a3b/content \
  -H "Authorization: Bearer $MOONAI_API_KEY" -o vague.mp4
Python
client.videos.download_content("video_3c9e2f6a8b1d4e7f9a0b2c4d6e8f1a3b").write_to_file("vague.mp4")
JavaScript
const content = await client.videos.downloadContent('video_3c9e2f6a8b1d4e7f9a0b2c4d6e8f1a3b');
fs.writeFileSync('vague.mp4', Buffer.from(await content.arrayBuffer()));

Lister vos vidéosLien vers la section Lister vos vidéos

HTTP
GET https://api.realmoon.ai/v1/videos

Liste les vidéos du workspace, les plus récentes d’abord.

ParamètreTypeObligatoireDescription
limitentiernonNombre de vidéos par page, ramené entre 1 et 100. 20 par défaut.
afterchaînenonIdentifiant d’une vidéo du workspace : la page commence après elle.
cURL
curl "https://api.realmoon.ai/v1/videos?limit=10" \
  -H "Authorization: Bearer $MOONAI_API_KEY"
Python
# Le SDK charge les pages suivantes au fil de l'itération.
for video in client.videos.list(limit=10):
    print(video.id, video.status)
JavaScript
// Le SDK charge les pages suivantes au fil de l'itération.
for await (const video of client.videos.list({ limit: 10 })) {
  console.log(video.id, video.status);
}
Réponse
{
  "object": "list",
  "data": [{ "id": "video_3c9e2f6a8b1d4e7f9a0b2c4d6e8f1a3b", "object": "video", "status": "completed" }],
  "first_id": "video_3c9e2f6a8b1d4e7f9a0b2c4d6e8f1a3b",
  "last_id": "video_3c9e2f6a8b1d4e7f9a0b2c4d6e8f1a3b",
  "has_more": false
}
ChampTypeDescription
objectchaîneToujours list.
datatableauLes objets vidéo de la page (raccourcis dans l’exemple).
first_id, last_idchaîne ou nullPremier et dernier identifiant de la page.
has_morebooléentrue s’il reste des vidéos : passez last_id dans after pour la page suivante.

ModèlesLien vers la section Modèles

Liste au 5 novembre 2026 ; la liste à jour, avec les prix par seconde, vient de GET /v1/models?type=video.

ModèleDurées (s)RésolutionsFormatsSonImage de départ / de fin
alibaba/wan-2.65, 10480p, 720p, 1080p16:9, 9:16ouioui / non
alibaba/wan-2.72 à 10720p, 1080p16:9, 9:16, 1:1, 4:3, 3:4ouioui / oui
alibaba/wan-3.02 à 15480p, 720p, 1080p16:9, 9:16, 1:1, 4:3, 3:4ouioui / oui
kwaivgi/kling-v3.0-std, kling-v3.0-pro3 à 15720p, 1080p16:9, 9:16, 1:1oui, ou sans (moins cher)oui / oui
google/veo-3.1-lite4, 6, 8720p, 1080p16:9, 9:16oui, ou sans (moins cher)oui / oui
google/veo-3.1-fast, google/veo-3.14, 6, 8720p, 1080p, 4K16:9, 9:16oui, ou sans (moins cher)oui / oui
minimax/hailuo-2.36, 101080p16:9nonoui / non
x-ai/grok-imagine-video1 à 15480p, 720p16:9, 9:16, 1:1, 4:3, 3:4, 3:2, 2:3nonoui / non
runway/gen-4.52 à 10720p16:9, 9:16nonoui / non

CoûtsLien vers la section Coûts

  • Au lancement, la tâche retient le prix de la durée demandée, avec une petite marge, plus les images de départ et de fin pour les modèles qui les facturent.
  • Une vidéo terminée est facturée au coût réel annoncé par le fournisseur (à défaut, au prix de la liste), et le reste de la retenue est rendu.
  • Une vidéo en échec, refusée, abandonnée après 6 heures, ou dont le lancement a été coupé par notre délai, ne coûte rien.
  • La retenue d’une tâche en cours compte dans le solde et les plafonds de dépense jusqu’à sa fin.

Voir Coûts et porte-monnaie.

LimitesLien vers la section Limites

  • Au plus 20 vidéos en cours à la fois par workspace (au-delà : 429 too_many_concurrent, Retry-After: 30).
  • Le lancement répond en une minute environ au plus.
  • Moon AI garde l’état de la tâche (statut, durée, résolution, format, coût), pas votre description ni la vidéo.

ErreursLien vers la section Erreurs

HTTPcodePoint d’accèsSignification
400missing_required_parameterlancementmodel ou prompt absent.
400unknown_parameterlancementParamètre inconnu.
400unsupported_valuelancementDurée, résolution, format, size ou generate_audio hors de ce que le modèle accepte.
400unsupported_parameterlancementImage de départ ou de fin sur un modèle qui ne l’accepte pas, ou paramètre refusé par le modèle (avec une indication).
400string_above_max_lengthlancementDescription de plus de 4 000 caractères.
400invalid_imagelancementImage illisible, d’un autre type ou trop grande.
400content_policy_violationlancementLe système de sécurité du modèle a refusé la demande.
400nulllancement, listeseed ou generate_audio invalide, image de fin sans image de départ, base64 invalide, after inconnu.
403org_policylancementLes règles de votre organisation refusent ce modèle.
404model_not_foundlancementModèle inconnu ou qui ne sert pas ce point d’accès.
404video_not_foundsuivi, téléchargementAucune vidéo de ce workspace ne porte cet identifiant.
409video_not_readytéléchargementLa vidéo n’est pas encore terminée.
410video_expiredtéléchargementLa vidéo n’est plus disponible chez le fournisseur.
411length_requiredlancementEnvoi multipart sans en-tête Content-Length.
413request_too_large, file_too_largelancementCorps ou image trop volumineux.
429too_many_concurrentlancement, téléchargementTrop de vidéos en cours, ou de téléchargements, dans le workspace.
429upstream_rate_limitedlancementLe modèle est surchargé : réessayez après Retry-After (10 secondes).
502upstream_errorlancement, téléchargementLe modèle a échoué, ou la vidéo n’a pas pu être lue : réessayez dans un instant.
503job_not_recordedlancementLa vidéo a été lancée mais n’a pas pu être enregistrée : contactez le support.
504upstream_timeoutlancementLe modèle n’a pas répondu à temps au lancement. Rien n’est facturé.

Les erreurs de clé, de solde et de plafonds sont dans Erreurs.

Voir aussiLien vers la section Voir aussi

  • Modèles : les champs durations, resolutions, audio, first_frame et last_frame.
  • Limites : réessayer sans lancer deux vidéos.

Moon AI

Moon AI en action

0:00

À découvrir

Captures de chat.realmoon.ai du 29 octobre 2026, avec des données fictives.

Moon AI

Vos préférences

Aucun suivi publicitaire.

Ce site ne dépose aucun cookie publicitaire ni cookie de mesure d’audience : notre serveur compte les visites sans cookie. Votre thème et la fermeture de l’information sur les cookies sont mémorisés sur cet appareil.

L’application Moon AI possède ses propres réglages de confidentialité.