Générations
Suivez une génération de la Direct API jusqu’à son statut final par long-polling, lisez-en plusieurs à la fois et sachez à quel rythme interroger.
Une génération est une unité de travail asynchrone : une image, une vidéo, une piste audio, un rendu. Les outils avec returns_generation: true en lancent une ou plusieurs et répondent immédiatement avec leurs identifiants. Suivez-les par sondage, par webhook, ou les deux : utilisez un webhook comme signal principal et un sondage occasionnel comme filet de sécurité.
Statuts
queued ──► in_progress ──► succeeded
│ │
│ ├──────► failed
└─────────────┴──────► cancelled| Statut | Final | Signification |
|---|---|---|
queued | non | acceptée, en attente de capacité du modèle |
in_progress | non | le modèle travaille |
succeeded | oui | assets contient le résultat |
failed | oui | error indique pourquoi ; le montant facturé est remboursé et billing.credits_refunded indique combien |
cancelled | oui | arrêtée avant d’avoir produit un résultat ; le montant facturé est remboursé |
Considérez tout statut que vous ne reconnaissez pas comme non final et continuez à suivre la génération ; de nouveaux statuts intermédiaires peuvent être ajoutés.
L’objet génération
{
"object": "generation",
"id": "0192a7b3-a1c4-7e02-8f9d-1a2b3c4d5e6f",
"tool": "generate_video",
"status": "succeeded",
"project_id": "01928f4e-5b7c-7d2a-9e11-3c4b5a6d7e8f",
"model_id": "mdl_7rk2pq9vxa4m",
"created_at": "2026-10-25T09:14:03.120Z",
"completed_at": "2026-10-25T09:15:41.902Z",
"error": null,
"billing": {
"estimated_credits": 120,
"credits_charged": 96,
"credits_refunded": 0,
"credits_are_final": true,
"credits_settle_on_output_duration": true
},
"assets": [
{
"id": "0192a7b4-0f1e-7d3c-9b8a-7c6d5e4f3a2b",
"type": "video",
"name": "Bicycle hero shot",
"mime_type": "video/mp4",
"width": 1920,
"height": 1080,
"duration_seconds": 8,
"url": "https://mcp.morphic.com/m/Xk29dPq",
"url_expires_at": null,
"studio_url": "https://studio.morphic.com/…",
"final_generation_expires_at": null
}
],
"content_left_out": [],
"render_warnings": [],
"metadata": { "order_id": "4411" },
"poll_after_seconds": null
}| Champ | Signification |
|---|---|
error | null, ou { "error_code": "…", "message": "…" } en cas de failed. Le message peut être montré à vos utilisateurs sans risque. |
billing | ce que cette génération a coûté ; voir Crédits et consommation |
assets[].id | l’identifiant d’asset que les autres outils prennent en entrée (image_asset_id, video_asset_id, …) |
assets[].url | un lien court pour télécharger le média ; il n’expire pas, et url_expires_at vaut null |
assets[].studio_url | ouvre l’asset dans Morphic Studio pour votre équipe |
assets[].final_generation_expires_at | vidéos brouillons uniquement : date jusqu’à laquelle finalize_video_draft peut en faire le rendu en pleine résolution |
content_left_out, render_warnings | compositions et exports de timeline uniquement : ce que le résultat n’a pas pu inclure, et pourquoi |
poll_after_seconds | tant que la génération n’est pas finale, le délai à respecter avant la lecture suivante ; null une fois finale |
Lire une génération
GET /v1/direct/generations/{id} répond 200 avec { "generation": { … } }.
curl -s "https://mcp.morphic.com/v1/direct/generations/$ID?wait=45" \
-H "Authorization: Bearer $MORPHIC_API_KEY"waitest facultatif, de0à45secondes. La requête reste ouverte jusqu’à ce que le statut de la génération change ou qu’elle se termine, puis répond immédiatement.- Lorsque l’attente arrive à son terme, elle répond avec l’état actuel. Une valeur supérieure à 45 est ramenée à 45.
- Une génération d’une autre organisation, ou que cette clé n’a pas le droit de lire, répond
404, jamais403, pour que les identifiants ne puissent pas être sondés.
Lire plusieurs générations
POST /v1/direct/generations/batch-get lit jusqu’à 10 générations en une seule requête.
curl -s https://mcp.morphic.com/v1/direct/generations/batch-get \
-H "Authorization: Bearer $MORPHIC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ids": ["0192a7b3-…", "0192a7b3-…"], "wait": 30}'- Avec
wait, la requête répond dès que l’une d’elles change de statut ou que toutes sont finales. - La réponse est
{ "generations": [ … ], "not_found": ["…"] }, dans l’ordre demandé.
À quel rythme interroger
Chaque lancement et chaque lecture non finale portent poll_after_seconds. Attendez au moins ce délai avant la lecture suivante, puis espacez progressivement.
| Résultat | Premier sondage après | Délai habituel avant le statut final |
|---|---|---|
| image, modification d’image, upscale, opérations sur image | 5 s | 5 à 60 s |
| voix, effet sonore, transcription | 10 s | 10 à 90 s |
| musique, dialogue | 20 s | 30 s à 3 min |
| vidéo, modification de vidéo, synchronisation labiale, rendus | 30 s | 1 à 10 min, davantage en cas de forte charge |
Un long-polling (wait=45) compte pour une seule lecture, quelle que soit la durée pendant laquelle il est maintenu : c’est donc la façon la plus rapide et la moins coûteuse d’interroger. Réglez le délai d’expiration de votre client HTTP au-dessus de l’attente : 60 s pour wait=45.
import time, requests
def wait_for(generation_id, key):
headers = {"Authorization": f"Bearer {key}"}
url = f"https://mcp.morphic.com/v1/direct/generations/{generation_id}"
while True:
r = requests.get(url, params={"wait": 45}, headers=headers, timeout=60)
if r.status_code == 429:
time.sleep(int(r.headers.get("Retry-After", "5")))
continue
r.raise_for_status()
gen = r.json()["generation"]
if gen["status"] in ("succeeded", "failed", "cancelled"):
return gen
# A long-poll already waited; only sleep if the server asks for more.
time.sleep(max(0, (gen.get("poll_after_seconds") or 0) - 45))Limites de sondage
| Limite | Valeur | En cas de dépassement |
|---|---|---|
| Lectures d’une génération par une clé | 30 par minute | 429, Retry-After |
| Lectures de toutes les générations par une clé | 1200 par minute | 429, Retry-After |
wait | 45 secondes | ramené à la limite |
| Identifiants par lecture groupée | 10 | 400 |
Une lecture groupée compte une fois par identifiant au regard des deux limites. Au rythme recommandé, une clé peut suivre plusieurs centaines de générations en cours simultanément ; si vous en suivez davantage, utilisez les webhooks.
Si vous rencontrez le moindre problème ou si vous avez des questions, n’hésitez pas à nous contacter. Nous serons ravis de vous aider. Écrivez-nous à support@morphic.com.
Appeler un outil
Appelez n’importe quel outil de la Direct API avec une seule forme de requête, lisez son résultat et sa facturation, et réessayez les appels payants sans risque grâce à un Idempotency-Key.
Webhooks
Recevez une notification signée lorsqu’une génération de la Direct API se termine, vérifiez-la, puis lisez la génération pour en obtenir le détail.