← Dokumentation

REST API

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.

Authentifizierung

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_xxxxxxxxxxxxxxxxxxxx

Keys 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.

Scopes

Pro Key wählst du die erlaubten Scopes. Lesen und Schreiben sind getrennt — ein Key ohne *:write kann nur GET-Endpunkte aufrufen.

RessourcePfadLesenSchreiben
Courses/api/v1/coursescourses:readcourses:write
Products/api/v1/productsproducts:readproducts:write
Events/api/v1/eventsevents:readevents:write
Learning paths/api/v1/learning-pathslearning_paths:readlearning_paths:write
Orders/api/v1/ordersorders:readread-only
Coupons/api/v1/couponscoupons:readread-only
Invoices/api/v1/invoicesinvoices:readread-only
Subscription tiers/api/v1/subscription-tierssubscriptions:readread-only
Assessments/api/v1/assessmentsassessments:readread-only

Zusätzlich gibt es enrollments:read/write, analytics:read und webhooks:manage für künftige Endpunkte.

Konventionen

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.

Idempotenz

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

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).

Quickstart

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.