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/upscale

Startet 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

HeaderPflichtBeschreibung
AuthorizationJaBearer <your API key>
Content-TypeJaapplication/json
Idempotency-KeyEmpfohlenBeliebiger String aus 1–255 druckbaren ASCII-Zeichen. Wiederholst du die Anfrage mit demselben Schlüssel, wird nie doppelt abgebucht. Siehe Idempotenz.

Body

FeldTypPflichtBeschreibung
video_urlstringJaEine öffentliche http(s)-URL des Videos oder die von /uploads zurückgegebene video_url.
resolutionstringJa1080p, 2k oder 4k.

Anforderungen an das Video

  • Formate: MP4, MOV und WebM.
  • Länge: bis zu 1200 Sekunden bei 1080p, 600 Sekunden bei 2k und 4k.
  • Größe: bis zu 500MB bei einer externen video_url, 100MB über /uploads.
  • Der Server hinter video_url muss auf ein einfaches GET mit der Datei und einem Content-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_url und resolution gibt den ursprünglichen Task mit 200 OK zurück. Es wird nicht erneut abgebucht.
  • Derselbe Schlüssel mit einer anderen video_url oder resolution führt zu 409 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

StatusCodeWann
400invalid_requestvideo_url, resolution oder Idempotency-Key fehlt oder ist ungültig
401unauthorizedAPI-Schlüssel fehlt oder ist ungültig
403paid_plan_requiredDas Konto hat noch nie Credits gekauft oder ein Abo abgeschlossen
402insufficient_creditsDein Guthaben reicht für das Video nicht aus
409idempotency_conflictDer Idempotency-Key wurde mit anderen Parametern verwendet
413file_too_largeDas Video ist größer als 500MB
422video_fetch_failedWir konnten video_url nicht herunterladen
422unsupported_videoKeine lesbare MP4-, MOV- oder WebM-Datei, oder die Dauer fehlt
422video_too_longDas Video ist länger als das Limit seiner Auflösung (1200 Sekunden bei 1080p, 600 bei 2k und 4k)
422video_not_foundUnter einer hochgeladenen video_url liegt keine Datei (der Upload wurde nicht abgeschlossen)
504upstream_timeoutDer Download von video_url hat länger als 4 Minuten gedauert

Das Fehlerformat findest du unter Fehler.