Générations (jobs)
POST/api/v1/jobs/estimateportée jobs:read
Calcule le prix exact en crédits, la durée de génération et renvoie un devis signé (quote) valable 1 heure. Rien n’est débité. Repasse le quote à POST /jobs pour garantir le prix.
Corps JSON
| Champ | Type | Description |
|---|
brief | object | Le brief complet de la vidéo (sur POST /jobs : un projet est créé pour lui ; ou bien projectId).requis |
brief.subject | string | Sujet de la vidéo, en une phrase (3 à 200 caractères).requis |
brief.input | objet (variantes) | Source du contenu : { kind: "idea" } (le script est écrit pour toi), { kind: "script", text } (ton texte exact, 4 000 car. max) ou { kind: "document", text, sourceName } (faits à respecter, 40 000 car. max).Défaut : {"kind":"idea"} |
brief.audience | "beginner" | "dev" | "ops" | "decision-maker" | Public visé : beginner, dev, ops ou decision-maker.Défaut : "dev" |
brief.length | "short" | "standard" | "full" | Durée : short (45–60 s), standard (90–120 s) ou full (150–180 s).Défaut : "standard" |
brief.language | "fr" | "en" | Langue de la narration : en (anglais, par défaut) ou fr (français).Défaut : "en" |
brief.voice | string | Voix du narrateur (voir GET /catalog) : George, Sarah, Daniel, Brian, Lily, Alice, Will, Matilda. Toutes les voix parlent les deux langues.Défaut : "George" |
brief.look | objet (variantes) | Style visuel : { mode: "preset", preset: "clean" | "night" | "toon" }, { mode: "brand" } (couleurs de la marque, champ brand requis) ou { mode: "custom", description } (plan Studio).Défaut : {"mode":"preset"} |
brief.brand | object | Marque affichée : name (24 car.), site, colors (1 à 3 couleurs #RRGGBB), logo (« asset:<id> » renvoyé par POST /assets). |
brief.brand.name | string | Nom de la marque (24 caractères max).requis |
brief.brand.site | string | Site affiché en fin de vidéo (40 caractères max). |
brief.brand.colors | string[] | 1 à 3 couleurs hexadécimales #RRGGBB.requis |
brief.brand.logo | string | Logo : « asset:<id> » renvoyé par POST /assets. |
brief.notes | object | Consignes : mustShow (10 éléments à montrer max), avoid (à éviter), keyMoment, free (texte libre).Défaut : {"mustShow":[],"avoid":[]} |
brief.notes.mustShow | string[] | Éléments à montrer absolument (10 max, 80 car. chacun).Défaut : [] |
brief.notes.avoid | string[] | Éléments à éviter (10 max).Défaut : [] |
brief.notes.keyMoment | string | Le moment clé à mettre en valeur. |
brief.notes.free | string | Consignes libres (1 000 caractères max). |
brief.mascot | boolean | Ajoute un présentateur animé.Défaut : false |
brief.tier | "standard" | "studio" | standard, ou studio (qualité supérieure, +300 crédits, plan Studio).Défaut : "standard" |
brief.dimension | "2d" | "3d" | 2d (motion design à plat, par défaut) ou 3d (perspective, volume, profondeur et mouvements de caméra).Défaut : "2d" |
brief.threeD | "none" | "signature" | Ancien champ, ignoré : utilise dimension.Défaut : "none" |
voiceMode | "draft" | "final" | final = voix sous licence (plans payants), draft = voix de brouillon gratuite. Par défaut : final sur les plans payants. |
curl -X POST https://motiongist.com/api/v1/jobs/estimate \
-H "X-API-Key: $MOTIONGIST_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"brief": {
"subject": "How a CDN works",
"input": {
"kind": "idea"
},
"audience": "dev",
"length": "standard",
"language": "en",
"voice": "George",
"look": {
"mode": "preset",
"preset": "night"
},
"notes": {
"mustShow": [
"edge cache",
"latency"
],
"avoid": []
}
}
}'
{
"data": {
"total": 847,
"lines": [
{
"label": "Standard video (90–120 s)",
"credits": 700
},
{
"label": "Final voice (1,470 characters)",
"credits": 147
}
],
"quote": "eyJ3cyI6IjQ…(signed quote, pass it back unchanged)…",
"quoteExpiresAt": "2026-10-23T10:12:00.000Z",
"voiceMode": "final",
"isRevision": false,
"balance": 29153,
"allowed": true,
"blockers": [],
"overdraft": false,
"eta": {
"minutesMin": 4,
"minutesMax": 8
}
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : VALIDATION_ERROR (400)
POST/api/v1/jobsportée jobs:write
Débite les crédits et met la génération en file. Avec un quote, le prix est garanti (et refusé si le brief a changé) ; sans quote, le serveur recalcule le prix. Réponse 202 : interroge ensuite GET /jobs/{id} ou abonne-toi aux webhooks.
Corps JSON
| Champ | Type | Description |
|---|
brief | object | Le brief complet de la vidéo (sur POST /jobs : un projet est créé pour lui ; ou bien projectId). |
brief.subject | string | Sujet de la vidéo, en une phrase (3 à 200 caractères).requis |
brief.input | objet (variantes) | Source du contenu : { kind: "idea" } (le script est écrit pour toi), { kind: "script", text } (ton texte exact, 4 000 car. max) ou { kind: "document", text, sourceName } (faits à respecter, 40 000 car. max).Défaut : {"kind":"idea"} |
brief.audience | "beginner" | "dev" | "ops" | "decision-maker" | Public visé : beginner, dev, ops ou decision-maker.Défaut : "dev" |
brief.length | "short" | "standard" | "full" | Durée : short (45–60 s), standard (90–120 s) ou full (150–180 s).Défaut : "standard" |
brief.language | "fr" | "en" | Langue de la narration : en (anglais, par défaut) ou fr (français).Défaut : "en" |
brief.voice | string | Voix du narrateur (voir GET /catalog) : George, Sarah, Daniel, Brian, Lily, Alice, Will, Matilda. Toutes les voix parlent les deux langues.Défaut : "George" |
brief.look | objet (variantes) | Style visuel : { mode: "preset", preset: "clean" | "night" | "toon" }, { mode: "brand" } (couleurs de la marque, champ brand requis) ou { mode: "custom", description } (plan Studio).Défaut : {"mode":"preset"} |
brief.brand | object | Marque affichée : name (24 car.), site, colors (1 à 3 couleurs #RRGGBB), logo (« asset:<id> » renvoyé par POST /assets). |
brief.brand.name | string | Nom de la marque (24 caractères max).requis |
brief.brand.site | string | Site affiché en fin de vidéo (40 caractères max). |
brief.brand.colors | string[] | 1 à 3 couleurs hexadécimales #RRGGBB.requis |
brief.brand.logo | string | Logo : « asset:<id> » renvoyé par POST /assets. |
brief.notes | object | Consignes : mustShow (10 éléments à montrer max), avoid (à éviter), keyMoment, free (texte libre).Défaut : {"mustShow":[],"avoid":[]} |
brief.notes.mustShow | string[] | Éléments à montrer absolument (10 max, 80 car. chacun).Défaut : [] |
brief.notes.avoid | string[] | Éléments à éviter (10 max).Défaut : [] |
brief.notes.keyMoment | string | Le moment clé à mettre en valeur. |
brief.notes.free | string | Consignes libres (1 000 caractères max). |
brief.mascot | boolean | Ajoute un présentateur animé.Défaut : false |
brief.tier | "standard" | "studio" | standard, ou studio (qualité supérieure, +300 crédits, plan Studio).Défaut : "standard" |
brief.dimension | "2d" | "3d" | 2d (motion design à plat, par défaut) ou 3d (perspective, volume, profondeur et mouvements de caméra).Défaut : "2d" |
brief.threeD | "none" | "signature" | Ancien champ, ignoré : utilise dimension.Défaut : "none" |
projectId | uuid | Projet existant à générer (alternative à brief). |
quote | string | Devis signé renvoyé par l’endpoint d’estimation (valable 1 h). Garantit le prix ; sans devis sur POST /jobs, le serveur recalcule le prix. |
title | string | Titre (120 caractères max). Par défaut : le sujet. |
voiceMode | "draft" | "final" | final = voix sous licence (plans payants), draft = voix de brouillon gratuite. Par défaut : final sur les plans payants. |
curl -X POST https://motiongist.com/api/v1/jobs \
-H "X-API-Key: $MOTIONGIST_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"brief": {
"subject": "How a CDN works",
"input": {
"kind": "idea"
},
"audience": "dev",
"length": "standard",
"language": "en",
"voice": "George",
"look": {
"mode": "preset",
"preset": "night"
},
"notes": {
"mustShow": [
"edge cache",
"latency"
],
"avoid": []
}
},
"quote": "eyJ3cyI6IjQ…(signed quote, pass it back unchanged)…"
}'
{
"data": {
"job": {
"id": "7f3c2a10-5b1e-4c8a-9d2f-0e6b4a1c9d55",
"projectId": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"status": "queued",
"stage": "script",
"stageLabel": "Script",
"progress": 0,
"detail": null,
"stages": {},
"voiceMode": "final",
"isRevision": false,
"credits": 847,
"queuePosition": 1,
"cancellable": true,
"error": null,
"videoId": null,
"attempt": 1,
"source": "api",
"queuedAt": "2026-10-23T09:12:04.000Z",
"startedAt": null,
"finishedAt": null
},
"projectId": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"queuePosition": 1
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : VALIDATION_ERROR (400), QUOTE_INVALID (400), INSUFFICIENT_CREDITS (402), PLAN_REQUIRED (403), RATE_LIMITED (429)
GET/api/v1/jobsportée jobs:read
Générations de l’espace, de la plus récente à la plus ancienne, paginées par curseur.
Paramètres
| Nom | Où | Type | Description |
|---|
limit | query | integer | Nombre d’éléments (1 à 100, 20 par défaut) |
cursor | query | string | Curseur renvoyé par nextCursor pour la page suivante |
status | query | string | Filtre, une ou plusieurs valeurs séparées par des virgules : queued, running, succeeded, failed, cancelled |
since | query | date-time | Seulement les générations créées après cette date (ISO 8601) |
curl https://motiongist.com/api/v1/jobs \
-H "X-API-Key: $MOTIONGIST_API_KEY"
{
"data": {
"items": [
{
"id": "7f3c2a10-5b1e-4c8a-9d2f-0e6b4a1c9d55",
"projectId": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"status": "running",
"stage": "storyboard",
"stageLabel": "Storyboard",
"progress": 46,
"detail": "Scene 4/9",
"stages": {},
"voiceMode": "final",
"isRevision": false,
"credits": 847,
"queuePosition": 0,
"cancellable": true,
"error": null,
"videoId": null,
"attempt": 1,
"source": "api",
"queuedAt": "2026-10-23T09:12:04.000Z",
"startedAt": "2026-10-23T09:12:09.000Z",
"finishedAt": null
}
],
"nextCursor": "2026-10-23T09:12:04.000Z"
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
GET/api/v1/jobs/{id}portée jobs:read
Statut, étape (script, voix, storyboard, vérification, rendu), progression en %, position dans la file, erreur éventuelle et videoId une fois terminée. Interroge toutes les 5 à 10 secondes au plus.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant de la générationrequis |
curl https://motiongist.com/api/v1/jobs/7f3c2a10-5b1e-4c8a-9d2f-0e6b4a1c9d55 \
-H "X-API-Key: $MOTIONGIST_API_KEY"
{
"data": {
"id": "7f3c2a10-5b1e-4c8a-9d2f-0e6b4a1c9d55",
"projectId": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"status": "succeeded",
"stage": "done",
"stageLabel": "Ready",
"progress": 100,
"detail": null,
"stages": {},
"voiceMode": "final",
"isRevision": false,
"credits": 847,
"queuePosition": 0,
"cancellable": false,
"error": null,
"videoId": "c4d5e6f7-1a2b-4c3d-8e9f-0a1b2c3d4e5f",
"attempt": 1,
"source": "api",
"queuedAt": "2026-10-23T09:12:04.000Z",
"startedAt": "2026-10-23T09:12:09.000Z",
"finishedAt": "2026-10-23T09:19:41.000Z"
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404)
POST/api/v1/jobs/{id}/cancelportée jobs:write
Annule une génération tant que le rendu n’a pas commencé. En file : annulation immédiate et crédits remboursés. En cours : l’annulation est demandée au moteur, le remboursement suit.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant de la générationrequis |
curl -X POST https://motiongist.com/api/v1/jobs/7f3c2a10-5b1e-4c8a-9d2f-0e6b4a1c9d55/cancel \
-H "X-API-Key: $MOTIONGIST_API_KEY"
{
"data": {
"id": "7f3c2a10-5b1e-4c8a-9d2f-0e6b4a1c9d55",
"projectId": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"status": "cancelled",
"stage": "storyboard",
"stageLabel": "Storyboard",
"progress": 46,
"detail": "Scene 4/9",
"stages": {},
"voiceMode": "final",
"isRevision": false,
"credits": 847,
"queuePosition": 0,
"cancellable": false,
"error": null,
"videoId": null,
"attempt": 1,
"source": "api",
"queuedAt": "2026-10-23T09:12:04.000Z",
"startedAt": "2026-10-23T09:12:09.000Z",
"finishedAt": null
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404), NOT_CANCELLABLE (409)
Textes, partage et publication
GET/api/v1/videos/{id}/post-copyportée videos:read
Titre, description et hashtags pour YouTube, TikTok, Instagram et LinkedIn, dans la langue de la vidéo et dans les limites de chaque plateforme (renvoyées). Générés au premier appel puis conservés. caption est le texte réellement publié (description + hashtags).
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant de la vidéorequis |
curl https://motiongist.com/api/v1/videos/c4d5e6f7-1a2b-4c3d-8e9f-0a1b2c3d4e5f/post-copy \
-H "X-API-Key: $MOTIONGIST_API_KEY"
{
"data": {
"language": "en",
"generatedAt": "2026-10-23T09:20:00.000Z",
"platforms": {
"youtube": {
"title": "How a CDN works in 60 seconds #shorts",
"description": "Your files, next to your visitors.\n\nFollow for more explainers.",
"hashtags": [
"cdn",
"webdev",
"shorts"
],
"caption": "Your files, next to your visitors.\n\nFollow for more explainers.\n\n#cdn #webdev #shorts",
"limits": {
"title": 100,
"caption": 5000,
"hashtags": 15
}
}
}
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404)
POST/api/v1/videos/{id}/post-copyportée videos:write
Réécrit les textes (toutes les plateformes ou certaines), éventuellement dans une autre langue. Gratuit, limité à 60 appels IA par heure et par espace.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant de la vidéorequis |
Corps JSON
| Champ | Type | Description |
|---|
language | "en" | "fr" | Langue de la narration : en (anglais, par défaut) ou fr (français). |
platforms | enum[] | Only these platforms (the others are kept) |
curl -X POST https://motiongist.com/api/v1/videos/c4d5e6f7-1a2b-4c3d-8e9f-0a1b2c3d4e5f/post-copy \
-H "X-API-Key: $MOTIONGIST_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"language": "en",
"platforms": [
"tiktok"
]
}'
{
"data": {
"language": "en",
"generatedAt": "2026-10-23T09:20:00.000Z",
"platforms": {
"youtube": {
"title": "How a CDN works in 60 seconds #shorts",
"description": "Your files, next to your visitors.\n\nFollow for more explainers.",
"hashtags": [
"cdn",
"webdev",
"shorts"
],
"caption": "Your files, next to your visitors.\n\nFollow for more explainers.\n\n#cdn #webdev #shorts",
"limits": {
"title": 100,
"caption": 5000,
"hashtags": 15
}
}
}
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404), RATE_LIMITED (429)
PATCH/api/v1/videos/{id}/post-copyportée videos:write
Remplace les plateformes fournies. Un texte au-delà de la limite d’une plateforme est refusé (VALIDATION_ERROR), jamais tronqué. Les hashtags sont donnés sans #.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant de la vidéorequis |
Corps JSON
| Champ | Type | Description |
|---|
language | "en" | "fr" | Langue de la narration : en (anglais, par défaut) ou fr (français). |
platforms | object | requis |
platforms.youtube | object | |
platforms.youtube.title | string | requis |
platforms.youtube.description | string | requis |
platforms.youtube.hashtags | string[] | requis |
platforms.tiktok | object | |
platforms.tiktok.title | string | requis |
platforms.tiktok.description | string | requis |
platforms.tiktok.hashtags | string[] | requis |
platforms.instagram | object | |
platforms.instagram.title | string | requis |
platforms.instagram.description | string | requis |
platforms.instagram.hashtags | string[] | requis |
platforms.linkedin | object | |
platforms.linkedin.title | string | requis |
platforms.linkedin.description | string | requis |
platforms.linkedin.hashtags | string[] | requis |
curl -X PATCH https://motiongist.com/api/v1/videos/c4d5e6f7-1a2b-4c3d-8e9f-0a1b2c3d4e5f/post-copy \
-H "X-API-Key: $MOTIONGIST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platforms": {
"tiktok": {
"title": "How a CDN works",
"description": "Your files, next to your visitors.",
"hashtags": [
"webdev",
"cdn"
]
}
}
}'
{
"data": {
"language": "en",
"generatedAt": "2026-10-23T09:20:00.000Z",
"platforms": {
"youtube": {
"title": "How a CDN works in 60 seconds #shorts",
"description": "Your files, next to your visitors.\n\nFollow for more explainers.",
"hashtags": [
"cdn",
"webdev",
"shorts"
],
"caption": "Your files, next to your visitors.\n\nFollow for more explainers.\n\n#cdn #webdev #shorts",
"limits": {
"title": 100,
"caption": 5000,
"hashtags": 15
}
}
}
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404), VALIDATION_ERROR (400)
GET/api/v1/videos/{id}/shareportée videos:read
Page de partage publique de la vidéo : lien (non répertorié, noindex), code d’intégration, bouton, téléchargement, badge et nombre de vues. enabled=false signifie pas de lien public.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant de la vidéorequis |
curl https://motiongist.com/api/v1/videos/c4d5e6f7-1a2b-4c3d-8e9f-0a1b2c3d4e5f/share \
-H "X-API-Key: $MOTIONGIST_API_KEY"
{
"data": {
"enabled": true,
"token": "Xq3vR8kP2mWz7tLa",
"url": "https://motiongist.com/v/Xq3vR8kP2mWz7tLa",
"embedUrl": "https://motiongist.com/embed/Xq3vR8kP2mWz7tLa",
"embedCode": "<iframe src=\"https://motiongist.com/embed/Xq3vR8kP2mWz7tLa\" …></iframe>",
"cta": {
"label": "Book a demo",
"url": "https://example.com/demo"
},
"allowDownload": false,
"showBranding": true,
"brandingForced": false,
"views": 128,
"createdAt": "2026-10-23T09:25:00.000Z"
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404)
PATCH/api/v1/videos/{id}/shareportée videos:write
enabled=true crée le lien (conservé ensuite) ; enabled=false le révoque définitivement (le réactiver crée un nouveau lien). cta ajoute un bouton (URL http/https). Le plan gratuit affiche toujours le badge « Fait avec Motiongist ».
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant de la vidéorequis |
Corps JSON
| Champ | Type | Description |
|---|
enabled | boolean | requis |
cta | objet (variantes) | |
allowDownload | boolean | |
showBranding | boolean | |
curl -X PATCH https://motiongist.com/api/v1/videos/c4d5e6f7-1a2b-4c3d-8e9f-0a1b2c3d4e5f/share \
-H "X-API-Key: $MOTIONGIST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"enabled": true,
"cta": {
"label": "Book a demo",
"url": "https://example.com/demo"
},
"allowDownload": false
}'
{
"data": {
"enabled": true,
"token": "Xq3vR8kP2mWz7tLa",
"url": "https://motiongist.com/v/Xq3vR8kP2mWz7tLa",
"embedUrl": "https://motiongist.com/embed/Xq3vR8kP2mWz7tLa",
"embedCode": "<iframe src=\"https://motiongist.com/embed/Xq3vR8kP2mWz7tLa\" …></iframe>",
"cta": {
"label": "Book a demo",
"url": "https://example.com/demo"
},
"allowDownload": false,
"showBranding": true,
"brandingForced": false,
"views": 128,
"createdAt": "2026-10-23T09:25:00.000Z"
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404), VALIDATION_ERROR (400)
GET/api/v1/social-accountsportée videos:read
Comptes YouTube, TikTok, Instagram et LinkedIn connectés par les membres dans l’app web (/app/publishing ; la connexion se fait dans un navigateur). platforms indique les plateformes disponibles sur ce serveur.
curl https://motiongist.com/api/v1/social-accounts \
-H "X-API-Key: $MOTIONGIST_API_KEY"
{
"data": {
"items": [
{
"id": "01970d2c-55aa-7c1e-9d0b-3e4f5a6b7c8d",
"provider": "youtube",
"name": "Motiongist Demo",
"avatarUrl": null,
"status": "active",
"simulated": false,
"connectedAt": "2026-10-20T14:02:00.000Z",
"updatedAt": "2026-10-20T14:02:00.000Z"
}
],
"platforms": [
{
"id": "youtube",
"available": true,
"mode": "live"
}
]
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
GET/api/v1/postsportée videos:read
Publications de l’espace, filtrées par date programmée (from, to), statut ou vidéo.
Paramètres
| Nom | Où | Type | Description |
|---|
from | query | date-time | Programmées à partir de (ISO 8601 avec fuseau) |
to | query | date-time | Programmées jusqu’à |
status | query | string | scheduled, publishing, published, failed ou cancelled |
videoId | query | uuid | Seulement les publications de cette vidéo |
limit | query | integer | Nombre d’éléments (1 à 500, 100 par défaut) |
curl https://motiongist.com/api/v1/posts \
-H "X-API-Key: $MOTIONGIST_API_KEY"
{
"data": {
"items": [
{
"id": "01970d2c-77cc-7e3a-8f1b-5a6b7c8d9e0f",
"videoId": "c4d5e6f7-1a2b-4c3d-8e9f-0a1b2c3d4e5f",
"videoTitle": "How a CDN works",
"projectId": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"accountId": "01970d2c-55aa-7c1e-9d0b-3e4f5a6b7c8d",
"accountName": "Motiongist Demo",
"provider": "youtube",
"status": "scheduled",
"scheduledAt": "2026-10-30T16:30:00.000Z",
"publishedAt": null,
"copy": {
"title": "How a CDN works in 60 seconds #shorts",
"description": "Your files, next to your visitors.\n\nFollow for more explainers.",
"hashtags": [
"cdn",
"webdev",
"shorts"
]
},
"caption": "Your files, next to your visitors.\n\nFollow for more explainers.\n\n#cdn #webdev #shorts",
"options": {},
"externalId": null,
"externalUrl": null,
"error": null,
"attempts": 0,
"createdAt": "2026-10-23T09:30:00.000Z"
}
]
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
POST/api/v1/postsportée videos:write
Met une vidéo en file pour un compte connecté, maintenant (sans scheduledAt) ou à scheduledAt (jusqu’à 1 an à l’avance). Utilise les textes de post de la vidéo pour la plateforme, sauf si copy est fourni. Aucun crédit consommé. Le worker publie dans les secondes qui suivent, réessaie les erreurs temporaires (après 1 min, 5 min, 30 min) et émet post.published ou post.failed.
Corps JSON
| Champ | Type | Description |
|---|
videoId | uuid | requis |
accountId | uuid | requis |
scheduledAt | objet (variantes) | |
copy | object | |
copy.title | string | requis |
copy.description | string | requis |
copy.hashtags | string[] | requis |
options | object | |
options.privacy | "public" | "unlisted" | "private" | |
options.simulate | "transient" | "permanent" | "auth" | |
curl -X POST https://motiongist.com/api/v1/posts \
-H "X-API-Key: $MOTIONGIST_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"videoId": "c4d5e6f7-1a2b-4c3d-8e9f-0a1b2c3d4e5f",
"accountId": "01970d2c-55aa-7c1e-9d0b-3e4f5a6b7c8d",
"scheduledAt": "2026-10-30T17:30:00+01:00"
}'
{
"data": {
"id": "01970d2c-77cc-7e3a-8f1b-5a6b7c8d9e0f",
"videoId": "c4d5e6f7-1a2b-4c3d-8e9f-0a1b2c3d4e5f",
"videoTitle": "How a CDN works",
"projectId": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"accountId": "01970d2c-55aa-7c1e-9d0b-3e4f5a6b7c8d",
"accountName": "Motiongist Demo",
"provider": "youtube",
"status": "scheduled",
"scheduledAt": "2026-10-30T16:30:00.000Z",
"publishedAt": null,
"copy": {
"title": "How a CDN works in 60 seconds #shorts",
"description": "Your files, next to your visitors.\n\nFollow for more explainers.",
"hashtags": [
"cdn",
"webdev",
"shorts"
]
},
"caption": "Your files, next to your visitors.\n\nFollow for more explainers.\n\n#cdn #webdev #shorts",
"options": {},
"externalId": null,
"externalUrl": null,
"error": null,
"attempts": 0,
"createdAt": "2026-10-23T09:30:00.000Z"
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404), VALIDATION_ERROR (400)
GET/api/v1/posts/{id}portée videos:read
Statut d’une publication ; externalUrl une fois publiée, error en cas d’échec.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant de la publicationrequis |
curl https://motiongist.com/api/v1/posts/01970d2c-77cc-7e3a-8f1b-5a6b7c8d9e0f \
-H "X-API-Key: $MOTIONGIST_API_KEY"
{
"data": {
"id": "01970d2c-77cc-7e3a-8f1b-5a6b7c8d9e0f",
"videoId": "c4d5e6f7-1a2b-4c3d-8e9f-0a1b2c3d4e5f",
"videoTitle": "How a CDN works",
"projectId": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"accountId": "01970d2c-55aa-7c1e-9d0b-3e4f5a6b7c8d",
"accountName": "Motiongist Demo",
"provider": "youtube",
"status": "published",
"scheduledAt": "2026-10-30T16:30:00.000Z",
"publishedAt": "2026-10-30T16:30:08.000Z",
"copy": {
"title": "How a CDN works in 60 seconds #shorts",
"description": "Your files, next to your visitors.\n\nFollow for more explainers.",
"hashtags": [
"cdn",
"webdev",
"shorts"
]
},
"caption": "Your files, next to your visitors.\n\nFollow for more explainers.\n\n#cdn #webdev #shorts",
"options": {},
"externalId": "dQw4w9WgXcQ",
"externalUrl": "https://www.youtube.com/shorts/dQw4w9WgXcQ",
"error": null,
"attempts": 0,
"createdAt": "2026-10-23T09:30:00.000Z"
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404)
PATCH/api/v1/posts/{id}portée videos:write
Déplace une publication programmée, ou remet en file une publication en échec ou annulée (tentatives remises à zéro).
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant de la publicationrequis |
Corps JSON
| Champ | Type | Description |
|---|
scheduledAt | objet (variantes) | New time (ISO 8601 with offset); null = nowrequis |
curl -X PATCH https://motiongist.com/api/v1/posts/01970d2c-77cc-7e3a-8f1b-5a6b7c8d9e0f \
-H "X-API-Key: $MOTIONGIST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scheduledAt": "2026-10-31T09:00:00+01:00"
}'
{
"data": {
"id": "01970d2c-77cc-7e3a-8f1b-5a6b7c8d9e0f",
"videoId": "c4d5e6f7-1a2b-4c3d-8e9f-0a1b2c3d4e5f",
"videoTitle": "How a CDN works",
"projectId": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"accountId": "01970d2c-55aa-7c1e-9d0b-3e4f5a6b7c8d",
"accountName": "Motiongist Demo",
"provider": "youtube",
"status": "scheduled",
"scheduledAt": "2026-10-30T16:30:00.000Z",
"publishedAt": null,
"copy": {
"title": "How a CDN works in 60 seconds #shorts",
"description": "Your files, next to your visitors.\n\nFollow for more explainers.",
"hashtags": [
"cdn",
"webdev",
"shorts"
]
},
"caption": "Your files, next to your visitors.\n\nFollow for more explainers.\n\n#cdn #webdev #shorts",
"options": {},
"externalId": null,
"externalUrl": null,
"error": null,
"attempts": 0,
"createdAt": "2026-10-23T09:30:00.000Z"
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404), CONFLICT (409), VALIDATION_ERROR (400)
DELETE/api/v1/posts/{id}portée videos:write
Annule une publication qui n’a pas commencé (CONFLICT sinon).
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant de la publicationrequis |
curl -X DELETE https://motiongist.com/api/v1/posts/01970d2c-77cc-7e3a-8f1b-5a6b7c8d9e0f \
-H "X-API-Key: $MOTIONGIST_API_KEY"
{
"data": {
"id": "01970d2c-77cc-7e3a-8f1b-5a6b7c8d9e0f",
"videoId": "c4d5e6f7-1a2b-4c3d-8e9f-0a1b2c3d4e5f",
"videoTitle": "How a CDN works",
"projectId": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"accountId": "01970d2c-55aa-7c1e-9d0b-3e4f5a6b7c8d",
"accountName": "Motiongist Demo",
"provider": "youtube",
"status": "cancelled",
"scheduledAt": "2026-10-30T16:30:00.000Z",
"publishedAt": null,
"copy": {
"title": "How a CDN works in 60 seconds #shorts",
"description": "Your files, next to your visitors.\n\nFollow for more explainers.",
"hashtags": [
"cdn",
"webdev",
"shorts"
]
},
"caption": "Your files, next to your visitors.\n\nFollow for more explainers.\n\n#cdn #webdev #shorts",
"options": {},
"externalId": null,
"externalUrl": null,
"error": null,
"attempts": 0,
"createdAt": "2026-10-23T09:30:00.000Z"
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404), CONFLICT (409)
Projets
GET/api/v1/projectsportée jobs:read
Projets (brouillons du studio) de l’espace, triés par dernière modification.
Paramètres
| Nom | Où | Type | Description |
|---|
limit | query | integer | Nombre d’éléments (1 à 100, 20 par défaut) |
cursor | query | string | Curseur renvoyé par nextCursor pour la page suivante |
status | query | string | draft, queued, generating, ready ou failed |
q | query | string | Recherche dans le titre |
curl https://motiongist.com/api/v1/projects \
-H "X-API-Key: $MOTIONGIST_API_KEY"
{
"data": {
"items": [
{
"id": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"title": "How a CDN works",
"status": "draft",
"draft": {
"subject": "How a CDN works",
"inputKind": "script",
"audience": "dev",
"length": "standard",
"language": "en",
"voice": "George",
"look": {
"mode": "preset",
"preset": "night"
},
"notes": {
"mustShow": [],
"avoid": []
},
"mascot": false,
"tier": "standard",
"format": "9:16",
"captions": true,
"music": true
},
"script": "Your site takes 3 seconds to load in Tokyo? The problem isn’t your server. It’s the distance…",
"narration": null,
"latestJobId": null,
"latestVideoId": null,
"source": "api",
"createdAt": "2026-10-23T09:02:11.000Z",
"updatedAt": "2026-10-23T09:04:37.000Z",
"url": "https://motiongist.com/app/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b"
}
],
"nextCursor": "2026-10-23T09:12:04.000Z"
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
POST/api/v1/projectsportée jobs:write
Crée un brouillon, comme dans le studio : réglages, script, écoute de la voix, puis estimation et génération. Pratique pour un agent qui itère avec l’utilisateur avant de payer. Le projet apparaît aussi dans le studio web.
Corps JSON
| Champ | Type | Description |
|---|
title | string | Titre (120 caractères max). Par défaut : le sujet. |
script | string | Texte exact à narrer. Sans script, POST /projects/{id}/script en écrit un. |
draft | object | Réglages du projet : sujet, public, durée, langue (en ou fr), voix, look, marque, notes… |
draft.subject | string | Sujet de la vidéo. |
draft.inputKind | "idea" | "script" | "url" | "document" | idea, script, url ou document. |
draft.sourceText | string | Texte source (document, page web) dont les faits doivent être utilisés. |
draft.sourceName | string | |
draft.sourceUrl | string | |
draft.audience | "beginner" | "dev" | "ops" | "decision-maker" | Public visé : beginner, dev, ops ou decision-maker. |
draft.length | "short" | "standard" | "full" | Durée : short (45–60 s), standard (90–120 s) ou full (150–180 s). |
draft.language | "fr" | "en" | Langue de la narration : en (anglais, par défaut) ou fr (français). |
draft.voice | string | Voix du narrateur (voir GET /catalog) : George, Sarah, Daniel, Brian, Lily, Alice, Will, Matilda. Toutes les voix parlent les deux langues. |
draft.look | objet (variantes) | Style visuel : { mode: "preset", preset: "clean" | "night" | "toon" }, { mode: "brand" } (couleurs de la marque, champ brand requis) ou { mode: "custom", description } (plan Studio). |
draft.brand | object | Marque affichée : name (24 car.), site, colors (1 à 3 couleurs #RRGGBB), logo (« asset:<id> » renvoyé par POST /assets). |
draft.brand.name | string | Nom de la marque (24 caractères max).requis |
draft.brand.site | string | Site affiché en fin de vidéo (40 caractères max). |
draft.brand.colors | string[] | 1 à 3 couleurs hexadécimales #RRGGBB.requis |
draft.brand.logo | string | Logo : « asset:<id> » renvoyé par POST /assets. |
draft.notes | object | Consignes : mustShow (10 éléments à montrer max), avoid (à éviter), keyMoment, free (texte libre). |
draft.notes.mustShow | string[] | Éléments à montrer absolument (10 max, 80 car. chacun). |
draft.notes.avoid | string[] | Éléments à éviter (10 max). |
draft.notes.keyMoment | string | Le moment clé à mettre en valeur. |
draft.notes.free | string | Consignes libres (1 000 caractères max). |
draft.mascot | boolean | Ajoute un présentateur animé. |
draft.tier | "standard" | "studio" | standard, ou studio (qualité supérieure, +300 crédits, plan Studio). |
draft.dimension | "2d" | "3d" | 2d (motion design à plat, par défaut) ou 3d (perspective, volume, profondeur et mouvements de caméra). |
draft.format | "9:16" | "16:9" | Format : 9:16 (vertical) ou 16:9. |
draft.captions | boolean | Sous-titres incrustés. |
draft.music | boolean | Musique de fond. |
curl -X POST https://motiongist.com/api/v1/projects \
-H "X-API-Key: $MOTIONGIST_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"draft": {
"subject": "How a CDN works",
"length": "standard",
"language": "en",
"voice": "George",
"look": {
"mode": "preset",
"preset": "night"
}
}
}'
{
"data": {
"id": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"title": "How a CDN works",
"status": "draft",
"draft": {
"subject": "How a CDN works",
"inputKind": "script",
"audience": "dev",
"length": "standard",
"language": "en",
"voice": "George",
"look": {
"mode": "preset",
"preset": "night"
},
"notes": {
"mustShow": [],
"avoid": []
},
"mascot": false,
"tier": "standard",
"format": "9:16",
"captions": true,
"music": true
},
"script": "Your site takes 3 seconds to load in Tokyo? The problem isn’t your server. It’s the distance…",
"narration": null,
"latestJobId": null,
"latestVideoId": null,
"source": "api",
"createdAt": "2026-10-23T09:02:11.000Z",
"updatedAt": "2026-10-23T09:04:37.000Z",
"url": "https://motiongist.com/app/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b"
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : VALIDATION_ERROR (400)
GET/api/v1/projects/{id}portée jobs:read
Réglages, script, aperçu de narration, dernière génération et dernière vidéo du projet.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant du projetrequis |
curl https://motiongist.com/api/v1/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b \
-H "X-API-Key: $MOTIONGIST_API_KEY"
{
"data": {
"id": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"title": "How a CDN works",
"status": "draft",
"draft": {
"subject": "How a CDN works",
"inputKind": "script",
"audience": "dev",
"length": "standard",
"language": "en",
"voice": "George",
"look": {
"mode": "preset",
"preset": "night"
},
"notes": {
"mustShow": [],
"avoid": []
},
"mascot": false,
"tier": "standard",
"format": "9:16",
"captions": true,
"music": true
},
"script": "Your site takes 3 seconds to load in Tokyo? The problem isn’t your server. It’s the distance…",
"narration": null,
"latestJobId": null,
"latestVideoId": null,
"source": "api",
"createdAt": "2026-10-23T09:02:11.000Z",
"updatedAt": "2026-10-23T09:04:37.000Z",
"url": "https://motiongist.com/app/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b"
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404)
PATCH/api/v1/projects/{id}portée jobs:write
Modifie le titre, le script (null pour l’effacer) ou une partie des réglages (fusionnés avec l’existant). Toute modification invalide le devis précédent.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant du projetrequis |
Corps JSON
| Champ | Type | Description |
|---|
title | string | Titre (120 caractères max). Par défaut : le sujet. |
script | objet (variantes) | Texte exact à narrer. Sans script, POST /projects/{id}/script en écrit un. |
draft | object | Réglages du projet : sujet, public, durée, langue (en ou fr), voix, look, marque, notes… |
draft.subject | string | Sujet de la vidéo. |
draft.inputKind | "idea" | "script" | "url" | "document" | idea, script, url ou document. |
draft.sourceText | string | Texte source (document, page web) dont les faits doivent être utilisés. |
draft.sourceName | string | |
draft.sourceUrl | string | |
draft.audience | "beginner" | "dev" | "ops" | "decision-maker" | Public visé : beginner, dev, ops ou decision-maker. |
draft.length | "short" | "standard" | "full" | Durée : short (45–60 s), standard (90–120 s) ou full (150–180 s). |
draft.language | "fr" | "en" | Langue de la narration : en (anglais, par défaut) ou fr (français). |
draft.voice | string | Voix du narrateur (voir GET /catalog) : George, Sarah, Daniel, Brian, Lily, Alice, Will, Matilda. Toutes les voix parlent les deux langues. |
draft.look | objet (variantes) | Style visuel : { mode: "preset", preset: "clean" | "night" | "toon" }, { mode: "brand" } (couleurs de la marque, champ brand requis) ou { mode: "custom", description } (plan Studio). |
draft.brand | object | Marque affichée : name (24 car.), site, colors (1 à 3 couleurs #RRGGBB), logo (« asset:<id> » renvoyé par POST /assets). |
draft.brand.name | string | Nom de la marque (24 caractères max).requis |
draft.brand.site | string | Site affiché en fin de vidéo (40 caractères max). |
draft.brand.colors | string[] | 1 à 3 couleurs hexadécimales #RRGGBB.requis |
draft.brand.logo | string | Logo : « asset:<id> » renvoyé par POST /assets. |
draft.notes | object | Consignes : mustShow (10 éléments à montrer max), avoid (à éviter), keyMoment, free (texte libre). |
draft.notes.mustShow | string[] | Éléments à montrer absolument (10 max, 80 car. chacun). |
draft.notes.avoid | string[] | Éléments à éviter (10 max). |
draft.notes.keyMoment | string | Le moment clé à mettre en valeur. |
draft.notes.free | string | Consignes libres (1 000 caractères max). |
draft.mascot | boolean | Ajoute un présentateur animé. |
draft.tier | "standard" | "studio" | standard, ou studio (qualité supérieure, +300 crédits, plan Studio). |
draft.dimension | "2d" | "3d" | 2d (motion design à plat, par défaut) ou 3d (perspective, volume, profondeur et mouvements de caméra). |
draft.format | "9:16" | "16:9" | Format : 9:16 (vertical) ou 16:9. |
draft.captions | boolean | Sous-titres incrustés. |
draft.music | boolean | Musique de fond. |
curl -X PATCH https://motiongist.com/api/v1/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b \
-H "X-API-Key: $MOTIONGIST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"draft": {
"voice": "Sarah",
"length": "short"
}
}'
{
"data": {
"id": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"title": "How a CDN works",
"status": "draft",
"draft": {
"subject": "How a CDN works",
"inputKind": "script",
"audience": "dev",
"length": "standard",
"language": "en",
"voice": "George",
"look": {
"mode": "preset",
"preset": "night"
},
"notes": {
"mustShow": [],
"avoid": []
},
"mascot": false,
"tier": "standard",
"format": "9:16",
"captions": true,
"music": true
},
"script": "Your site takes 3 seconds to load in Tokyo? The problem isn’t your server. It’s the distance…",
"narration": null,
"latestJobId": null,
"latestVideoId": null,
"source": "api",
"createdAt": "2026-10-23T09:02:11.000Z",
"updatedAt": "2026-10-23T09:04:37.000Z",
"url": "https://motiongist.com/app/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b"
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404), VALIDATION_ERROR (400)
DELETE/api/v1/projects/{id}portée jobs:write
Supprime le projet et ses vidéos. Refusé (409) si une génération est en cours.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant du projetrequis |
curl -X DELETE https://motiongist.com/api/v1/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b \
-H "X-API-Key: $MOTIONGIST_API_KEY"
{
"data": {
"id": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"deleted": true
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404), CONFLICT (409)
POST/api/v1/projects/{id}/scriptportée jobs:write
Écrit un script narré (accroche, une idée par phrase, récap) à partir du sujet du projet ou du document source, dans la langue du projet, et l’enregistre dans le projet. Gratuit, limité à 60 appels IA par heure et par espace.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant du projetrequis |
Corps JSON
| Champ | Type | Description |
|---|
topic | string | Sujet à traiter (3 à 500 caractères ; pour /projects/{id}/script, le sujet du projet par défaut). |
tone | string | Ton souhaité, ex. « drôle et direct » (120 caractères max). |
curl -X POST https://motiongist.com/api/v1/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b/script \
-H "X-API-Key: $MOTIONGIST_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"tone": "direct, with a touch of humor"
}'
{
"data": {
"title": "How a CDN works",
"script": "Your site takes 3 seconds to load in Tokyo? The problem isn’t your server. It’s the distance…",
"words": 246,
"seconds": 100,
"source": "llm",
"project": {
"id": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"title": "How a CDN works",
"status": "draft",
"draft": {
"subject": "How a CDN works",
"inputKind": "script",
"audience": "dev",
"length": "standard",
"language": "en",
"voice": "George",
"look": {
"mode": "preset",
"preset": "night"
},
"notes": {
"mustShow": [],
"avoid": []
},
"mascot": false,
"tier": "standard",
"format": "9:16",
"captions": true,
"music": true
},
"script": "Your site takes 3 seconds to load in Tokyo? The problem isn’t your server. It’s the distance…",
"narration": null,
"latestJobId": null,
"latestVideoId": null,
"source": "api",
"createdAt": "2026-10-23T09:02:11.000Z",
"updatedAt": "2026-10-23T09:04:37.000Z",
"url": "https://motiongist.com/app/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b"
}
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404), VALIDATION_ERROR (400), RATE_LIMITED (429)
POST/api/v1/projects/{id}/narrationportée jobs:write
Synthétise le script avec la voix choisie pour l’écouter avant de générer. Gratuit, mis en cache tant que le texte et la voix ne changent pas. Renvoie une URL audio valable 15 minutes.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant du projetrequis |
curl -X POST https://motiongist.com/api/v1/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b/narration \
-H "X-API-Key: $MOTIONGIST_API_KEY"
{
"data": {
"narration": {
"assetId": "5e6f7a8b-9c0d-4e1f-a2b3-c4d5e6f7a8b9",
"voice": "George",
"provider": "edge",
"seconds": 98.4,
"words": 246
},
"audioUrl": "https://motiongist.com/api/files/narrations/…"
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404), VALIDATION_ERROR (400), RATE_LIMITED (429)
GET/api/v1/projects/{id}/storyboardportée jobs:read
Le plan scène par scène du projet : statut (none, planning, ready, failed) et scènes (id, stage, narration, intent). Après un rendu, c’est le storyboard de la dernière vidéo ; dirty liste les scènes que le prochain rendu reconstruit.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant du projetrequis |
curl https://motiongist.com/api/v1/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b/storyboard \
-H "X-API-Key: $MOTIONGIST_API_KEY"
{
"data": {
"supported": true,
"status": "ready",
"source": "engine",
"basedOnVideoId": null,
"dirty": [],
"planJob": null,
"error": null,
"updatedAt": "2026-10-23T09:14:00.000Z",
"plan": {
"title": "How a CDN works",
"look": "night",
"presenter": false,
"scenes": [
{
"id": "s1",
"stage": "hero",
"narration": "Your site lives on one server. Your visitors live everywhere.",
"intent": "A single server in Virginia, dots of visitors light up around the globe."
},
{
"id": "s2",
"stage": "graph",
"narration": "A CDN keeps copies of it close to every visitor.",
"intent": "Edge servers pop up on each continent on “copies”, lines shorten on “close”."
},
{
"id": "s3",
"stage": "split",
"narration": "Pages load faster, and your server breathes.",
"intent": "Left: stopwatch 800 → 40 ms. Right: CPU gauge drops."
}
]
}
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404)
POST/api/v1/projects/{id}/storyboardportée jobs:write
Optionnel et gratuit : le moteur planifie la vidéo scène par scène en une minute environ, pour la relire avant de payer un rendu. Interroge GET jusqu’au statut ready. Le rendu suit ensuite le storyboard à la lettre.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant du projetrequis |
curl -X POST https://motiongist.com/api/v1/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b/storyboard \
-H "X-API-Key: $MOTIONGIST_API_KEY"
{
"data": {
"jobId": "7f3c2a10-5b1e-4c8a-9d2f-0e6b4a1c9d55",
"reused": false,
"storyboard": {
"supported": true,
"status": "planning",
"source": "engine",
"basedOnVideoId": null,
"dirty": [],
"planJob": null,
"error": null,
"updatedAt": "2026-10-23T09:14:00.000Z",
"plan": null
}
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404), CONFLICT (409), RATE_LIMITED (429)
PATCH/api/v1/projects/{id}/storyboardportée jobs:write
Remplace la liste ordonnée des scènes (3 à 24). Garde l’id des scènes existantes, omets-le pour les nouvelles. Les scènes modifiées sont reconstruites au prochain rendu ; les scènes intactes d’une vidéo rendue gardent leurs visuels. Refais une estimation ensuite.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant du projetrequis |
Corps JSON
| Champ | Type | Description |
|---|
title | string | Titre (120 caractères max). Par défaut : le sujet. |
scenes | object[] | requis |
curl -X PATCH https://motiongist.com/api/v1/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b/storyboard \
-H "X-API-Key: $MOTIONGIST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scenes": [
{
"id": "s1",
"narration": "A CDN keeps copies of your site close to every visitor.",
"intent": "World map, servers light up on “close”."
},
{
"narration": "New scene without id.",
"intent": "Stopwatch drops from 800 to 40 ms."
},
{
"id": "s3",
"narration": "Faster pages, lighter servers.",
"intent": "Two gauges move in opposite directions."
}
]
}'
{
"data": {
"supported": true,
"status": "ready",
"source": "engine",
"basedOnVideoId": null,
"dirty": [],
"planJob": null,
"error": null,
"updatedAt": "2026-10-23T09:14:00.000Z",
"plan": {
"title": "How a CDN works",
"look": "night",
"presenter": false,
"scenes": [
{
"id": "s1",
"stage": "hero",
"narration": "Your site lives on one server. Your visitors live everywhere.",
"intent": "A single server in Virginia, dots of visitors light up around the globe."
},
{
"id": "s2",
"stage": "graph",
"narration": "A CDN keeps copies of it close to every visitor.",
"intent": "Edge servers pop up on each continent on “copies”, lines shorten on “close”."
},
{
"id": "s3",
"stage": "split",
"narration": "Pages load faster, and your server breathes.",
"intent": "Left: stopwatch 800 → 40 ms. Right: CPU gauge drops."
}
]
}
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404), CONFLICT (409), VALIDATION_ERROR (400)
POST/api/v1/projects/{id}/storyboard/regenerateportée jobs:write
Marque des scènes à reconstruire au prochain rendu même si leur texte n’a pas changé (nouvelle proposition de visuels). Les autres scènes sont réutilisées telles quelles.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant du projetrequis |
Corps JSON
| Champ | Type | Description |
|---|
sceneIds | string[] | requis |
curl -X POST https://motiongist.com/api/v1/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b/storyboard/regenerate \
-H "X-API-Key: $MOTIONGIST_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"sceneIds": [
"s2"
]
}'
{
"data": {
"supported": true,
"status": "ready",
"source": "engine",
"basedOnVideoId": null,
"dirty": [
"s2"
],
"planJob": null,
"error": null,
"updatedAt": "2026-10-23T09:14:00.000Z",
"plan": {
"title": "How a CDN works",
"look": "night",
"presenter": false,
"scenes": [
{
"id": "s1",
"stage": "hero",
"narration": "Your site lives on one server. Your visitors live everywhere.",
"intent": "A single server in Virginia, dots of visitors light up around the globe."
},
{
"id": "s2",
"stage": "graph",
"narration": "A CDN keeps copies of it close to every visitor.",
"intent": "Edge servers pop up on each continent on “copies”, lines shorten on “close”."
},
{
"id": "s3",
"stage": "split",
"narration": "Pages load faster, and your server breathes.",
"intent": "Left: stopwatch 800 → 40 ms. Right: CPU gauge drops."
}
]
}
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404), CONFLICT (409), VALIDATION_ERROR (400)
DELETE/api/v1/projects/{id}/storyboardportée jobs:write
Retire le storyboard : le moteur planifie lui-même les scènes pendant le prochain rendu.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant du projetrequis |
curl -X DELETE https://motiongist.com/api/v1/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b/storyboard \
-H "X-API-Key: $MOTIONGIST_API_KEY"
{
"data": {
"supported": true,
"status": "none",
"source": "engine",
"basedOnVideoId": null,
"dirty": [],
"planJob": null,
"error": null,
"updatedAt": "2026-10-23T09:14:00.000Z",
"plan": null
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404)
POST/api/v1/projects/{id}/estimateportée jobs:read
Prix exact en crédits pour l’état actuel du projet et devis signé valable 1 heure. Une nouvelle version d’un projet déjà généré est facturée comme une révision (50 % du prix de base).
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant du projetrequis |
Corps JSON
| Champ | Type | Description |
|---|
voiceMode | "draft" | "final" | final = voix sous licence (plans payants), draft = voix de brouillon gratuite. Par défaut : final sur les plans payants. |
curl -X POST https://motiongist.com/api/v1/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b/estimate \
-H "X-API-Key: $MOTIONGIST_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"voiceMode": "final"
}'
{
"data": {
"total": 847,
"lines": [
{
"label": "Standard video (90–120 s)",
"credits": 700
},
{
"label": "Final voice (1,470 characters)",
"credits": 147
}
],
"quote": "eyJ3cyI6IjQ…(signed quote, pass it back unchanged)…",
"quoteExpiresAt": "2026-10-23T10:12:00.000Z",
"voiceMode": "final",
"isRevision": false,
"balance": 29153,
"allowed": true,
"blockers": [],
"overdraft": false,
"eta": {
"minutesMin": 4,
"minutesMax": 8
}
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404), VALIDATION_ERROR (400)
POST/api/v1/projects/{id}/generateportée jobs:write
Lance la génération au prix du devis. Le devis est obligatoire : s’il a expiré ou si le projet a changé depuis l’estimation, la réponse est QUOTE_INVALID et il faut ré-estimer.
Paramètres
| Nom | Où | Type | Description |
|---|
id | chemin | uuid | Identifiant du projetrequis |
Corps JSON
| Champ | Type | Description |
|---|
quote | string | Devis signé renvoyé par l’endpoint d’estimation (valable 1 h). Garantit le prix ; sans devis sur POST /jobs, le serveur recalcule le prix.requis |
curl -X POST https://motiongist.com/api/v1/projects/2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b/generate \
-H "X-API-Key: $MOTIONGIST_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"quote": "eyJ3cyI6IjQ…(signed quote, pass it back unchanged)…"
}'
{
"data": {
"job": {
"id": "7f3c2a10-5b1e-4c8a-9d2f-0e6b4a1c9d55",
"projectId": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"status": "queued",
"stage": "storyboard",
"stageLabel": "Storyboard",
"progress": 0,
"detail": "Scene 4/9",
"stages": {},
"voiceMode": "final",
"isRevision": false,
"credits": 847,
"queuePosition": 0,
"cancellable": true,
"error": null,
"videoId": null,
"attempt": 1,
"source": "api",
"queuedAt": "2026-10-23T09:12:04.000Z",
"startedAt": "2026-10-23T09:12:09.000Z",
"finishedAt": null
},
"projectId": "2b9e4d71-8c0a-4f3e-a6b5-1d2c3e4f5a6b",
"queuePosition": 1
},
"requestId": "req_3f9a1c2e7b8d4a60"
}
Erreurs possibles : NOT_FOUND (404), QUOTE_INVALID (400), INSUFFICIENT_CREDITS (402), PLAN_REQUIRED (403)