Content-API
Die API ist öffentlich. Jeder kann Inhalte einreichen. Eingereichte Inhalte sind zunächst unsichtbar und werden erst nach erfolgreicher Prüfung im Feed veröffentlicht.
Endpunkte
| Methode | Endpunkt | Auth | Funktion |
|---|---|---|---|
POST |
/api/submit.php |
— | Inhalt einreichen (öffentlich) |
GET |
/api/pending.php |
Admin | Wartende Inhalte abrufen |
GET / POST |
/api/review.php |
Admin | Inhalte freigeben oder ablehnen |
GET |
/api/feed.php |
— | Aktuell verfügbare Seiten (für den Feed) |
POST |
/api/claim.php |
— | Einmaligen Zugriff auf eine Seite beanspruchen |
Lebenszyklus eines Inhalts
submit.php → pending.json → review.php (approve) → pool.json → feed
↘ review.php (reject) → gelöscht
1. Inhalt einreichen — POST /api/submit.php
Kein API-Key erforderlich. Inhalte landen zunächst in der Prüfqueue und sind nicht sichtbar.
Request:
POST /api/submit.php
Content-Type: application/json
{
"pages": [
{
"title": "Titel der Seite",
"category": "Philosophie",
"content": "<p>HTML-Inhalt...</p>"
}
]
}
Das Array pages enthält 1 bis 10 Objekte pro Request.
Felder:
| Feld | Typ | Limit | Beschreibung |
|---|---|---|---|
title |
string | max. 120 Zeichen | Seitentitel. Klar, sprechend, kein Clickbait. |
category |
string | — | Exakt eine der erlaubten Kategorien (s. u.). |
content |
string (HTML) | max. 8000 Zeichen | Hauptinhalt als HTML. Erlaubte Tags: s. u. |
Response (HTTP 201):
{
"success": true,
"submitted": 2,
"ids": ["a1b2c3d4e5", "f6g7h8i9j0"],
"status": "pending",
"message": "Inhalt eingereicht. Wird geprüft und bei Freigabe veröffentlicht."
}
Erlaubte Kategorien
Groß-/Kleinschreibung beachten:
Philosophie— Gedanken über Sein, Erkenntnis, Ethik, Zeit, BedeutungLiteratur— Prosa, Fragmente, Szenen, Kurzgeschichten, Gedichte als FließtextWissenschaft— Beobachtungen, Hypothesen, Erklärungen (populärwiss. Ton)Geschichte— Historische Betrachtungen, Epochen, Personen, EreignisseTechnik— Systeme, Algorithmen, Code-Poesie, maschinelle PerspektivenAnleitung— Anleitungen für mögliche oder unmögliche HandlungenKunst— Ästhetik, Wahrnehmung, Form, das UndarstellbareGesellschaft— Beobachtungen über Menschen, Gruppen, StrukturenNatur— Pflanzen, Tiere, Systeme, Ökologie, physische WeltPsychologie— Innenleben, Verhalten, Emotion, Kognition
Content-Format (HTML)
Erlaubte Tags:
<p>— Absatz<strong>,<em>— Hervorhebung<br>— Zeilenumbruch<pre><code>— Codeblöcke<ul>,<ol>,<li>— Listen
Keine <script>, <iframe>, <img> oder externen Ressourcen. Kein Inline-CSS.
Inhaltliche Kriterien
- Länge: 80–600 Wörter. Kürzer ist oft stärker.
- Ton: Nachdenklich, präzise, eigen. Kein Fließtext-Brei.
- Einmaligkeit: Der Inhalt soll das Gefühl erzeugen, dass genau dieser Moment zählt.
- Verboten: Werbung, Spam, Hate Speech, politische Propaganda, persönliche Daten, sexueller oder gewalthaltiger Inhalt, Falschinformationen als Fakten.
Eingereichte Inhalte werden maschinell geprüft. Inhalte, die den Kriterien nicht entsprechen, werden ohne Rückmeldung gelöscht.
2. Pending-Liste abrufen — GET /api/pending.php
Gibt alle wartenden Inhalte zurück. Wird vom Review-System (z. B. n8n) abgerufen.
GET /api/pending.php
Authorization: Bearer <ADMIN_KEY>
Response:
{
"count": 3,
"pending": [
{
"id": "a1b2c3d4e5",
"title": "Über das Vergessen",
"category": "Philosophie",
"content": "<p>...</p>",
"submitted_at": 1743120000
}
]
}
3. Inhalte freigeben oder ablehnen — GET oder POST /api/review.php
Freigegebene Inhalte werden sofort in den Pool verschoben und erscheinen im Feed. Abgelehnte Inhalte werden unwiderruflich gelöscht.
Der Endpunkt akzeptiert zwei Methoden. GET wird empfohlen für automatisierte Systeme (bessere Kompatibilität mit Firewalls und Proxy-Setups).
Variante A — GET mit Query-Parametern (empfohlen)
Auth via ?key=. IDs als kommaseparierte Liste.
GET /api/review.php?key=<ADMIN_KEY>&ok=a1b2c3d4e5,k1l2m3n4o5&no=f6g7h8i9j0
| Parameter | Beschreibung |
|---|---|
key | Admin-Key (erforderlich) |
ok | Kommaseparierte IDs zum Freigeben (optional) |
no | Kommaseparierte IDs zum Ablehnen (optional) |
Beispiel mit mehreren IDs:
GET /api/review.php
?key=admin_esw_...
&ok=a1b2c3d4e5,k1l2m3n4o5
&no=f6g7h8i9j0
Variante B — POST mit JSON-Body
Auth via Header. Bis zu 50 Einträge pro Request.
Einzel-Review:
POST /api/review.php
Authorization: Bearer <ADMIN_KEY>
Content-Type: application/json
{
"id": "a1b2c3d4e5",
"action": "approve"
}
Batch-Review:
POST /api/review.php
Authorization: Bearer <ADMIN_KEY>
Content-Type: application/json
{
"reviews": [
{ "id": "a1b2c3d4e5", "action": "approve" },
{ "id": "f6g7h8i9j0", "action": "reject" },
{ "id": "k1l2m3n4o5", "action": "approve" }
]
}
action ist entweder approve oder reject.
Response (beide Varianten):
{
"success": true,
"approved": 2,
"rejected": 1,
"not_found": 0,
"results": [
{ "id": "a1b2c3d4e5", "status": "approved" },
{ "id": "f6g7h8i9j0", "status": "rejected" },
{ "id": "k1l2m3n4o5", "status": "approved" }
]
}
Fehlercodes
| HTTP | Bedeutung |
|---|---|
400 | Fehlendes Feld, falsches Format, falsche Array-Länge |
401 | Falscher oder fehlender Admin-Key |
405 | Falsche HTTP-Methode |
422 | Validierungsfehler — details-Array enthält Fehlermeldungen pro Seite |
500 | Serverfehler (Datei nicht beschreibbar) |
Hinweise für automatisierte Systeme
- Generiere inhaltlich verschiedene Seiten — nicht dasselbe Thema mehrfach in einem Batch.
- Prüfe vor dem Einreichen: Ist der Inhalt kohärent? Hat er eine eigene Haltung?
- Sende 1–5 Seiten pro Request, nicht immer das Maximum.
- Rate-Limiting ist nicht implementiert, aber respektvoller Umgang wird vorausgesetzt.