Téléversement de médias
Envoyez des images, vidéos et audio locaux vers AllToken via des téléversements pré-signés directs vers R2.
Vue d'ensemble
La génération vidéo et l'édition d'images utilisent toutes deux des ressources média — images de référence, vidéo et audio de référence, images source et masques. Il n'existe qu'une seule règle pour les envoyer :
- La ressource est déjà sur l'internet public (votre CDN / stockage objet) — transmettez directement son URL
http(s), sans aucun surcoût de téléversement. Matériaux de référence vidéo uniquement. - La ressource est locale — téléversez-la d'abord via un téléversement pré-signé direct vers R2, puis référencez l'
upload_idretourné. C'est la seule voie pour les fichiers locaux, et la seule voie pour l'édition d'images (source et masque).
Avertissement
La méthode base64 data: intégrée a été supprimée le 2026-08-06 pour les matériaux de référence vidéo, comme du côté image (dont l'ancien téléversement multipart avait déjà été supprimé). Les médias locaux passent désormais toujours par un téléversement pré-signé.
Le point de terminaison est POST https://api.alltoken.ai/v1/uploads/presign (uploads au pluriel). Ne le confondez pas avec le /upload/presign du service de compte, réservé aux avatars du site et qui n'accepte que les types MIME image.
Choisir votre voie
| Votre situation | Voie | Pourquoi |
|---|---|---|
| Matériau de référence vidéo déjà sur votre CDN / OSS | Transmettre url | Aucun téléversement — les octets ne touchent jamais notre passerelle ni notre stockage |
| Matériau de référence vidéo en local (image / vidéo / audio) | Téléversement pré-signé | La seule voie pour les fichiers locaux |
Source et masque d'édition d'images (/images/edits, /images/variations) | Téléversement pré-signé | Le seul point d'entrée, quelle que soit la taille du fichier |
Le téléversement en trois étapes
Votre fichier ne transite jamais par notre passerelle. Vous obtenez une URL de téléversement direct à usage unique, vous envoyez les octets bruts par PUT directement vers le stockage objet, puis vous référencez l'upload_id retourné lors de la création de la tâche. La passerelle ne transporte qu'un identifiant de quelques dizaines d'octets. Le même mécanisme sert aux matériaux de référence vidéo et à l'édition d'images — seuls le purpose et le champ par lequel vous le référencez diffèrent.
Étape 1 — demander une URL de téléversement direct :
$POST https://api.alltoken.ai/v1/uploads/presignCorps : purpose (détermine le MIME et la taille autorisés — voir ci-dessous), content_type (le MIME du fichier, en minuscules), content_length (nombre exact d'octets), content_md5 et checksum_sha256.
Avertissement
Les deux empreintes utilisent des encodages différents : content_md5 est en base64, checksum_sha256 est en hex. Les intervertir est rejeté dès l'étape de pré-signature avec un 400.
La réponse retourne upload_id (commence par upl_), upload_url (la cible PUT pré-signée), required_headers (à rejouer tels quels à l'étape 2), expires_in (validité de l'URL, 300 s), claim_expires_at (validité de l'upload_id, 2 h) et max_content_length.
Étape 2 — envoyez les octets bruts par PUT vers upload_url, en rejouant exactement chaque en-tête de required_headers. Le corps correspond aux octets bruts du fichier — ni base64, ni multipart :
| 1 | PUT <upload_url> |
| 2 | Content-Type: video/mp4 |
| 3 | Content-MD5: N0xUuLBP5C0uKJ2i0fA1kA== |
| 4 | |
| 5 | <raw bytes> |
Avertissement
Supprimez ou modifiez un en-tête requis et le stockage objet retourne 403 — l'URL pré-signée signe aussi ces en-têtes. N'ajoutez pas de Content-Encoding, ne compressez pas en gzip, n'utilisez pas multipart.
Étape 3 — créez la tâche en référençant upload_id. La vidéo le place dans content[].upload_id ; l'édition d'images utilise les champs de premier niveau image_upload_id / mask_upload_id. La passerelle valide le nombre d'octets et l'ETag, déplace l'objet vers la zone permanente de la tâche et soumet une adresse accessible en amont — le tout de manière transparente pour vous ; vous obtenez simplement 202 + task_id.
Trois règles à retenir :
upload_idet le champ URL sont mutuellement exclusifs au sein d'un même élément — remplir les deux retourne 400upload_url_conflict.- La pré-signature et la création de la tâche doivent utiliser la même API Key — la propriété est vérifiée comme (utilisateur + API Key + purpose) ; changer de clé retourne 404
upload_not_found. - Le
purposedoit correspondre à l'usage réel, sinon vous obtenez également 404upload_not_found.
Les tableaux complets des champs de requête et de réponse figurent dans les références API Image et API Vidéo.
Référence des purpose
Chaque purpose fixe les types MIME autorisés et un plafond de taille par fichier.
purpose | Utilisé pour | MIME autorisés | Plafond par fichier |
|---|---|---|---|
video_input_image | Image de référence vidéo / trame de début & de fin | image/png, image/jpeg, image/webp, image/gif | 20 MiB |
video_input_video | Vidéo de référence vidéo | video/mp4, video/quicktime, video/webm | 100 MiB |
video_input_audio | Audio de référence vidéo | audio/wav, audio/mpeg, audio/mp4, audio/aac, audio/ogg | 20 MiB |
image_edit_source | Source d'édition d'images | image/png, image/jpeg, image/webp | 25 MiB |
image_edit_mask | Masque d'édition d'images | image/png, image/webp (pas de jpeg) | 25 MiB |
image_variation_source | Source de variation d'images | image/png, image/jpeg, image/webp | 25 MiB |
Les masques rejettent image/jpeg car le canal alpha exprime « où modifier », et jpeg n'a pas de transparence.
Fenêtres temporelles et quotas
| Fenêtre | Durée | Après expiration |
|---|---|---|
upload_url (la cible PUT) | 5 minutes | PUT retourne 403 — pré-signez à nouveau |
upload_id (le jeton de la ressource) | 2 heures | La création de la tâche retourne 409 upload_expired |
Donc : téléversez dès que vous avez l'URL, mais vous disposez ensuite de deux heures pour assembler et soumettre la requête de génération.
Un upload_id se lie à exactement une tâche ; sa réutilisation retourne 409 upload_already_used. C'est voulu — une ressource, une tâche, une facture. Si la création de la tâche échoue, l'objet temporaire est récupéré automatiquement.
| Quota | Seuil | En cas de dépassement |
|---|---|---|
upload_id inutilisés simultanément | 100 | 429 quota_exceeded |
| Total d'octets téléversés par jour UTC | 2 GiB | 429 quota_exceeded |
Le rythme normal « téléverser puis utiliser » ne les atteint jamais. Pour les gros lots d'édition d'images, surveillez le plafond quotidien : 25 MiB × ~80 fichiers atteignent 2 GiB.
Codes d'erreur de téléversement
Étape de pré-signature :
| HTTP | code | Signification |
|---|---|---|
| 400 | invalid_purpose | purpose mal orthographié ou non pris en charge |
| 400 | invalid_content_type | MIME absent de la liste blanche du purpose (un masque envoyé en jpeg atterrit ici) |
| 400 | invalid_content_md5 | Le MD5 n'est pas un base64 valide (n'envoyez pas de hex) |
| 400 | invalid_checksum | Le SHA-256 n'est pas un hex minuscule de 64 caractères (n'envoyez pas de base64) |
| 413 | payload_too_large | content_length dépasse le plafond du purpose |
| 429 | quota_exceeded | Plus de 100 en attente, ou plus de 2 GiB aujourd'hui |
| 503 | storage_unavailable | Stockage temporairement indisponible — réessayez |
Étape de liaison (lors de la création de la tâche) :
| HTTP | code | Signification |
|---|---|---|
| 404 | upload_not_found | upload_id inconnu, mauvaise API Key ou purpose non concordant |
| 409 | upload_already_used | Déjà lié à une tâche — pré-signez à nouveau |
| 409 | upload_expired | Plus de 2 heures — pré-signez à nouveau |
| 400 | upload_object_missing | Pré-signé mais jamais envoyé par PUT avant la création de la tâche |
| 400 | upload_size_mismatch | Les octets réels diffèrent de content_length |
| 409 | upload_modified | Objet modifié après le téléversement (ETag non concordant) |
| 400 | upload_url_conflict | upload_id et un champ URL renseignés dans un même élément |