REST API
Eine JSON-API unter /api/renick/content/v1, gebaut auf denselben Services wie der Editor. Routenliste: REST-Referenz.
Standardmäßig deaktiviert
Jeder Request erhält 404 "API disabled", bis die API unter Einstellungen → Content → API-Tokens aktiviert ist.
API-Tokens
Senden Sie bei jedem Request ein Token, ausschließlich über HTTPS:
Authorization: Bearer <token>Tokens werden auf derselben Einstellungsseite verwaltet (Berechtigung renick.content.manage_api_tokens). Ein neues Token (rc_…) wird einmalig angezeigt und nur als SHA-256-Hash gespeichert. Deaktivieren oder Löschen widerruft es sofort. Ein fehlendes, unbekanntes oder inaktives Token erhält 401.
| Token | Erlaubt |
|---|---|
read | nur GET/HEAD; PUT und POST erhalten 403 |
read_update | alle Endpoints, auch Schreiben, KI-Aufrufe, Bundle-Import und Wiederherstellen |
| Legacy-Bearer-Token (Feld über der Liste) | alle Endpoints; leeren Sie es, sobald jeder Client ein persönliches Token hat |
read_update-Tokens sind vollständig vertrauenswürdig
Sie können Richtext- und Code-Blöcke schreiben, deren HTML/JS ungefiltert bei jedem Besucher läuft. Behandeln Sie sie wie Editor-Zugriff im Backend und nutzen Sie read, wo immer möglich.
Host-Adressierung
Dokument-Endpoints erwarten host_type (Model-Klasse), host_id, field (Standard content) und für Tailor section (Blueprint-Handle, Pflicht, wenn die ID in mehreren Blueprints existiert).
host_type muss ein Tailor-EntryRecord sein, eine Klasse unter host_types in config/api.php (Standard: SharedContent) oder eine über das Event renick.content.api.resolveHostTypes hinzugefügte Klasse. Jede andere Klasse und ein fehlender Datensatz erhalten 404 "Host not found". Ein field, das kein Content-Feld ist, erhält 422.
Limits und Fehler
- Bodys: Dokumente bis 2 MB, Bundles bis 50 MB (413).
- Rate: 60 Requests pro Minute pro Token, KI-Aufrufe (
translate,draft) zusätzlich 10 pro Minute (429, immer JSON). - Bundle-Importe werden vor dem Entpacken geprüft: 20 MB pro Datei, 200 MB insgesamt, Dateitypen der Media Library, sichere Pfade.
- Andere Fehler, etwa ein ungültiges Dokument oder ein fehlgeschlagener KI-Aufruf, liefern HTTP 500.
Die Werte stehen in config/limits.php und config/bundle.php.
Endpoints
| Endpoint | Verhalten |
|---|---|
GET /document | das Dokument und seine referenzierten Medienpfade |
PUT /document | validiert document und speichert es als Version import |
GET/POST /document/bundle | ZIP mit Dokument und Medien; der Import nimmt den rohen Body oder ein Dateifeld bundle, overwrite_media=1 ersetzt Dateien |
POST /translate | target_language, optional source_language; ersetzt das gespeicherte Dokument als Version ai_translate |
POST /draft | nur brief und optional template_id; liefert ein Dokument, ohne zu speichern |
POST /duplicate | gibt das gesendete document mit neuen Block-IDs zurück |
GET /templates | bis zu 100 Vorlagen |
GET /versions, POST /restore | die neuesten 100 Versionen; stellt version_id als neue Version restore wieder her |
curl -G -H "Authorization: Bearer $TOKEN" \
--data-urlencode 'host_type=Tailor\Models\EntryRecord' \
--data-urlencode 'section=Content\Article' -d host_id=1 \
https://example.com/api/renick/content/v1/document
# → {"document": {...}, "media": ["/photos/hero.jpg"]}
curl -X PUT -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"host_type":"Tailor\\Models\\EntryRecord","section":"Content\\Article","host_id":1,
"document":{"blocks":[{"type":"heading","data":{"text":"Hello","level":"h2"}}]}}' \
https://example.com/api/renick/content/v1/document
# → {"document": {...normalized...}}