kreatoai/Documentation API

Médias

Ingérez vos images et vidéos avant publication. Le type est détecté automatiquement, le fichier est servi depuis media.kreatoai.com — un domaine vérifié, accepté par TikTok pour le téléchargement (PULL_FROM_URL).

Un fichier ingéré est un intermédiaire de livraison, pas un hébergement : il est conservé 30 jours, le temps de publier. Voir Durée de conservation.

Endpoints

POST
/v1/media

Fichier déjà en ligne (URL) ou petit fichier (base64). Scope : media:write

POST
/v1/media/upload-url

Adresse d'envoi direct pour un fichier local, jusqu'à 512 Mo. Scope : media:write

Quelle voie choisir

Votre fichierVoieTaille max (vidéo)
Déjà en ligne à une adresse publiquePOST /v1/media128 Mo
Sur la machine qui appelle l’API (script, Claude Code, Codex, Cursor)POST /v1/media/upload-url512 Mo
Petit fichier en mémoirePOST /v1/media~22 Mo en base64
Sur le téléphone ou l’ordinateur d’une personne, hors de portée du programmeawaitMedia512 Mo, déposé par la personne

Inutile d'exposer un fichier sur internet (tunnel, hébergement temporaire) pour le faire récupérer : l'envoi direct le dépose chez nous sans intermédiaire. Pour le dernier cas, voir awaitMedia dans /v1/posts.

Corps de requête

Exactement un des deux champs — le type (image ou vidéo) est détecté par les premiers octets du fichier, pas par l'extension :

// Par URL publique (http/https, sans redirection) — recommandé pour les vidéos
{ "url": "https://exemple.com/clip.mp4" }

// Ou en base64 (corps de requête ≤ 30 Mo, soit ~22 Mo de fichier utile)
{ "base64": "<données base64>" }

