Für Entwickler
Wenn du eine eigene Anwendung baust, kann sie erfahren, welche Bibelstelle heute im Bibelplan eines Levit-Audio-Nutzers ansteht — sofern er es dir erlaubt. Gedacht ist das zum Beispiel für eine Predigtvorbereitung, die die Exegese gleich mit dem richtigen Kapitel öffnet.
Sie beantwortet eine Frage: Welche Bibelstelle steht heute im Plan? Sie ist ausschließlich lesend — es gibt keinen Weg, über sie etwas zu ändern, abzuhaken oder einen Plan zu starten.
Sie gibt keine personenbezogenen Daten heraus: keinen Namen, keine E-Mail-Adresse, keine Kontokennung. Und sie gibt keine Audio-Verweise heraus — intern trägt ein Plankapitel Verweise auf die Aufnahmen, deren Kennung und Dateigrößen. Nichts davon verlässt den Server: Eine zweite Anwendung braucht es nicht, und die Aufnahmen sind lizenziert.
Geliefert wird nur der Hauptplan. Zusatzpläne bleiben außen vor — eine Antwort, eine Bedeutung.
Basis-URL: https://audio.levit-cloud.de
Verfügbar ab: Backend 0.199.0
Ein Zugang gehört einem Nutzer und wird von ihm erteilt. Es gibt keine gemeinsame Anmeldung zwischen Anwendungen; das Token ist die Brücke.
In der App: Einstellungen → Sync & Daten → Zugänge für andere Apps → Bezeichnung eingeben → Erzeugen.
Der Klartext erscheint genau einmal. Gespeichert wird auf dem Server
nur seine Prüfsumme — wer ihn nicht sichert, braucht einen neuen. Er beginnt mit
lvt_, damit er in Protokollen und Sicherheitswerkzeugen auffällt.
curl https://audio.levit-cloud.de/integration/bibelplan/heute \
-H "Authorization: Bearer lvt_…"
{
"success": true,
"data": {
"aktiv": true,
"planTag": 20,
"kapitel": [
{ "spur": 1, "bookNumber": 40, "bookNameDe": "Matthäus", "chapterNumber": 20 }
]
}
}
| Feld | Bedeutung |
|---|---|
aktiv |
Ob überhaupt ein Hauptplan läuft |
planTag |
Der Tag im Plan, 1-basiert. Kann null sein |
kapitel |
Was heute ansteht — ein Eintrag je Spur |
spur |
1 ist die Hauptspur; ein zweispuriger Plan führt z. B. zusätzlich einen Psalm |
bookNumber |
Bibelbuch 1–66 (1 = 1. Mose, 40 = Matthäus, 66 = Offenbarung) |
chapterNumber |
Kapitel innerhalb des Buchs |
Es zählt der Plantag, nicht das nächste ungelesene Kapitel. Ein Plan ist eine Liste von Tagen; Tag für Tag hören rückt ihn vor. Auch die Tagesroutine der App folgt genau diesem Feld.
{ "success": true, "data": { "aktiv": false, "kapitel": [] } }
In diesem Fall fehlt planTag ganz — nicht
null, sondern gar nicht vorhanden. Prüfe deshalb zuerst aktiv.
Alle Fehler tragen dieselbe Hülle:
{ "success": false, "error": { "code": "…", "message": "…" } }
| Status | Wann |
|---|---|
| 401 | Kein Authorization: Bearer-Kopf vorhanden |
| 401 | Token unbekannt, widerrufen oder falsch geformt |
| 429 | Abfragegrenze überschritten |
Die drei ungültigen Fälle sind absichtlich nicht unterscheidbar: unbekannt, widerrufen und falsch geformt ergeben wortgleich dieselbe Antwort. Wer rät, soll aus der Antwort nicht lernen, wie weit er danebenlag. Behandle jedes 401 gleich — Token neu erfragen.
Drei Stufen greifen übereinander; die strengste gilt.
| Stufe | Grenze |
|---|---|
| Diese Route | 30 Anfragen pro Minute |
| Server allgemein | 100 pro Minute |
| Reverse Proxy | 100 im Schnitt, Puffer 50 |
Das reicht weit für den gedachten Zweck. Wer den Stand laufend anzeigt, sollte ihn zwischenspeichern — er ändert sich höchstens täglich.
In der App auf demselben Bildschirm, Widerrufen neben dem Eintrag. Ab dem nächsten Aufruf antwortet die Schnittstelle mit 401. Der Eintrag bleibt in der Liste stehen — als Beleg, dass es ihn gab und wann er zuletzt benutzt wurde.
const antwort = await fetch(
"https://audio.levit-cloud.de/integration/bibelplan/heute",
{ headers: { Authorization: `Bearer ${token}` } },
);
if (antwort.status === 401) return null; // Token neu erfragen
const { data } = await antwort.json();
if (!data.aktiv || data.kapitel.length === 0) return null;
const heute = data.kapitel.find((k) => k.spur === 1) ?? data.kapitel[0];
return `${heute.bookNameDe} ${heute.chapterNumber}`;
Fragen dazu: Kontakt. Es gilt, was dort steht — dies ist ein privates Projekt, und es besteht kein Anspruch auf Unterstützung.