Upscaling erstellen
POST /api/v1/upscale – Credits für ein Video abbuchen und das Upscaling auf 1080p, 2K oder 4K starten.
POST https://videoupscaler.co/api/v1/upscaleStartet ein Upscaling und gibt den neuen Task zurück. Wir laden das Video herunter, lesen die tatsächliche Dauer aus der Datei aus und buchen die entsprechenden Credits ab, bevor der Job startet. Die Dauer musst du nie selbst angeben.
Anfrage
Header
| Header | Pflicht | Beschreibung |
|---|---|---|
Authorization | Ja | Bearer <your API key> |
Content-Type | Ja | application/json |
Idempotency-Key | Empfohlen | Beliebiger String aus 1–255 druckbaren ASCII-Zeichen. Wiederholst du die Anfrage mit demselben Schlüssel, wird nie doppelt abgebucht. Siehe Idempotenz. |
Body
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
video_url | string | Ja | Eine öffentliche http(s)-URL des Videos oder die von /uploads zurückgegebene video_url. |
resolution | string | Ja | 1080p, 2k oder 4k. |
Anforderungen an das Video
- Formate: MP4, MOV und WebM.
- Länge: bis zu 600 Sekunden.
- Größe: bis zu 500MB bei einer externen
video_url, 100MB über /uploads. - Der Server hinter
video_urlmuss auf ein einfachesGETmit der Datei und einemContent-Length-Header antworten. Signierte Links von S3, R2 oder Google Cloud Storage funktionieren. Freigabeseiten wie YouTube oder Google-Drive-Vorschauen funktionieren nicht. - Fragmentierte MP4-Dateien ohne Gesamtdauer werden abgelehnt. Kodiere sie vorher in eine reguläre MP4-Datei um.
- WebM-Dateien müssen ihre Dauer im Header speichern. Browser-Aufnahmen (MediaRecorder) tun das oft nicht; kodiere sie vorher um.
Beispiel
curl https://videoupscaler.co/api/v1/upscale \
-H "Authorization: Bearer $VIDEOUPSCALER_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1234" \
-d '{"video_url": "https://example.com/clip.mp4", "resolution": "2k"}'const res = await fetch('https://videoupscaler.co/api/v1/upscale', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDEOUPSCALER_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': 'order-1234',
},
body: JSON.stringify({ video_url: 'https://example.com/clip.mp4', resolution: '2k' }),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const task = await res.json();res = requests.post(
"https://videoupscaler.co/api/v1/upscale",
headers={
"Authorization": f"Bearer {os.environ['VIDEOUPSCALER_API_KEY']}",
"Idempotency-Key": "order-1234",
},
json={"video_url": "https://example.com/clip.mp4", "resolution": "2k"},
timeout=300,
)
res.raise_for_status()
task = res.json()Antwort
201 Created mit dem Task:
{
"id": "0b6f3c1e-8a52-5d1e-9c43-3f1d2e7a9b10",
"status": "processing",
"resolution": "2k",
"video_url": "https://example.com/clip.mp4",
"duration_seconds": 12.4,
"processed_seconds": 12.4,
"credits_charged": 26,
"watermark": false,
"output_url": null,
"thumbnail_url": null,
"error": null,
"created_at": "2026-09-30T08:00:00.000Z",
"updated_at": "2026-09-30T08:00:02.000Z"
}Anschließend fragst du den Task ab, bis er completed ist.
Diese Anfrage lädt das Video herunter, bevor sie antwortet. Bei einer großen externen Datei kann das eine Weile dauern. Setze dein Timeout auf mindestens 5 Minuten.
Idempotenz
Sende bei jeder Anfrage einen Idempotency-Key mit und verwende ihn erneut, wenn du nach einem Timeout oder Netzwerkfehler einen neuen Versuch startest:
- Derselbe Schlüssel mit derselben
video_urlundresolutiongibt den ursprünglichen Task mit200 OKzurück. Es wird nicht erneut abgebucht. - Derselbe Schlüssel mit einer anderen
video_urloderresolutionführt zu409 idempotency_conflict. - Ohne den Header erstellt jede Anfrage einen neuen Task und bucht erneut Credits ab.
Abrechnung
Der Preis ergibt sich aus der Videolänge in ganzen Sekunden (aufgerundet) mal dem Satz für die gewählte Auflösung. Siehe Credits & Preise. Ein 12,4 Sekunden langes Video in 2K kostet 13 × 2 = 26 Credits.
Schlägt der Job fehl, werden die Credits automatisch erstattet und der Task erhält den Status failed.
Fehler
| Status | Code | Wann |
|---|---|---|
400 | invalid_request | video_url, resolution oder Idempotency-Key fehlt oder ist ungültig |
401 | unauthorized | API-Schlüssel fehlt oder ist ungültig |
403 | paid_plan_required | Das Konto hat noch nie Credits gekauft oder ein Abo abgeschlossen |
402 | insufficient_credits | Dein Guthaben reicht für das Video nicht aus |
409 | idempotency_conflict | Der Idempotency-Key wurde mit anderen Parametern verwendet |
413 | file_too_large | Das Video ist größer als 500MB |
422 | video_fetch_failed | Wir konnten video_url nicht herunterladen |
422 | unsupported_video | Keine lesbare MP4-, MOV- oder WebM-Datei, oder die Dauer fehlt |
422 | video_too_long | Das Video ist länger als 600 Sekunden |
422 | video_not_found | Unter einer hochgeladenen video_url liegt keine Datei (der Upload wurde nicht abgeschlossen) |
504 | upstream_timeout | Der Download von video_url hat länger als 4 Minuten gedauert |
Das Fehlerformat findest du unter Fehler.