API-Dokumentation
Öffentliche REST-API für Episodendaten von Kack & Sachgeschichten.
https://kack.li
JSON
300 REQ / MIN (default)
CORS ENABLED
BREAKING CHANGE · 2026-04-13
Das Feld episode_num wurde als nicht verlässlich eingestuft und ist ab sofort aus den API-Responses entfernt.
RATE LIMITS & 429-VERHALTEN
Alle öffentlichen API-Requests unter /api/* sind standardmässig auf 300 Requests pro Minute limitiert. Die Antwort enthält zur Steuerung immer diese Header. Limits sind per ENV konfigurierbar.
RateLimit-Policy– aktives Limitfenster (z. B.300;w=60)RateLimit-Limit– maximale Requests im FensterRateLimit-Remaining– verbleibende RequestsRateLimit-Reset– Sekunden bis Reset
Beispiel (200):
RateLimit-Policy: 300;w=60
RateLimit-Limit: 300
RateLimit-Remaining: 298
RateLimit-Reset: 42
Beispiel (429):
HTTP 429 Too Many Requests
{ "error": "Zu viele Anfragen, bitte später erneut versuchen." }
Öffentliche Endpunkte
GET
/api/status
Systemstatus & Statistiken
public
▶
Gibt den aktuellen Status der Datenbank zurück: Episodenanzahl, Parse-Stand, letzter Sync.
Klicke „Ausführen" um die API live abzufragen.
GET
/api/episodes
Episodenliste mit Suche & Filter
public
▶
Paginierte Episodenliste mit Discovery-Funktionen (Sortierung, Facetten, Mehrfachfilter).
Validierung:
Beispiele:
Validierung:
limit muss eine Ganzzahl von 1–100 sein, offset eine Ganzzahl ≥ 0. Ungültige Parameter liefern 400 mit { code, message, details }.Beispiele:
/api/episodes?sort=relevance&q=star%20wars&has_guest=1/api/episodes?topic[]=Psychologie&topic[]=Philosophie&sort=duration| Parameter | Typ | Beschreibung | Wert |
|---|---|---|---|
| q optional | string | Volltextsuche in Titel & Beschreibung | |
| guest optional | string | Filter nach Gastname | |
| topic optional | string | Filter nach Thema (einzeln) | |
| topic[] optional | repeatable | Mehrfachfilter, z. B. topic[]=A&topic[]=B | |
| sort optional | string | pub_date (default), relevance, duration | |
| has_guest optional | boolean | 1/0, true/false, yes/no | |
| has_chapters optional | boolean | Nur Episoden mit/ohne Kapitel | |
| has_film_title optional | boolean | Nur Episoden mit/ohne Werkbezug | |
| limit optional | integer | Anzahl Ergebnisse (1–100) | |
| offset optional | integer | Offset für Paginierung (≥ 0) |
Klicke „Ausführen" um die API live abzufragen.
GET
/api/episodes/:id
Einzelne Episode
public
▶
Gibt eine einzelne Episode mit allen Feldern zurück (inkl. Kapitel, Gäste, Themen, Film-Titel).
| Parameter | Typ | Beschreibung | Wert |
|---|---|---|---|
| :id required | integer | Episoden-ID |
Klicke „Ausführen" um die API live abzufragen.
GET
/api/guests
Alle Gäste mit Auftrittsanzahl
public
▶
Liste aller Gäste, sortiert nach Anzahl der Auftritte.
Klicke „Ausführen" um die API live abzufragen.
GET
/api/topics
Alle Themen mit Häufigkeit
public
▶
Liste aller Themen, sortiert nach Häufigkeit über alle Episoden.
Klicke „Ausführen" um die API live abzufragen.
Admin-Endpunkte (Bearer-Token erforderlich)
Wird nur lokal im Browser gespeichert und ausschließlich für Anfragen an diese API verwendet.
GET
/api/suggestions
Community-Vorschläge mit Status
admin
▶
Gibt eingereichte Community-Vorschläge zurück. Standardmäßig siehst du
pending. Mit Filtern kannst du auch bereits freigegebene oder abgelehnte Vorschläge ansehen.| Parameter | Typ | Beschreibung | Wert |
|---|---|---|---|
| status optional | string | pending, approved oder rejected | |
| type optional | string | guest, topic oder film | |
| episode_id optional | integer | Nur Vorschläge für eine bestimmte Episode | |
| limit optional | integer | Anzahl Einträge (max. 500) |
Token eingeben und „Ausführen" klicken.
GET
/api/logs
Server-Logs
admin
▶
Gibt die letzten Server-Logs zurück (Sync, Parse, Cron, Boot). Max. 500 Einträge.
| Parameter | Typ | Beschreibung | Wert |
|---|---|---|---|
| event optional | string | Filter: sync, parse, parse-all, parse-films, cron, boot | |
| level optional | string | Filter: info, error | |
| limit optional | integer | Anzahl Einträge (max. 500) |
Token eingeben und „Ausführen" klicken.
POST
/api/sync
RSS-Feed synchronisieren
admin
▶
Synchronisiert den RSS-Feed und fügt neue Episoden zur Datenbank hinzu. Gibt die Anzahl aller und neuer Episoden zurück.
Token eingeben und „Ausführen" klicken.
POST
/api/parse-all
Alle Episoden mit OpenAI analysieren
admin
▶
Analysiert alle noch nicht geparsten Episoden im Hintergrund (~3 req/s). Mit
?force=1 werden alle Episoden neu analysiert.| Parameter | Typ | Beschreibung | Wert |
|---|---|---|---|
| force optional | 1 | Alle Episoden neu analysieren |
Token eingeben und „Ausführen" klicken.
POST
/api/parse-films
Nur Filmtitel mit OpenAI abgleichen
admin
▶
Berechnet ausschließlich
film_title neu. Ohne Parameter werden nur Episoden ohne Filmtitel bearbeitet. Mit ?force=1 werden alle Episoden erneut nur auf Filmtitel geprüft.| Parameter | Typ | Beschreibung | Wert |
|---|---|---|---|
| force optional | 1 | Alle Episoden erneut nur auf Filmtitel prüfen |
Token eingeben und „Ausführen" klicken.