Medien-Uploads
Lokale Bilder, Videos und Audio per vorab signierten Direct-to-R2-Uploads an AllToken senden.
Überblick
Videoerzeugung und Bildbearbeitung nutzen beide Medien-Assets — Referenzbilder, Referenzvideos und -audio, Quellbilder und Masken. Für das Senden gibt es genau eine Regel:
- Das Asset liegt bereits im öffentlichen Internet (Ihr CDN / Objektspeicher) — übergeben Sie direkt seine
http(s)-URL, ganz ohne Upload-Overhead. Nur für Video-Referenzmaterialien. - Das Asset ist lokal — laden Sie es zuerst per vorab signiertem Direct-to-R2-Upload hoch und referenzieren Sie dann die zurückgegebene
upload_id. Das ist der einzige Weg für lokale Dateien und der einzige Weg für die Bildbearbeitung (Quelle und Maske).
Warnung
Der Inline-Pfad data: (base64) wurde für Video-Referenzmaterialien am 2026-08-06 entfernt, passend zur Bildseite (deren veralteter multipart-Upload bereits früher entfernt wurde). Lokale Medien laufen jetzt immer über einen vorab signierten Upload.
Der Endpunkt ist POST https://api.alltoken.ai/v1/uploads/presign (Plural uploads). Verwechseln Sie ihn nicht mit /upload/presign des Account-Dienstes, das für In-Site-Avatare gedacht ist und nur Bild-MIME-Typen akzeptiert.
Den richtigen Weg wählen
| Ihre Situation | Weg | Warum |
|---|---|---|
| Video-Referenzmaterial liegt bereits auf Ihrem CDN / OSS | url übergeben | Kein Upload — die Bytes berühren weder unser Gateway noch unseren Speicher |
| Video-Referenzmaterial ist lokal (Bild / Video / Audio) | Vorab signierter Upload | Der einzige Weg für lokale Dateien |
Quelle und Maske der Bildbearbeitung (/images/edits, /images/variations) | Vorab signierter Upload | Der einzige Einstiegspunkt, unabhängig von der Dateigröße |
Der dreistufige Upload
Ihre Datei durchläuft niemals unser Gateway. Sie tauschen eine einmalige Direct-Upload-URL ein, übertragen die Rohbytes per PUT direkt in den Objektspeicher und referenzieren dann beim Erstellen der Aufgabe die zurückgegebene upload_id. Das Gateway transportiert nur eine wenige Dutzend Byte große ID. Derselbe Mechanismus bedient Video-Referenzmaterialien und Bildbearbeitung — es unterscheiden sich nur der purpose und das Feld, über das Sie darauf verweisen.
Schritt 1 — eine Direct-Upload-URL anfordern:
$POST https://api.alltoken.ai/v1/uploads/presignBody: purpose (bestimmt die erlaubten MIME-Typen und die Größe — siehe unten), content_type (die Datei-MIME, kleingeschrieben), content_length (exakte Byte-Anzahl), content_md5 und checksum_sha256.
Warnung
Die beiden Prüfsummen verwenden unterschiedliche Kodierungen: content_md5 ist base64, checksum_sha256 ist hex. Sie zu vertauschen wird im Presign-Schritt mit einem 400 abgelehnt.
Die Antwort liefert upload_id (beginnt mit upl_), upload_url (das vorab signierte PUT-Ziel), required_headers (in Schritt 2 wortwörtlich wiederholen), expires_in (URL-Gültigkeit, 300 s), claim_expires_at (upload_id-Gültigkeit, 2 h) und max_content_length.
Schritt 2 — übertragen Sie die Rohbytes per PUT an upload_url und wiederholen Sie dabei jeden Header in required_headers exakt. Der Body sind die rohen Datei-Bytes — nicht base64, nicht multipart:
| 1 | PUT <upload_url> |
| 2 | Content-Type: video/mp4 |
| 3 | Content-MD5: N0xUuLBP5C0uKJ2i0fA1kA== |
| 4 | |
| 5 | <raw bytes> |
Warnung
Lassen Sie einen erforderlichen Header weg oder schreiben Sie ihn um, gibt der Objektspeicher 403 zurück — die vorab signierte URL signiert diese Header ebenfalls. Fügen Sie kein Content-Encoding hinzu, gzippen Sie nicht und verwenden Sie kein multipart.
Schritt 3 — erstellen Sie die Aufgabe mit Verweis auf upload_id. Video legt sie in content[].upload_id ab; die Bildbearbeitung verwendet die Top-Level-Felder image_upload_id / mask_upload_id. Das Gateway validiert die Byte-Anzahl und den ETag, verschiebt das Objekt in den permanenten Bereich der Aufgabe und übermittelt eine vom Upstream erreichbare Adresse — alles transparent für Sie; Sie erhalten einfach 202 + task_id.
Drei Regeln, die Sie sich merken sollten:
upload_idund das URL-Feld schließen sich innerhalb eines Elements gegenseitig aus — beides auszufüllen gibt 400upload_url_conflictzurück.- Presign und Aufgabenerstellung müssen denselben API Key verwenden — die Zugehörigkeit wird als (Benutzer + API Key + purpose) geprüft; ein Schlüsselwechsel gibt 404
upload_not_foundzurück. - Der
purposemuss zur tatsächlichen Verwendung passen, sonst erhalten Sie ebenfalls 404upload_not_found.
Vollständige Tabellen der Request- und Response-Felder finden Sie in der Image API- und Video API-Referenz.
purpose-Referenz
Jeder purpose legt die erlaubten MIME-Typen und eine Größenobergrenze pro Datei fest.
purpose | Verwendet für | Erlaubte MIME | Obergrenze pro Datei |
|---|---|---|---|
video_input_image | Video-Referenzbild / erster & letzter Frame | image/png, image/jpeg, image/webp, image/gif | 20 MiB |
video_input_video | Video-Referenzvideo | video/mp4, video/quicktime, video/webm | 100 MiB |
video_input_audio | Video-Referenzaudio | audio/wav, audio/mpeg, audio/mp4, audio/aac, audio/ogg | 20 MiB |
image_edit_source | Quelle der Bildbearbeitung | image/png, image/jpeg, image/webp | 25 MiB |
image_edit_mask | Maske der Bildbearbeitung | image/png, image/webp (kein jpeg) | 25 MiB |
image_variation_source | Quelle der Bildvariation | image/png, image/jpeg, image/webp | 25 MiB |
Masken lehnen image/jpeg ab, weil der Alphakanal ausdrückt „wo geändert werden soll", und jpeg hat keine Transparenz.
Zeitfenster & Kontingente
| Fenster | Länge | Nach Ablauf |
|---|---|---|
upload_url (das PUT-Ziel) | 5 Minuten | PUT gibt 403 zurück — erneut presignen |
upload_id (der Asset-Anspruch) | 2 Stunden | Aufgabenerstellung gibt 409 upload_expired zurück |
Also: laden Sie hoch, sobald Sie die URL haben, danach haben Sie jedoch zwei Stunden Zeit, um die Generierungsanfrage zusammenzustellen und abzuschicken.
Eine upload_id bindet an genau eine Aufgabe; erneute Verwendung gibt 409 upload_already_used zurück. Das ist beabsichtigt — ein Asset, eine Aufgabe, eine Abrechnung. Schlägt die Aufgabenerstellung fehl, wird das temporäre Objekt automatisch zurückgewonnen.
| Kontingent | Schwellenwert | Bei Überschreitung |
|---|---|---|
Ungenutzte upload_id gleichzeitig | 100 | 429 quota_exceeded |
| Gesamte hochgeladene Bytes pro UTC-Tag | 2 GiB | 429 quota_exceeded |
Normales „hochladen, dann verwenden"-Timing trifft diese nie. Achten Sie bei großen Bildbearbeitungs-Stapeln auf die Tagesgrenze: 25 MiB × ~80 Dateien erreichen 2 GiB.
Upload-Fehlercodes
Presign-Phase:
| HTTP | code | Bedeutung |
|---|---|---|
| 400 | invalid_purpose | purpose falsch geschrieben oder nicht unterstützt |
| 400 | invalid_content_type | MIME nicht in der Whitelist des purpose (eine als jpeg gesendete Maske landet hier) |
| 400 | invalid_content_md5 | MD5 ist kein gültiges base64 (kein hex senden) |
| 400 | invalid_checksum | SHA-256 ist kein 64-stelliges hex in Kleinbuchstaben (kein base64 senden) |
| 413 | payload_too_large | content_length über der Obergrenze des purpose |
| 429 | quota_exceeded | Über 100 ausstehend oder über 2 GiB heute |
| 503 | storage_unavailable | Speicher vorübergehend nicht verfügbar — erneut versuchen |
Bindungsphase (wenn Sie die Aufgabe erstellen):
| HTTP | code | Bedeutung |
|---|---|---|
| 404 | upload_not_found | Unbekannte upload_id, falscher API Key oder purpose-Konflikt |
| 409 | upload_already_used | Bereits an eine Aufgabe gebunden — erneut presignen |
| 409 | upload_expired | Älter als 2 Stunden — erneut presignen |
| 400 | upload_object_missing | Presigned, aber vor dem Erstellen der Aufgabe nie per PUT übertragen |
| 400 | upload_size_mismatch | Tatsächliche Bytes weichen von content_length ab |
| 409 | upload_modified | Objekt nach dem Upload geändert (ETag-Konflikt) |
| 400 | upload_url_conflict | Sowohl upload_id als auch ein URL-Feld in einem Element gesetzt |