Die öffentliche Lekto REST API unter /api/v1. Authentifizierung über scoped API-Keys, JSON-Ein- und Ausgabe, organisationsweit isoliert. Diese Seite ist der Einstieg — die vollständige, interaktive Endpoint-Referenz liegt in der OpenAPI-UI.
Jeder Request braucht einen API-Key im Authorization-Header als Bearer-Token. Keys haben das Präfix lpk_live_ und werden im Dashboard unter Einstellungen → Integrationen erstellt (Abschnitt „REST API Keys"). Der Key wird nur einmal angezeigt — sicher speichern.
Authorization: Bearer lpk_live_xxxxxxxxxxxxxxxxxxxxKeys sind an genau eine Organisation gebunden — du siehst und änderst nur deren Daten. Fehlt der Header, antwortet die API mit 401; fehlt der nötige Scope, mit 403.
Pro Key wählst du die erlaubten Scopes. Lesen und Schreiben sind getrennt — ein Key ohne *:write kann nur GET-Endpunkte aufrufen.
| Ressource | Pfad | Lesen | Schreiben |
|---|---|---|---|
| Courses | /api/v1/courses | courses:read | courses:write |
| Products | /api/v1/products | products:read | products:write |
| Events | /api/v1/events | events:read | events:write |
| Learning paths | /api/v1/learning-paths | learning_paths:read | learning_paths:write |
| Orders | /api/v1/orders | orders:read | read-only |
| Coupons | /api/v1/coupons | coupons:read | read-only |
| Invoices | /api/v1/invoices | invoices:read | read-only |
| Subscription tiers | /api/v1/subscription-tiers | subscriptions:read | read-only |
| Assessments | /api/v1/assessments | assessments:read | read-only |
Zusätzlich gibt es enrollments:read/write, analytics:read und webhooks:manage für künftige Endpunkte.
Versionierung. Jede Antwort trägt den Header Lekto-Version (datumsbasiert). Du kannst eine Version pinnen, indem du denselben Header sendest.
Pagination. List-Endpunkte nehmen ?limit= (1–100, Default 20) und ?offset= und antworten mit einem Envelope:
{ "items": [ … ], "total": 42, "limit": 20, "offset": 0 }Preise sind immer in Cent (priceInCents). Slugs sind pro Organisation eindeutig (Kleinbuchstaben, Ziffern, Bindestriche).
Rate-Limit. 100 Requests/Minute pro Key; die Header X-RateLimit-Limit/Remaining/Reset und bei 429 ein Retry-After werden mitgeliefert.
Bei schreibenden Requests (POST/PATCH/DELETE) kannst du einen Idempotency-Key-Header mitsenden. Wiederholst du den Request mit demselben Key (z. B. nach einem Netzwerkfehler), wird die ursprüngliche Antwort erneut ausgeliefert (Header Idempotency-Replayed: true), statt die Aktion ein zweites Mal auszuführen.
Fehler haben ein einheitliches Format mit einer mitführbaren Request-ID:
{
"error": "not_found",
"message": "course … not found",
"requestId": "req_…"
}Status-Codes: 401 (kein/ungültiger Key), 403 (fehlender Scope), 404 (unbekannt — auch für fremde Organisationen, ohne Existenz preiszugeben), 409 (Slug-Konflikt), 422 (Validierung), 429 (Rate-Limit).
Kurse auflisten:
curl "https://lekto.so/api/v1/courses?limit=10" \
-H "Authorization: Bearer lpk_live_…"Einen Kurs anlegen (idempotent):
curl -X POST "https://lekto.so/api/v1/courses" \
-H "Authorization: Bearer lpk_live_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{ "title": "Mein Kurs", "slug": "mein-kurs" }'Alle Endpunkte, Felder und Beispiel-Responses gibt es in der interaktiven API-Referenz.