Exemple de requête complète (ingestion d'une image par URL) :

curl https://api.kreatoai.com/v1/media \
  -H "x-api-key: sk-kre-v1-votre_cle" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://exemple.com/image.png"}'

Envoyer un fichier local, jusqu'à 512 Mo

Pour un fichier présent sur la machine qui appelle l'API. Deux temps : vous annoncez le fichier (nom, type, taille exacte en octets), nous rendons une adresse signée valable une heure, et vous y envoyez le fichier par un PUT. L'adresse n'accepte que ce fichier-là : même type, même taille.

# 1. Annoncer le fichier (taille exacte en octets : stat -c %s video.mp4)
curl https://api.kreatoai.com/v1/media/upload-url \
  -H "x-api-key: sk-kre-v1-votre_cle" \
  -H "Content-Type: application/json" \
  -d '{"fileName":"video.mp4","contentType":"video/mp4","size":96468992}'

# 2. Envoyer le fichier à l'adresse rendue (uploadUrl)
curl -sS -X PUT -H "Content-Type: video/mp4" \
  --upload-file "video.mp4" "<uploadUrl>"
// 201 Created
{
  "uploadUrl": "https://…r2.cloudflarestorage.com/media-1790939586334-48vqaq7z.mp4?X-Amz-…",
  "method": "PUT",
  "headers": { "Content-Type": "video/mp4" },
  "mediaUrl": "https://media.kreatoai.com/media-1790939586334-48vqaq7z.mp4",
  "expiresIn": 3600,
  "command": "curl -sS -X PUT -H \"Content-Type: video/mp4\" --upload-file \"<chemin du fichier>\" \"…\""
}
TypeFormats acceptésTaille max
Vidéovideo/mp4, video/quicktime, video/webm512 Mo
Imageimage/jpeg, image/png, image/gif, image/webp20 Mo
PDFapplication/pdf25 Mo

Aucun transcodage : le fichier est servi tel quel depuis mediaUrl. Les envois comptent dans le budget de dépôt de l'espace sur 24 heures (voir Limites). Dans un assistant relié par MCP, c'est l'outil create_upload_url, qui rend aussi la commande curl toute prête.

Images — normalisation automatique

Tout format d'image accepté en entrée (PNG, WebP, HEIC…) : conversion en JPEG qualité 90, redimensionnement si le grand côté dépasse 1080 px (ratio conservé, jamais agrandi), orientation EXIF appliquée. C'est exactement le format exigé par TikTok — vous évitez le rejet asynchrone file_format_check_failed. Taille max : 20 Mo.

Vidéos

PropriétéValeur
FormatsMP4, MOV (QuickTime), WebM — détectés par magic bytes
Taille max512 Mo en envoi direct (/v1/media/upload-url) · 128 Mo par URL · ~22 Mo en base64
TraitementAucun transcodage : le fichier est hébergé tel quel

Le codec n'est pas vérifié : utilisez du H.264/AAC dans un conteneur MP4 pour une compatibilité TikTok garantie. Un codec exotique passera l'ingestion mais peut être rejeté par TikTok au téléchargement (video_pull_failed ou file_format_check_failed dans le statut).

PDF (carrousel document LinkedIn)

Un PDF est hébergé tel quel, 25 Mo au plus (environ 22 Mo en base64). Il se publie seulement sur LinkedIn, en carrousel document, et seul dans mediaUrls : voir /v1/posts.

Réponse

// 201 Created — image
{
  "type": "image",
  "url": "https://media.kreatoai.com/media-1784372380523-2a0lw1nv.jpg",
  "key": "media-1784372380523-2a0lw1nv.jpg",
  "width": 1080,
  "height": 1080,
  "bytes": 245812
}

// 201 Created — vidéo
{
  "type": "video",
  "url": "https://media.kreatoai.com/media-1784372381977-x81ka2mp.mp4",
  "key": "media-1784372381977-x81ka2mp.mp4",
  "bytes": 2299653,
  "mimeType": "video/mp4"
}

// 201 Created — PDF
{
  "type": "document",
  "url": "https://media.kreatoai.com/media-1784372383104-p4d9qk2c.pdf",
  "key": "media-1784372383104-p4d9qk2c.pdf",
  "bytes": 481260,
  "mimeType": "application/pdf"
}

Utilisez url tel quel dans imageUrls (carrousel) ou videoUrl (vidéo) de la publication. Les URLs restent accessibles largement au-delà de l'heure exigée par TikTok.

Erreurs

StatutCodeCause
400validation zodNi url ni base64, ou les deux à la fois — réponse détaillée du validateur
400fetch_failedURL inaccessible, redirection, schéma non http(s), timeout
400not_an_imageSignature d'image reconnue mais contenu indécodable
400unsupported_media_typeNi image, ni vidéo MP4/MOV/WebM, ni PDF reconnu
400media_too_largeImage > 20 Mo, vidéo > 128 Mo, ou PDF > 25 Mo
413payload_too_largeCorps de requête > 30 Mo
502storage_errorÉchec du stockage — réessayez
400unsupported_file_typeEnvoi direct : type absent de la liste acceptée
413file_too_largeEnvoi direct : vidéo > 512 Mo, image > 20 Mo, PDF > 25 Mo
429upload_quota_reachedBudget de dépôt de l’espace atteint sur 24 h (voir Limites)

Durée de conservation

Un fichier ingéré vit 30 jours à partir de son envoi. Passé ce délai, il est effacé et son URL renvoie 404.

C'est sans conséquence sur vos publications : une fois le contenu parti, le réseau social en héberge sa propre copie et continue de la servir.

Un fichier rattaché à une publication que nous n'avons pas encore envoyée (créée via POST /v1/posts, quelle que soit sa date) est conservé jusque-là, puis 30 jours de plus. Le délai ne s'applique donc qu'aux fichiers dont nous ignorons l'usage : ceux que vous publiez directement chez le réseau, ou que vous n'avez jamais utilisés. N'utilisez pas ces URL comme hébergement durable sur votre site.