API-Referenz
Base URL: https://api.subdownload.com · Auth: Authorization: Bearer sk_live_xxx
Endpunkte
GET
/v1/verify
free
Prüft, ob ein API-Key gültig ist. Liefert Token- und Benutzerinfos. Verbraucht keine Credits.
Request
curl -H "Authorization: Bearer sk_live_xxx" \
https://api.subdownload.com/v1/verify
Antwort 200
{
"valid": true,
"token": { "name": "My App", "prefix": "sk_live_abc", "monthly_quota": 0, "used_quota": 120 },
"user": { "id": 42, "email": "[email protected]", "plan": "free", "credits_remaining": 148 }
}
GET
/v1/youtube/transcript
1 credit
Transkript / Untertitel für ein YouTube-Video abrufen. Akzeptiert Video-ID oder jede gültige YouTube-URL (watch, youtu.be, shorts).
Parameter
| Name | Typ | Pflicht | Beschreibung |
video_id | string | PFLICHT | 11-stellige Video-ID oder vollständige YouTube-URL. Alias: video_url. |
lang | string | optional | Bevorzugte Sprachcodes, kommagetrennt (z. B. en,zh,ja). |
Request
curl -H "Authorization: Bearer sk_live_xxx" \
"https://api.subdownload.com/v1/youtube/transcript?video_id=dQw4w9WgXcQ&lang=en"
Antwort 200
{
"data": {
"video_id": "dQw4w9WgXcQ",
"language": "en",
"segments": [
{ "text": "We're no strangers to love", "start": 0.0, "duration": 3.5 }
],
"text": "We're no strangers to love...",
"meta": { "title": "...", "author": "...", "thumbnail": "..." }
},
"credits_used": 1,
"credits_remaining": 148
}
Fehler
400 fehlende video_id · 404 keine Untertitel · 402 Credits aufgebraucht
GET
/v1/youtube/search
1 credit
Durchsucht YouTube nach Videos oder Kanälen, die zu einem Keyword passen.
Parameter
| Name | Typ | Pflicht | Beschreibung |
q | string | PFLICHT | Suchanfrage (1-200 Zeichen). |
type | string | optional | video (Standard) oder channel. |
limit | integer | optional | 1-50 Ergebnisse (Standard 20). |
Request
curl -H "Authorization: Bearer sk_live_xxx" \
"https://api.subdownload.com/v1/youtube/search?q=rust+tutorial&limit=5"
GET
/v1/youtube/channel/resolve
free
Löst jede Kanal-Referenz (@handle, URL oder UC…-ID) in kanonische Kanal-Info auf.
Parameter
| Name | Typ | Pflicht | Beschreibung |
input | string | PFLICHT | @handle, Kanal-URL, Video-URL oder UC…-ID. |
GET
/v1/youtube/channel/search
1 credit
Sucht innerhalb der Videos eines bestimmten Kanals.
Parameter
| Name | Typ | Pflicht | Beschreibung |
channel | string | PFLICHT | @handle, URL oder UC…-ID (Alias: channel_id). |
q | string | PFLICHT | Suchanfrage. |
limit | integer | optional | 1-50 (Standard 30). |
GET
/v1/youtube/channel/latest
free
Ruft die neuesten ~15 Videos eines Kanals per RSS ab. Schnell und kostenlos.
Parameter
| Name | Typ | Pflicht | Beschreibung |
channel | string | PFLICHT | @handle, URL oder UC…-ID (Alias: channel_id). |
GET
/v1/youtube/channel/videos
1 credit/page
Listet alle von einem Kanal hochgeladenen Videos, paginiert ~100 pro Seite.
Parameter
| Name | Typ | Pflicht | Beschreibung |
channel | string | erste Seite | @handle, URL oder UC…-ID (Alias: channel_id). |
continuation | string | Folgeseiten | Token aus dem vorherigen Aufruf. |
Hinweis: Entweder channel oder continuation angeben, nicht beides.
GET
/v1/youtube/playlist/videos
1 credit/page
Listet Videos in einer YouTube-Playlist mit Paginierung.
Parameter
| Name | Typ | Pflicht | Beschreibung |
playlist | string | erste Seite | Playlist-URL oder -ID (PL…, UU…, LL…, FL…, OL…). |
continuation | string | Folgeseiten | Token aus der vorherigen Antwort. |
KI-Transkription (ASR)
Whisper für Videos ohne Untertitel. Asynchron: POST erstellt einen Task, danach via GET bis status=done pollen. 5 Credits, nur bei erfolgreichem Abschluss abgebucht — ein erneuter ASR-Lauf für dasselbe Video ist kostenlos.
POST
/v1/youtube/asr
5 Credits bei done
Startet eine asynchrone KI-Whisper-Transkription. Liefert task_id plus ETA-Hinweise, damit Sie das Polling richtig takten.
Body (JSON)
| Name | Typ | Pflicht | Beschreibung |
video_url | string | ERFORDERLICH | YouTube-URL (watch / youtu.be / shorts / embed). |
lang | string | optional | Sprachhinweis (en, de…). Auslassen für automatische Erkennung. |
Request
curl -X POST -H "Authorization: Bearer sk_live_xxx" -H "Content-Type: application/json" -d '{"video_url":"https://youtu.be/dQw4w9WgXcQ"}' https://api.subdownload.com/v1/youtube/asr
Antwort 202
{
"task_id": "task_01HX...",
"status": "queued",
"from_cache": false,
"queue_position": 2,
"estimated_wait_seconds": 61,
"next_poll_after_seconds": 15,
"poll_url": "/v1/youtube/asr/task_01HX..."
}
Halten Sie sich an next_poll_after_seconds zwischen Polls. Bei Cache-Treffer wird status=done sofort mit eingebetteten Segments zurückgegeben.
GET
/v1/youtube/asr/{task_id}
kostenlos
Pollt einen ASR-Task. Kostenlos — kein Credit- und Token-Quota-Verbrauch. Nur der Ersteller kann lesen.
Status: queued · downloading · transcribing · done · failed · cancelled. Nur bei status=done sind die Segments endgültig.
Library (Benutzerspeicher)
Pro-Benutzer-Speicher für gespeicherte Transkripte und KI-Zusammenfassungen. Lesezugriffe kostenlos; Schreibzugriffe verbrauchen eine Token-Quota-Einheit. Keine Nutzer-Credits.
GET
/v1/library
kostenlos
Listet Einträge, die der Benutzer in seiner Library gespeichert hat (Transkripte + Zusammenfassungen).
Parameter
| Name | Typ | Pflicht | Beschreibung |
favorite | string | optional | 1 oder true für nur Favoriten. |
q | string | optional | Teilstring-Suche über Titel/Autor. |
tag | string | optional | Filter nach Tag. |
limit | integer | optional | 1–100 (Standard 20). |
offset | integer | optional | Paginierungs-Offset. |
GET
/v1/library/{id}
kostenlos
Einzelnes Library-Eintrag-Metadaten. has_asr / has_summary zeigen, welcher Content-Endpoint als Nächstes aufgerufen werden sollte.
GET
/v1/library/{id}/transcript
kostenlos
Gibt die ASR-Segments und den verbundenen Text für einen Library-Eintrag zurück. 404, wenn kein abgeschlossenes ASR existiert.
GET
/v1/library/{id}/summary
kostenlos
Gibt den gespeicherten Zusammenfassungstext zurück. Mit ?locale= aus mehreren Locales wählen (Standard: Accept-Language, dann en). 404, wenn für (video_id, locale) keine Zusammenfassung existiert.
POST
/v1/library
kostenlos (1 Token-Quota)
kind=asr markiert ein gespeichertes Transkript (Segments liegen bereits in der ASR-Tabelle). kind=summary lädt einen vorgenerierten Zusammenfassungstext in die summaries-Tabelle und setzt has_summary=true. Upsert auf (video_id, locale).
Body (JSON)
| Name | Typ | Pflicht | Beschreibung |
video_id | string | ERFORDERLICH | YouTube-Video-ID. |
kind | string | ERFORDERLICH | asr oder summary. |
title / author / thumbnail / video_url / language / tag | string | optional | Metadaten für Anzeige / Filter. |
locale | string | Summary-Modus | Locale der Zusammenfassung (Standard: Accept-Language, dann en). |
text | string | bei kind=summary | Zu persistierender Zusammenfassungstext. |
model | string | optional | LLM-Identifier (z. B. claude-opus-4). |
DELETE
/v1/library/{id}
kostenlos
Soft-Delete eines Library-Eintrags. Ein erneuter POST /v1/library für dasselbe Video stellt die Zeile wieder her, statt ein Duplikat anzulegen.
Offizielle SDKs
Mit unseren offiziellen Client-Bibliotheken schnell integrieren:
→ Vollständiger Code: github.com/SubDownload/api-sdk
→ Für Abrechnung, Rate-Limits und Fehlercodes siehe Support & Abrechnung.