Octibiz
Demo

Durchsucht Website und Dokumentation gemeinsam. Enter zeigt alle Treffer, Esc schließt.

Inhalte — API und MCP

Überblick

Dieser Bereich stellt 59 Operationen bereit. Jede davon ist zugleich ein MCP-Werkzeug.

Der Bereich hängt am Modul-Schalter module.content. Ist das Modul aus, antworten diese Operationen mit 404.

Operationen

MethodePfadZweckRechtParameter
GET/api/v1/content/adaptersVerfügbare Ausspiel-Ziele — Die Adapter, die diese Installation bereitstellt — abhängig davon, welche Plugins aktiv sind.content.item.view—
POST/api/v1/content/aiKI-Vorschlag für einen Beitrag — Erzeugt einen Feld-Entwurf (draft), eine SERIE zusammenhängender Entwürfe (series, 2–30), Suchmaschinen-Angaben (seo), ein Bild (image, landet in der Dateiablage) oder schreibt den Text EINES Feldes um (rewrite: text, instruction = shorter\longer\formal\casual\simpler\fix oder eigener Wunsch, html für Richtext; Antwort in text). Das Markenprofil der Marke (/v1/content/brand-profiles; ohne Marke das der Standard-Marke) geht in jeden Auftrag — Tonfall, Zielgruppe, Themen, Tabus, Produkte, Beispiele; Bilder bekommen Bildsprache, Markenfarben und Tabus. Ohne aktive KI kommt eine leere Antwort mit aiUsed=false — kein Fehler. Marken-Schnitt: seo verlangt das Schreibrecht content.item.manage in der Marke des BEITRAGS (content.brand.all hebt die Marken-Bindung auf, ersetzt das Recht aber nie) — ein fremder Beitrag ist nicht auffindbar (404), ein brandId im Rumpf wird dabei ignoriert; draft, series, image und rewrite verlangen dasselbe Recht in der angegebenen brandId (sonst 403), deren Instruktion, Budget und Ablage gelten.content.item.manage+ Rumpf
GET/api/v1/content/approvalsZur Freigabe — Alle Beiträge, die auf eine Freigabe warten (review), älteste zuerst — je Beitrag dieselbe Ansicht wie das Studio: Vorschau je Netzwerk, vorgeschlagener Zeitpunkt, canPublish. Freigeben und planen: POST /v1/content/items/{ulid}/schedule; zurückgeben mit Hinweis: POST /v1/content/items/{ulid}/return. Markenscharf am Recht.content.item.viewpage, brandId
POST/api/v1/content/assetsBild für Beiträge hochladen (WebP + srcset) — Bild als Base64 in contentBase64, Dateiname in filename; optional convertToWebp (Vorgabe an), brandId, folder, alt. Nur PNG, JPEG, WebP, GIF. Antwort: url, width, height, variants — so in ein Bild-Feld des Beitrags schreiben ({src: url, alt, width, height, variants}); die Website baut daraus srcset. Recht: content.item.manage in der Marke.content.item.manage+ Rumpf
GET/api/v1/content/brand-profilesMarkenprofile — Die Markenprofile der Marken, in denen Sie Inhalte sehen dürfen — je Marke höchstens eines. Mit brandId genau das Profil dieser Marke (leere Liste, wenn es noch keines gibt).content.item.view · content.profile.managebrandId
POST/api/v1/content/brand-profilesMarkenprofil anlegen — Legt das Profil einer Marke an (brandId Pflicht, Recht content.profile.manage in dieser Marke, sonst 403). Ohne websiteUrl gilt die Website der Marke. Eine Marke hat höchstens ein Profil (409 errors.content.brandProfileExists).content.profile.manage+ Rumpf
GET/api/v1/content/brand-profiles/{ulid}Markenprofil lesen — Ein Markenprofil mit Logo, Farben, Name und Website der Marke (lesend) und den aufgelösten Schwerpunkt-Artikeln. Lesbar mit dem Lese-Recht der Inhalte oder dem Pflege-Recht IN der Marke des Profils (sonst 403).content.profile.manage · Objektregel content.viewulid
PATCH/api/v1/content/brand-profiles/{ulid}Markenprofil ändern — Ändert die genannten Felder; die Marke selbst wechselt nie. analysisAdopted: true hält den Stand der Website-Analyse fest (analyzedAt, analyzedUrl). productUlids verweist auf Artikel des Katalogs (nur mit aktivem Artikel-Modul; unbekannte fallen heraus). competitors ersetzt die Konkurrenten (Name Pflicht), occasionCountry/occasionsOff/customOccasions steuern den Anlass-Kalender (eigener Anlass: Name und Datum MM-TT jährlich bzw. JJJJ-MM-TT einmalig, sonst 422 errors.content.brandProfileOccasionInvalid).content.profile.manageulid, + Rumpf
GET/api/v1/content/brand-profiles/{ulid}/knowledgeMarken-Wissen lesen — Was das System über die Marke des Profils weiß und jedem KI-Auftrag mitgibt: Auftritt, Artikel mit Fotos (Datei-ULIDs) und Verkaufszahlen der letzten 90 Tage (Absatz, Umsatz, Marge, Bestand, Neuheit, Überbestand; ausverkaufte mit soldOut — sie werden nie beworben), beste Beiträge und Anzeigen mit Kennzahlen, Erkenntnisse aus Tests, Konkurrenten und kommende Anlässe; dazu der Block, wie ihn die KI liest (promptBlock). Verkaufszahlen nur, wo ein Modul sie liefert — sonst null. Recht content.profile.manage IN der Marke des Profils (sonst 403).content.profile.manageulid
POST/api/v1/content/brand-profiles/{ulid}/suggestionMarkenprofil vorschlagen lassen — KI-Vorschlag für das Profil — nichts wird gespeichert. source=website liest die Website (websiteUrl oder die des Profils bzw. der Marke) über den gesicherten Ausgang und schlägt Beschreibung, Tonfall, Zielgruppe, Themen, Tabus, Beispiele, Bildsprache und Konkurrenten (competitors: Name, Website, Notiz) vor; source=feedback arbeitet eine Rückmeldung im Klartext (feedback, z. B. „weniger förmlich“) ein und nennt nur die geänderten Felder. Antwort in suggestion; ohne aktive KI bzw. ohne lesbare Seite aiUsed=false und eine Auskunft in notice (aiInactive, invalidUrl, blocked, unreachable, notHtml, empty, noAnswer) — kein Fehler; bewirkt eine Rückmeldung nichts, steht unchanged in notice.content.profile.manageulid, + Rumpf
GET/api/v1/content/channelsListe der ContentChannelcontent.item.viewpage, brandId
POST/api/v1/content/channelsEine ContentChannel anlegencontent.channel.manage+ Rumpf
DELETE/api/v1/content/channels/{ulid}Eine ContentChannel löschencontent.channel.manageulid
GET/api/v1/content/channels/{ulid}Eine ContentChannel lesencontent.item.view · Objektregel content.viewulid
PATCH/api/v1/content/channels/{ulid}Eine ContentChannel änderncontent.channel.manageulid, + Rumpf
GET/api/v1/content/ideasIdeen — Die Ideen im Redaktionskalender (Zustand idea), nach Termin. Mit plan die eines Wochenplans, mit from/to (Datum) ein Zeitfenster, mit brandId die einer Marke (markenlose eingeschlossen).content.item.viewplan, brandId, from, to
GET/api/v1/content/ideas/{ulid}Idee lesen — Eine Idee mit Thema, Aufhänger, Format, Termin und Kanal — Grundlage des Erstellen-Studios (?idee=<ulid>). Ist aus der Idee schon ein Beitrag geworden, ist sie archiviert (status), ihr Termin steht noch in plannedPublishAt, und postUlid nennt den Beitrag.Objektregel content.viewulid
PATCH/api/v1/content/ideas/{ulid}Idee bearbeiten — Thema (topic), Aufhänger (note) und Termin (plannedPublishAt) ändern — Umplanen ist ein neuer Termin. Nur solange es eine Idee ist (sonst 422 errors.content.ideaNotAnIdea).content.item.manageulid, + Rumpf
POST/api/v1/content/ideas/{ulid}/discardIdee verwerfen — Archiviert die Idee; sie verschwindet aus dem Kalender (ihr Termin bleibt an der Herkunft lesbar). Der Wochenplan füllt die Woche beim nächsten „Ideen erzeugen“ wieder auf.content.item.manageulid, + Rumpf
POST/api/v1/content/ideas/{ulid}/postBeitrag erstellen — Macht aus der Idee den fertigen Beitrag — über das Erstellen-Studio, derselbe Weg wie dessen Einstieg ?idee= und der Autopilot: ein neuer Beitrag mit den Feldern des Inhaltstyps nach Thema und Aufhänger, je Kanal Text in Länge und Ton des Netzwerks als Ziel-Fassung, Format und Termin der Idee, im Ton des Markenprofils, „Zur Freigabe“ (review, postUlid); die Idee wird archiviert und verschwindet aus dem Kalender. Ohne aktive KI bzw. ohne brauchbare Antwort bleibt es eine Idee: aiUsed=false, Auskunft in notice (aiInactive, noAnswer) — kein Fehler. Kosten auf das KI-Budget der Marke.content.item.manageulid, + Rumpf
POST/api/v1/content/ideas/{ulid}/regenerateIdee neu erzeugen — Die KI schlägt für denselben Platz (Format, Termin, Kanal) ein neues Thema mit Aufhänger vor und speichert es — unter Nutzung des Markenprofils, ohne Wiederholung der Themen des Plans. Ohne aktive KI bzw. ohne Antwort aiUsed=false und eine Auskunft in notice (aiInactive, noAnswer) — kein Fehler; die Idee bleibt dann, wie sie war.content.item.manageulid, + Rumpf
POST/api/v1/content/ideas/{ulid}/restoreVerworfene Idee zurückholen — Nimmt „Idee verwerfen“ zurück (Rückgängig): die Idee steht wieder mit ihrem Termin im Kalender. Nur für eine verworfene Idee, aus der kein Beitrag entstanden ist.content.item.manageulid, + Rumpf
GET/api/v1/content/item-statusesZustände der Beiträge — Alle Zustände eines Beitrags in ihrer Reihenfolge — idea (Idee des Wochenplans, geht nie hinaus), draft, review, scheduled, publishing, published, archived — mit Beschriftung, Farbe und Kategorie. Nur lesend: Zustände wechselt man über die benannten Wege des Beitrags.content.item.view—
GET/api/v1/content/item-statuses/{key}Zustand eines Beitrags — Ein Zustand mit Beschriftung, Farbe und Kategorie.content.item.viewkey
GET/api/v1/content/itemsListe der ContentItemcontent.item.viewpage, type, status, locale, category, q, publicationState, brandId, order[plannedPublishAt], order[publishedAt], order[createdAt]
POST/api/v1/content/itemsEine ContentItem anlegencontent.item.manage+ Rumpf
POST/api/v1/content/items/bulkSerie anlegen — Legt mehrere Beiträge desselben Typs in einem Zug an — ganz oder gar nicht. Bricht ein Eintrag, ist keiner angelegt.content.item.manage+ Rumpf
DELETE/api/v1/content/items/{ulid}Eine ContentItem löschencontent.item.manageulid
GET/api/v1/content/items/{ulid}Eine ContentItem lesencontent.item.view · Objektregel content.viewulid
PATCH/api/v1/content/items/{ulid}Eine ContentItem änderncontent.item.manageulid, + Rumpf
POST/api/v1/content/items/{ulid}/archiveArchivieren — Nimmt den Beitrag aus dem Arbeitsvorrat, ohne ihn zu löschen.content.item.manageulid, + Rumpf
POST/api/v1/content/items/{ulid}/publishSofort veröffentlichen — Veröffentlicht den Beitrag jetzt und spielt ihn an alle passenden Ziele aus. Ein Ziel, das ausfällt, hält die anderen nicht auf — der Beitrag ist danach veröffentlicht, das betroffene Ziel trägt seinen Fehler selbst. Der Aufruf RESERVIERT den Beitrag per bedingtem UPDATE: von zwei gleichzeitigen Aufrufen spielt genau einer aus, der zweite antwortet 409 errors.content.publishInProgress — sonst stünde derselbe Beitrag zweimal beim Netzwerk, der zweite ohne Spur im System.content.item.publishulid, + Rumpf
GET/api/v1/content/items/{ulid}/relatedVerwandte Beiträge — Veröffentlichte Beiträge desselben Inhaltstyps mit gemeinsamen Schlagwörtern (zählen doppelt) oder Kategorien, nächste zuerst: score, sharedTags, sharedCategories. Ohne Gemeinsamkeit kein Treffer.content.item.view · content.item.manageulid, limit
POST/api/v1/content/items/{ulid}/returnMit Hinweis zurückgeben — Gibt einen Beitrag aus der Freigabe zurück (review → draft) — mit Hinweis an den Verfasser (note, Pflicht, höchstens 1000 Zeichen). Der Hinweis steht danach am Beitrag (reviewFeedback), bis er erneut eingereicht oder geplant wird; der Verfasser bekommt eine Benachrichtigung. Verlangt das Freigabe-Recht content.item.publish in der Marke des Beitrags; aus einem anderen Zustand als review 422 errors.content.returnOnlyFromReview (06:ENT-OWNER-RUNDE-1019-24.freigabeliste).content.item.publishulid, + Rumpf
POST/api/v1/content/items/{ulid}/scheduleTerminieren — Setzt den Beitrag auf scheduled. Verlangt einen geplanten Zeitpunkt — ohne ihn greift der Zeitplan den Beitrag nie auf.content.item.publishulid, + Rumpf
POST/api/v1/content/items/{ulid}/submitZur Prüfung geben — Setzt den Beitrag auf review. Er bleibt änderbar; die Prüfung ist ein Zustand, kein Schloss.content.item.manageulid, + Rumpf
POST/api/v1/content/items/{ulid}/unpublishZurückziehen — Nimmt den Beitrag an allen Zielen zurück und setzt ihn auf draft. Der Veröffentlichungs-Zeitpunkt bleibt stehen — er sagt, wann der Beitrag erstmals draußen war. Je Ziel läuft die Rücknahme genau einmal (bedingtes UPDATE auf die Publikations-Zeile): ein zweiter gleichzeitiger Aufruf startet beim Fremdsystem keinen zweiten Vorgang.content.item.publishulid, + Rumpf
GET/api/v1/content/items/{ulid}/versionsFassungen eines Beitrags — Alle gespeicherten Fassungen eines Beitrags, neueste zuerst — ohne Feldwerte. Eine Fassung entsteht bei jeder Veröffentlichung und vor jeder Wiederherstellung.content.item.viewulid
GET/api/v1/content/overviewÜbersicht „Inhalte" — Funktionsstand (Ziele, KI, Inhaltstypen) und die Zahlen, die eine Handlung auslösen — inklusive fehlgeschlagener Veröffentlichungen mit Fehlertext.content.item.viewbrandId
POST/api/v1/content/publications/reportVeröffentlichung melden — Schreibt die Kennung zurück, die ein Zielsystem für einen Beitrag vergeben hat. Ohne sie legt der nächste Zug dort einen zweiten Beitrag an.content.item.publish+ Rumpf
POST/api/v1/content/studioBeitrag im Studio erstellen — Macht aus einer Quelle einen fertigen ENTWURF — source = idea (ein Satz in idea), link (Seite unter url wird über den gesicherten Ausgang gelesen), product (Artikel productUlid: Name, Beschreibung, Preis, Bilder) oder media (eigene Bilder/Videos der Ablage in fileUlids); idea gilt bei jeder Quelle als Zusatz. typeKey ist das Format (Inhaltstyp); die Kanäle kommen aus „Veröffentlicht auf" des Typs, je Marke deren verbundenes Ziel, oder aus channelUlids. Je Kanal entsteht Text in Länge und Ton des Netzwerks samt Hashtags als Ziel-Fassung des Beitrags; dazu ein Bild-Auftrag (imagePrompt) und ein vorgeschlagener Zeitpunkt (plannedPublishAt, ohne Angabe das nächste freie Zeitfenster). Die Motive entstehen ohne Einzelklick im Automatik-Medienbudget der Marke (mediaGeneration): je Format der Kanäle drei Bildvarianten zur Wahl (die erste fertige hängt sofort), ein Karussell mit allen Folien, Video nur bei Video-Formaten, das Produktfoto als Vorlage; reicht das Budget nicht, bleibt der Bild-Auftrag mit Hinweis (mediaNotice). Eigene Medien hängt /media. Das Markenprofil der Marke geht in den Auftrag. Ohne aktive KI entsteht der Entwurf aus der Quelle ohne Kanal-Fassungen (aiUsed=false, notice=aiInactive). Verlangt content.item.manage in brandId (403); Drossel wie /v1/content/ai (429).content.item.manage+ Rumpf
GET/api/v1/content/studio/{ulid}Beitrag im Studio ansehen — Je Kanal: Text (eigene Fassung oder allgemeine), Medien, Format, Seitenverhältnis (aspect: 1:1 · 4:5 · 9:16 · 16:9), Zeichen-Grenze (limit), Ablehnungsgrund und Zustand des Ziels; dazu fehlende Ziele mit „Verbinden", vorgeschlagener Zeitpunkt, Rückmeldung der Freigabe und die Rechte des Lesers (canManage, canPublish).content.item.view · Objektregel content.viewulid
POST/api/v1/content/studio/{ulid}/imagesBild-Auftrag ändern und neue Motive erzeugen — Setzt den Bild-Auftrag (imagePrompt, ohne Angabe bleibt der bisherige) und erzeugt je Format der Kanäle neue Bildvarianten ohne Einzelklick im Automatik-Medienbudget; die erste fertige hängt am Beitrag, gewählte bleiben wählbar. Wählen einer Variante: /media mit ihrer Datei und ihrem Format. Reicht das Budget nicht: Hinweis in mediaNotice, kein Fehler. Verlangt content.item.manage in der Marke; Drossel wie /v1/content/ai.content.item.manageulid, + Rumpf
POST/api/v1/content/studio/{ulid}/mediaMedien an Kanäle hängen — Dateien der Ablage (fileUlids, Bild oder Video, mit Leserecht) an die genannten Kanäle (channelUlids), an alle Kanäle eines Seitenverhältnisses (aspect) oder — ohne beides — an die allgemeine Fassung. Teilen alle Kanäle das Seitenverhältnis, wird es die allgemeine Fassung. append=true hängt an, sonst wird ersetzt.content.item.manageulid, + Rumpf
POST/api/v1/content/studio/{ulid}/textText eines Kanals ändern oder neu erzeugen — channelUlid = Kanal (ohne = allgemeine Fassung). Mit text wird gesetzt (leer = die allgemeine gilt wieder); mit regenerate=true erzeugt die KI den Text des Kanals neu (ohne channelUlid: aller Kanäle), optional nach instruction („kürzer", „mit Frage am Ende"). Geprüft wie jede Fassung; ohne aktive KI bleibt der Text (aiUsed=false).content.item.manageulid, + Rumpf
GET/api/v1/content/target-presetsVorbelegte Ziele eines Inhaltstyps — „Veröffentlicht auf" des Inhaltstyps für eine Marke aufgelöst: je Eintrag das aktive Ziel der Marke (sonst das markenlose) mit Angaben, oder — fehlt es — der Einstieg zum Verbinden. Genau diese Ziele trägt ein neuer Beitrag ohne eigene Ziel-Wahl.content.item.managetype, brandId
GET/api/v1/content/typesListe der ContentTypecontent.item.viewpage
POST/api/v1/content/typesEine ContentType anlegencontent.type.manage+ Rumpf
DELETE/api/v1/content/types/{ulid}Eine ContentType löschencontent.type.manageulid
GET/api/v1/content/types/{ulid}Eine ContentType lesencontent.item.viewulid
PATCH/api/v1/content/types/{ulid}Eine ContentType änderncontent.type.manageulid, + Rumpf
GET/api/v1/content/versions/{ulid}Eine Fassung lesen — Eine Fassung mit ihren Feldwerten (fields) — Grundlage für den Vergleich mit dem aktuellen Stand.content.item.view · Objektregel content.viewulid
POST/api/v1/content/versions/{ulid}/restoreFassung wiederherstellen — Übernimmt die Feldwerte der Fassung in den Beitrag und setzt ihn auf draft. Die Adresse bleibt. Der bisherige Stand wird vorher als eigene Fassung gesichert. Ein veröffentlichter Beitrag muss erst zurückgezogen werden (422 errors.content.versionRestorePublished) — veröffentlicht wird nur über die normale Freigabe.content.item.manageulid, + Rumpf
GET/api/v1/content/weekly-plan-channelsKanäle für den Wochenplan — Die Kanäle, für die sich ein Wochenplan einrichten lässt: Name, Netzwerk, Verbindung, verfügbare Formate und — falls vorhanden — der Plan (planUlid). Ideen gibt es auch für Kanäle, die noch nicht verbunden sind; automatisch freigeben nur für verbundene.content.item.viewbrandId
GET/api/v1/content/weekly-plansWochenpläne — Die Wochenpläne der Kanäle, in deren Marke Sie Inhalte sehen dürfen — je Kanal höchstens einer. Mit brandId die der Marke (markenlose Kanäle eingeschlossen), mit channel der Plan eines Kanals.content.item.viewbrandId, channel
POST/api/v1/content/weekly-plansWochenplan anlegen — Legt den Plan eines Kanals an (channelUlid Pflicht, Recht content.item.manage in der Marke des Kanals). Ohne formats gelten alle Formate des Kanals, ohne weekdays/times werktags 09:00, 12:30 und 17:30; Uhrzeiten liegen mindestens zwei Stunden auseinander, postsPerWeek höchstens Wochentage × Uhrzeiten (sonst 422). Je Kanal ein Plan (409 errors.content.weeklyPlanExists). Die Stufen setzen einander voraus: postsEnabled braucht ideasEnabled, autoApprove braucht postsEnabled, einen verbundenen Kanal und content.item.publish in der Marke.content.item.manage+ Rumpf
GET/api/v1/content/weekly-plans/{ulid}Wochenplan lesen — Ein Wochenplan mit Kanal, Verbindung, verfügbaren Formaten, Autopilot-Stufen und Stand des letzten Laufs.Objektregel content.viewulid
PATCH/api/v1/content/weekly-plans/{ulid}Wochenplan ändern — Ändert die genannten Angaben; der Kanal wechselt nie. Änderungen an Anzahl und Formaten gelten für künftige Ideen — vorhandene bleiben. ideasEnabled: false schaltet die Stufen darüber mit ab; vorhandene Ideen und Termine bleiben. autoApprove: true hält fest, wer eingeschaltet hat — in dessen Namen gibt der Autopilot frei.content.item.manageulid, + Rumpf
POST/api/v1/content/weekly-plans/{ulid}/ideasIdeen erzeugen — Die KI legt Ideen für eine Woche in den Redaktionskalender (Vorgabe: die nächste Woche; weekStart = ein Tag der gewünschten Woche, laufende bis acht Wochen voraus): je freiem Termin aus den Veröffentlichungszeiten des Plans — mit mindestens zwei Stunden Abstand zu jedem Termin der Marke — eine Idee mit Thema, Aufhänger, Format und Kanal, unter Nutzung des Markenprofils. Die Woche wird aufgefüllt — vorhandene Ideen und Beiträge des Plans zählen mit, vergangene Termine fallen weg. Antwort in generation; ohne aktive KI bzw. ohne Antwort aiUsed=false und eine Auskunft in notice (aiInactive, noAnswer, weekFull, noFormats) — kein Fehler. Kosten auf das KI-Budget der Marke.content.item.manageulid, + Rumpf

Zweckangaben, die nicht dem Standardmuster folgen, stammen unverändert aus der Schnittstellen-Beschreibung im Code.

referenz.api-content · Gilt ab Version 0.5.4