Calendar & Images API
Editorial-Calendar-Events sowie AI-Image-Generation, -Gallery und -Edits per HTTP.
Zwei eng verwandte Subsysteme: der Editorial Calendar plant geplante Veröffentlichungen pro Projekt, die Image Gallery verwaltet team-weit alle generierten Bilder. Beide arbeiten mit Articles zusammen — ein Calendar-Event referenziert oft einen Artikel, ein Bild wird oft direkt aus einem Artikel-Hero-Slot heraus generiert.
Modul-Kontext: Editorial Calendar · Image Gallery.
Calendar
Pro Projekt eine eigene Event-Liste, jede Event ist ein geplanter Content-Slot (Artikel, Social-Post, Newsletter etc.).
| Method | Endpoint | Beschreibung |
|---|---|---|
| GET | /v1/projects/{project}/calendar |
Alle Events des Projekts |
| POST | /v1/projects/{project}/calendar |
Neues Event anlegen |
| GET | /v1/calendar/{id} |
Detail |
| PUT | /v1/calendar/{id} |
Update (title, scheduled_at, status, article_id) |
| DELETE | /v1/calendar/{id} |
Löschen |
curl -X POST "$BASE/projects/12/calendar" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"title": "AI Coding Tools — Launch-Post",
"scheduled_at": "2026-05-15T09:00:00Z",
"article_id": 88,
"status": "scheduled"
}'
Project Images (legacy)
Per-Projekt-Listing — bleibt aus Kompatibilitätsgründen erhalten. Für neue Integrationen die team-weite Gallery unten nutzen.
| Method | Endpoint | Beschreibung |
|---|---|---|
| GET | /v1/projects/{project}/images |
Bilder eines Projekts (legacy) |
Image Gallery (team-scoped, primärer Pfad)
Cross-Team-IDs liefern 404 (kein Existenz-Leak, kein 403).
Lesen & Filtern
| Method | Endpoint | Credits | Beschreibung |
|---|---|---|---|
| GET | /v1/images |
0 | Filter: ?q, ?model, ?from, ?to, ?favorite, ?tags[], ?sort=newest|oldest|edited, ?page, ?per_page |
| GET | /v1/images/trash |
0 | Soft-deleted Bilder |
| GET | /v1/images/{id} |
0 | Detail inkl. variants[] und parent-Tree |
Erzeugen & Bearbeiten
| Method | Endpoint | Credits | Beschreibung |
|---|---|---|---|
| POST | /v1/generate/image |
5 | Neues Bild aus Prompt erzeugen (async) |
| POST | /v1/images/{id}/edit |
10 | Edit-Variante via OpenAI /v1/images/edits. Async 202 → {job_id, edit_session_id} |
| PATCH | /v1/images/{id} |
0 | Metadaten: {title?, tags?[]} |
| POST | /v1/images/{id}/favorite |
0 | Toggle is_favorite |
# Edit dispatchen
curl -X POST "$BASE/images/42/edit" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"prompt":"same scene, golden hour lighting"}'
# Pollen bis edit fertig — neue Variante taucht in variants[] auf
curl "$BASE/images/42" -H "Authorization: Bearer $TOKEN" \
| jq '.data.variants[-1] | {id, processing_status, url}'
Trash & Bulk
| Method | Endpoint | Credits | Beschreibung |
|---|---|---|---|
| DELETE | /v1/images/{id} |
0 | Soft-delete (30 Tage Trash, dann hard-delete) |
| POST | /v1/images/{id}/restore |
0 | Aus Trash wiederherstellen |
| DELETE | /v1/images/{id}/forever |
0 | Endgültig löschen — NUR aus Trash, sonst 409 |
| POST | /v1/images/bulk/delete |
0 | Body {ids:[]} max 200 |
| POST | /v1/images/bulk/restore |
0 | Body {ids:[]} max 200 |
| POST | /v1/images/bulk/export |
0 | Body {ids:[]} max 500. Async 202 → {job_id} (ZIP) |
| GET | /v1/images/exports/{job_id} |
0 | Export-Status: {status, download_url?} |
Sharing & Chat
| Method | Endpoint | Credits | Beschreibung |
|---|---|---|---|
| POST | /v1/images/{id}/open-in-chat |
0 | Erstellt AiChatSession mit gallery_image_id={id} → {session_id} |
| POST | /v1/images/{id}/share |
0 | Idempotenter Public-Share. Body {expires_at?} → {token, public_url, …} |
| PATCH | /v1/images/{id}/share |
0 | Expiry ändern. {expires_at: ISO|null} (404 wenn kein aktiver Share) |
| DELETE | /v1/images/{id}/share |
0 | Public-Share widerrufen (View-Count bleibt) |
Hinweise
- Image-Generate ist async.
POST /v1/generate/imageliefert202mit Job-ID —GET /v1/images/{id}bisprocessing_status == "ready"pollen. - Edit erzeugt Variante, kein Replace. Das Original bleibt erhalten; die neue Variante hängt am
parent-Tree. - Bulk-Limits sind hart.
bulk/deleteundbulk/restoresind auf 200 IDs gedeckelt,bulk/exportauf 500. Größere Sets in Tranchen schicken. - Gallery ist team-scoped. Cross-Team-Zugriff ergibt
404(per Design — keine Existenz-Leaks).
Verwandt: Artikel-API · Calendar · Image Gallery.