Créations
Décrivez ce que vous voulez voir, récupérez le fichier. Deux types : une image, ou une vidéo de 5, 10 ou 15 secondes avec sa bande son. Le fichier est hébergé sur media.kreatoai.com et se publie directement avec POST /v1/posts, sans passer par /v1/media.
La création est asynchrone : l'appel répond 202 immédiatement, puis vous interrogez son état — ou vous laissez un webhook vous prévenir. Comptez quelques secondes pour une image, une à deux minutes pour une vidéo.
Endpoints
/v1/generationsLancer une création
/v1/generations/:idÉtat et résultat
/v1/generationsCréations récentes + solde
/v1/generations/:idRetirer une création de la liste
Scope requis : generations:write pour créer et supprimer, generations:write ou videos:read pour lire. Un abonnement en cours est nécessaire.
Lancer une création
| Champ | Obligatoire | Description |
|---|---|---|
type | oui | image ou video |
prompt | oui | Ce que doit montrer la création. 3 à 1800 caractères |
aspectRatio | non | 9:16 (défaut), 1:1 ou 16:9 |
durationSec | non | Vidéo seulement. 5, 10 ou 15, facturées à la seconde ; 5 par défaut |
sourceUrls | non | Vidéo seulement. Une image de départ, ou deux pour fixer la première et la dernière |
curl -X POST https://api.kreatoai.com/v1/generations \
-H "x-api-key: sk-kre-v1-votre_cle" \
-H "Content-Type: application/json" \
-d '{
"type": "video",
"prompt": "Un plat qui sort du four, vapeur, lumière chaude, gros plan",
"aspectRatio": "9:16"
}'// 202 Accepted
{
"id": "9f1c8b2e-4a7d-4c31-9e05-6b2f8a1d3c47",
"type": "video",
"status": "pending",
"prompt": "Un plat qui sort du four, vapeur, lumière chaude, gros plan",
"aspectRatio": "9:16",
"durationSec": 5,
"sourceUrls": [],
"mediaUrl": null,
"mimeType": null,
"error": null,
"creditsCost": 15,
"createdAt": "2026-09-05T14:22:10.000Z",
"completedAt": null
}Suivre son avancement
Deux façons, au choix. La plus économique : abonnez un endpoint webhook et attendez generation.completed ou generation.failed — le corps de l'événement est exactement l'objet ci-dessous. Sinon, interrogez l'état toutes les dix secondes :
GET /v1/generations/9f1c8b2e-4a7d-4c31-9e05-6b2f8a1d3c47
// 200 OK
{
"id": "9f1c8b2e-4a7d-4c31-9e05-6b2f8a1d3c47",
"type": "video",
"status": "completed",
"mediaUrl": "https://media.kreatoai.com/generation-video-1788….mp4",
"mimeType": "video/mp4",
"error": null,
"creditsCost": 15,
"completedAt": "2026-09-05T14:23:47.000Z"
}| status | Signification |
|---|---|
pending | Acceptée, pas encore commencée |
processing | En cours de production |
completed | mediaUrl est prêt à être utilisé |
failed | error porte un texte affichable tel quel. Les crédits ont été rendus |
Publier le résultat
mediaUrl se passe directement dans mediaUrls — inutile de l'ingérer avec /v1/media, le fichier est déjà chez nous.
curl -X POST https://api.kreatoai.com/v1/posts \
-H "x-api-key: sk-kre-v1-votre_cle" \
-H "Content-Type: application/json" \
-d '{
"targets": ["tiktok", "youtube"],
"content": "Trois dîners prêts en 10 minutes",
"mediaUrls": ["https://media.kreatoai.com/generation-video-1788….mp4"]
}'Sur YouTube, déclarez le contenu généré : options.youtube.containsSyntheticMedia = true.
Crédits
| Type | Coût | Ce que vous obtenez |
|---|---|---|
| image | 2 crédits | Une image au format demandé |
| video, 5 s | 15 crédits | Un clip de 5 secondes, bande son comprise |
| video, 10 s | 30 crédits | Un clip de 10 secondes, bande son comprise |
| video, 15 s | 45 crédits | Un clip de 15 secondes, bande son comprise |
Le solde vit sur l'espace, pas sur la clé : GET /v1/workspace et GET /v1/generations le renvoient tous les deux dans credits. Un appel refusé pour solde insuffisant ne débite rien, et une création qui échoue est intégralement remboursée — y compris lorsqu'une mise à jour de nos serveurs l'interrompt.
Champs de la réponse
| Champ | Description |
|---|---|
mediaUrl | URL du fichier produit. null tant que la création n’est pas terminée |
error | Texte destiné à être montré tel quel à un utilisateur. null tant que rien n’a échoué |
creditsCost | Ce que cette création a coûté, en crédits |
sourceUrls | Les images de départ que vous aviez fournies |
completedAt | Fin de la production, en succès comme en échec |
Les fichiers produits vous appartiennent : contrairement aux médias ingérés via /v1/media, ils ne sont soumis à aucune durée de conservation tant que vous ne supprimez pas la création.
Erreurs
| Statut | Code | Cause |
|---|---|---|
| 400 | validation zod | Prompt trop court, type inconnu, durée hors de 4/6/8, plus de deux images source |
| 402 | insufficient_credits | Solde insuffisant. Rien n’a été débité |
| 402 | subscription_required | L’espace n’a pas d’abonnement en cours |
| 403 | insufficient_scope | La clé ne porte pas generations:write |
| 404 | generation_not_found | Identifiant inconnu dans cet espace, ou création supprimée |
| 429 | rate_limit_exceeded | Trop de requêtes — attendez 60 secondes |
Une création peut aussi aboutir en failed après avoir été acceptée : une demande refusée par nos garde-fous de contenu, ou une indisponibilité passagère. Dans les deux cas, error dit quoi faire et les crédits reviennent.