Marketing & Outreach — API and MCP
Overview
This area exposes 176 operations. Each of them is at the same time an MCP tool.
This area is behind the module switch module.marketing. With the module off, these operations answer 404.
Operations
| Method | Path | Purpose | Permission | Parameters | ||
|---|---|---|---|---|---|---|
GET | /api/v1/marketing/ad-campaigns | Collection of MarketingAdCampaign | marketing.ads.view | page, status, platform, campaignId, q, order[name], order[status], order[startsAt], order[createdAt] | ||
POST | /api/v1/marketing/ad-campaigns | Werbekampagne als Entwurf anlegen — Legt eine Werbekampagne an. Sie entsteht IMMER als Entwurf und gibt kein Geld aus, bis sie über /activate scharf geschaltet wird. budgetCapCent ist Pflicht — der Deckel ist die einzige Stelle, an der das System Ausgaben begrenzt. | marketing.ads.manage | + body | ||
DELETE | /api/v1/marketing/ad-campaigns/{ulid} | Delete a MarketingAdCampaign | marketing.ads.manage | ulid | ||
GET | /api/v1/marketing/ad-campaigns/{ulid} | Read one MarketingAdCampaign | marketing.ads.view · object rule mkt.view | ulid | ||
PATCH | /api/v1/marketing/ad-campaigns/{ulid} | Update a MarketingAdCampaign | marketing.ads.manage | ulid, + body | ||
POST | /api/v1/marketing/ad-campaigns/{ulid}/activate | Werbekampagne scharf schalten — Legt die Kampagne beim Netzwerk an (falls noch nicht geschehen) und startet die Auslieferung. Ab hier kostet sie Geld. Verlangt das Freigabe-Recht marketing.ads.publish IN DER MARKE der Kampagne — nicht dasselbe wie Bearbeiten, und nicht dasselbe wie dieses Recht irgendwo zu halten. | marketing.ads.publish | ulid, + body | ||
POST | /api/v1/marketing/ad-campaigns/{ulid}/budget | Budget ändern — Setzt Tages- oder Laufzeitbudget. Verlangt marketing.ads.manage IN DER MARKE der Kampagne. Über dem Deckel wird abgelehnt; der Deckel selbst lässt sich nur mit dem Freigabe-Recht marketing.ads.publish in derselben Marke heben. | marketing.ads.manage | ulid, + body | ||
GET | /api/v1/marketing/ad-campaigns/{ulid}/handover | Übergabe-Paket einer Werbekampagne — Anzeigen (Überschrift, Text, Ziel-Adresse mit utm-Merkmalen) je Anzeigengruppe, Budget, Deckel und Laufzeit — als Liste und als CSV (csv) zum Übertragen in den Ads Manager des Netzes. managedIn sagt, ob die Kampagne über die Schnittstelle läuft (api) oder von Hand im Ads Manager (ads_manager); steps ist die Anleitung in der Sprache des Nutzers. | marketing.ads.view | ulid | ||
POST | /api/v1/marketing/ad-campaigns/{ulid}/pause | Werbekampagne anhalten — Stoppt die Auslieferung sofort. Anhalten darf, wer die Kampagne IN IHRER MARKE bearbeiten darf — Geld sparen ist nie der gefährlichere Weg. | marketing.ads.manage | ulid, + body | ||
GET | /api/v1/marketing/ad-connections | Verbindungs-Stand der Werbenetze Google, Microsoft und ChatGPT — Je Netz (google_ads, microsoft_ads, openai_ads): App-Zugangsdaten hinterlegt (appReady), Entwickler-Schlüssel da (developerTokenReady), verbunden (connected), angebotene Werbekonten (accounts) und das gewählte (accountId). ChatGPT verbindet mit einem Advertiser-API-Schlüssel — ein Schlüssel ist genau ein Werbekonto, es gibt keine Wahl. | marketing.ads.view | brandId | ||
POST | /api/v1/marketing/ad-connections/disconnect | Werbenetz trennen — Entfernt Zeichen bzw. Schlüssel und die Werbe-Angaben (provider, brandId). Die App-Zugangsdaten bleiben — sie gehören der Installation. Laufende Kampagnen laufen beim Netz weiter; vorher anhalten. | marketing.ads.connect | + body | ||
POST | /api/v1/marketing/ad-connections/select-account | Werbekonto eines Netzes wählen — Legt fest, welches der ANGEBOTENEN Werbekonten Geld ausgibt (provider google_ads\ | microsoft_ads, accountId, brandId). Eine frei getippte Kennung wird abgewiesen — sonst ließe sich fremdes Geld ausgeben. Verlangt marketing.ads.connect in der Marke. | marketing.ads.connect | + body | |
GET | /api/v1/marketing/ad-conversion-setups | Verkaufsmeldungen je Werbenetz: Einrichtung und Stand — Listet je Werbenetz die Einrichtung der Verkaufsmeldungen (Conversions API): eingeschaltet, gemeldete Arten (lead, deal_won, purchase), Kennungen wie Pixel/Datensatz oder Conversion-Regel, Pflichtfelder (fields), Stand (off/incomplete/ready, Lücke in gap) und die Zahlen der letzten 30 Tage. Ohne brandId die markenlose Einrichtung. | marketing.ads.view | brandId | ||
POST | /api/v1/marketing/ad-conversion-setups | Verkaufsmeldungen eines Werbenetzes einrichten — Legt die Einrichtung für network und brandId an oder ändert sie: enabled, events, settings (nur die Felder des Netzwerks, geprüft gegen ihr Muster) und optional einen eigenen Zugangsschlüssel accessToken (leer = entfernen, fehlt = unverändert). Verlangt marketing.ads.connect in der Marke. | marketing.ads.connect | + body | ||
GET | /api/v1/marketing/ad-conversions | Protokoll der Verkaufsmeldungen — Listet die Meldungen von Anfragen, gewonnenen Deals und Käufen an die Werbenetze, neueste zuerst — mit Zustand (pending, sent, failed, skipped), Grund im Klartext, Versuchen und den Abgleichsmerkmalen (nur Schlüssel wie em, fbclid). Filter nach Netzwerk, Zustand und Art. | marketing.ads.view | page, network, status, art, order[createdAt] | ||
GET | /api/v1/marketing/ad-conversions/{ulid} | Eine Verkaufsmeldung — Zustand, Grund, Versuche, Wert und Abgleichsmerkmale einer Meldung an ein Werbenetz — ohne Personendaten. | marketing.ads.view | ulid | ||
POST | /api/v1/marketing/ad-conversions/{ulid}/retry | Verkaufsmeldung erneut senden — Reiht eine fehlgeschlagene Meldung erneut ein (z. B. nachdem die Einrichtung ergänzt wurde). Andere Zustände antworten 409. | marketing.ads.connect | ulid, + body | ||
GET | /api/v1/marketing/ad-library | Konkurrenz-Anzeigen suchen — Sucht in der öffentlichen Werbebibliothek platform (meta · tiktok) nach Stichwort q oder Seiten- bzw. Werbetreibenden-Kennungen pageId (kommagetrennt) in einem EU-Land country (Vorgabe DE). Treffer: Seite, Texte, Bibliotheks-Adresse, Laufzeit, Platzierungen — als Vorlage für das Konzept (POST /v1/marketing/ad-studio/drafts mit source=competitor). Ohne eingerichteten Zugang 422 mit Hinweis (GET /v1/marketing/ad-library/access). Verlangt marketing.ads.manage. | marketing.ads.manage | platform, q, pageId, country, brandId | ||
GET | /api/v1/marketing/ad-library/access | Zugang zu den Werbebibliotheken — Je Bibliothek (meta · tiktok): eingerichtet (ready) und die Schritte, die der Betreiber dafür erledigt (steps, übersetzt). Verlangt marketing.ads.view. | marketing.ads.view | brandId | ||
GET | /api/v1/marketing/ad-platforms | Werbe-Netzwerke und Zugangsstand — Listet Meta, LinkedIn, TikTok, Google, Microsoft, Pinterest und ChatGPT mit Schalter (enabled, alle außer Meta ab Werk aus — Einstellung settingKey), Zugangsstand in der Marke (connected), einem Hinweis im Klartext (hint, z. B. „Zugang fehlt“), dem Verbindungsweg (connectVia: social\ | oauth\ | apikey), den wählbaren Kampagnen- bzw. Anzeigentypen (campaignTypes, erster = Vorgabe, Erklärung je Typ in campaignTypeHints, Regeln je Typ in formats) und Hinweisen im Klartext (notes, z. B. Budget im Ads Manager von OpenAI, Verfügbarkeit nach Land). Ohne brandId gilt die markenlose Verbindung. | marketing.ads.view | brandId |
GET | /api/v1/marketing/ad-product-feed | Produkt-Feed für Shopping-Werbung — Anzahl der Artikel im Feed (itemCount), was fehlt (skipped: noPrice, noLink, noImage), die Produkt-Adress-Vorlage (linkTemplate, Einstellung marketing.ads.feedLinkTemplate) und die Feed-Adressen: googleUrl (RSS mit g:-Feldern für Google Merchant Center, Microsoft Merchant Center und den Pinterest-Katalog) und openaiUrl (CSV nach dem Produkt-Schema von OpenAI für ChatGPT-Anzeigen); targets nennt je Netz Titel, Anleitung und Adresse. | marketing.ads.connect | brandId | ||
GET | /api/v1/marketing/ad-studio/drafts | Entwürfe und Ideen des Anzeigen-Studios — Neueste zuerst. status=idea die Ideen aus Strategie und Markenprofil, draft die Entwürfe in Arbeit, launched die gestarteten (mit campaigns). Markenscharf am Recht marketing.ads.view. | marketing.ads.view | page, status, brandId, origin | ||
POST | /api/v1/marketing/ad-studio/drafts | Schritt 1 — Entwurf aus einer Quelle — source: idea (Anzeigen-Idee ideaUlid oder Aufgabe aus „Ziel & Strategie" taskUlid) · text (Satz brief) · url (Produktseite url — „URL zu Anzeige", gelesen über den gesicherten Ausgang) · product (Artikel productUlid) · media (eigene Dateien fileUlids) · competitor (Konzept einer Konkurrenz-Anzeige competitor aus GET /v1/marketing/ad-library — übernommen wird das Konzept, nie Texte oder Medien). Verlangt marketing.ads.manage in der Marke. | marketing.ads.manage | + body | ||
DELETE | /api/v1/marketing/ad-studio/drafts/{ulid} | Entwurf oder Idee verwerfen — Löscht den Entwurf. Gestartete Kampagnen bleiben unberührt. Verlangt marketing.ads.manage in der Marke. | marketing.ads.manage | ulid | ||
GET | /api/v1/marketing/ad-studio/drafts/{ulid} | Entwurf des Anzeigen-Studios — Quelle, Ziele, Ergebnis je Netz und Platzierung (slots) samt Vorprüfung (issues je Platz — dieselben Ablehnungsgründe wie vor dem Zug zum Netz) und canLaunch. | marketing.ads.view · object rule mkt.view | ulid | ||
PATCH | /api/v1/marketing/ad-studio/drafts/{ulid} | Schritt 2 und Feinarbeit — targets = [{platform, type, placements}] (Typen und Platzierungen aus GET /v1/marketing/ad-platforms → formats), settings (landingUrl, countries, objective, leadFormUlid, privacyUrl, networkFormId, sparkPostId, sparkAuthCode, buttons), slots (je key: variants, media [{file, aspect}], cards, mediaPrompt). Texte werden auf die Grenzen gekürzt. Verlangt marketing.ads.manage in der Marke; nach dem Start nicht mehr änderbar. | marketing.ads.manage | ulid, + body | ||
POST | /api/v1/marketing/ad-studio/drafts/{ulid}/generate | Schritt 3 — Anzeigen je Netz und Platzierung erzeugen — Schreibt je Netz und Platzierung Text-Fassungen (variants 1–5) in den Grenzen des Netzes samt Handlungsaufforderung, Bild-Auftrag (mediaPrompt im Seitenverhältnis der Platzierung), Karussell-Karten und Antwort-Knöpfe — aus Quelle, Markenprofil, Strategie und Erkenntnissen. Eigene Medien werden passend zugeordnet; Medien erzeugt POST /v1/ai/media-generations (Kosten vorab). Ohne KI ein Gerüst (aiUsed=false, notice=aiInactive). Drossel 20/min. | marketing.ads.manage | ulid, + body | ||
POST | /api/v1/marketing/ad-studio/drafts/{ulid}/launch | Kampagne starten — pausiert beim Netz — Prüft alle Plätze (Mängel ⇒ 422 mit Gründen, es entsteht nichts), legt je Netz eine Werbekampagne an (Gruppe je Platzierung, Anzeige je Fassung — bzw. je BEHALTENER Variante mit deren Texten und Motiv —, Varianten-Test ab zwei Anzeigen) und schiebt sie PAUSIERT zum Netz. Budget je Netz budgets[<netz>] = {dailyBudgetCent, budgetCapCent} oder gemeinsam dailyBudgetCent/budgetCapCent; der Deckel ist Pflicht. Ohne Werbekonto bleibt die Kampagne Entwurf (result=notConnected). Scharf schaltet POST /v1/marketing/ad-campaigns/{ulid}/activate mit marketing.ads.publish. Die Aufgabe aus „Ziel & Strategie" gilt danach als erledigt. | marketing.ads.manage | ulid, + body | ||
POST | /api/v1/marketing/ad-studio/drafts/{ulid}/media-prompts | Bildaufträge vorschlagen — Schlägt mehrere Bildaufträge für die Motive der Anzeige vor (wie „Get prompts“) — aus Quelle, Markenprofil, Bildsprache und Produktfoto; optional mit Wunsch instruction. Erneut aufgerufen kommen andere Vorschläge. Abgelegt in variantSetup.suggestions; gewählt wird beim Erzeugen der Varianten (mediaPrompt). Ohne KI notice=aiInactive. Verlangt marketing.ads.manage in der Marke; Drossel 20/min. | marketing.ads.manage | ulid, + body | ||
POST | /api/v1/marketing/ad-studio/drafts/{ulid}/regenerate | Einen Platz neu schreiben — Neue Fassungen für den Platz slotKey (<netz>:<typ>:<platzierung>), optional mit Wunsch instruction („kürzer", „mit einer Frage beginnen"). Medien bleiben. Drossel 20/min. | marketing.ads.manage | ulid, + body | ||
POST | /api/v1/marketing/ad-studio/drafts/{ulid}/variants | Echte Varianten erzeugen — Erzeugt variantCount (2–8, ab Werk 4) echte Varianten: je Variante eigener Ansatz (Problem und Lösung, Kundenstimme, Angebot, Lebensgefühl …), eigene Texte je Platz in den Grenzen des Netzes und eigenes Motiv je Seitenverhältnis der Platzierungen — Bildrichtung mediaPrompt (gewählter oder eigener Bildauftrag), Produktfoto als Vorlage, Markenfarben und Logo-Freiraum im Auftrag. Video nur mit mediaKind=video bzw. wenn der Vorschlag Video vorsieht. Motive entstehen ohne Einzelklick im Automatik-Medienbudget der Marke; reicht es nicht, bleibt der Bildauftrag mit Hinweis (mediaNotice). Noch nicht geprüfte Varianten werden ersetzt, behaltene bleiben. Verlangt marketing.ads.manage in der Marke; Drossel 20/min. | marketing.ads.manage | ulid, + body | ||
POST | /api/v1/marketing/ad-studio/ideas | Anzeigen-Ideen erzeugen — Erzeugt count (1–12) Anzeigen-Ideen für die Marke brandId, optional mit Schwerpunkt focus — aus Ziel, Strategie und offenen Werbe-Aufgaben, Markenprofil, Produkten und Erkenntnissen. Je Idee: title (Blickwinkel), brief (Beschreibung), suggestedFormat (image · video · carousel), suggestedPlatform. Ohne KI keine Ideen (notice=aiInactive). Verlangt marketing.ads.manage in der Marke (403); Drossel 20/min (429). | marketing.ads.manage | + body | ||
GET | /api/v1/marketing/ad-studio/variants/{ulid} | Variante des Anzeigen-Studios — Ansatz, Aufhänger, Prüf-Zustand, Texte je Platz, Bildauftrag und Motive je Seitenverhältnis samt Zustand der Erzeugung. | marketing.ads.view · object rule mkt.view | ulid | ||
PATCH | /api/v1/marketing/ad-studio/variants/{ulid} | Variante prüfen oder ändern — status: kept (behalten — sie wird beim Start eine Anzeige im Varianten-Test) · discarded (verwerfen — Signal für die Erkenntnisse) · review (zurück). Dazu title, texts {slotKey: {headline, primaryText, description, callToAction}} (gekürzt auf die Grenzen des Netzes), cards {slotKey: [{headline, description}]} (Karussell-Karten der Variante), mediaPrompt, media {aspect: {file} \ | null} (eigenes Bild bzw. Video der Marke). Verlangt marketing.ads.manage in der Marke; nach dem Start nicht mehr änderbar. | marketing.ads.manage | ulid, + body | |
POST | /api/v1/marketing/ad-studio/variants/{ulid}/media | Fehlende Motive nachholen — Startet die Motive, die übersprungen (Automatik-Budget) oder gescheitert sind, erneut ohne Einzelklick. Reicht das Budget weiter nicht, steht die Auskunft am Motiv. Verlangt marketing.ads.manage in der Marke. | marketing.ads.manage | ulid, + body | ||
POST | /api/v1/marketing/ad-studio/variants/{ulid}/retry | Nochmal anders — Schreibt die Variante neu — anderer Ansatz (bzw. der Wunsch instruction), neue Texte je Platz und ein neues Motiv im Automatik-Medienbudget. Die abgelöste Fassung geht als Signal in die Erkenntnisse. Verlangt marketing.ads.manage in der Marke; Drossel 20/min. | marketing.ads.manage | ulid, + body | ||
GET | /api/v1/marketing/ads/report | Werbe-Auswertung — Ausgaben, Klicks, Ergebnisse und die daraus gerechneten Kennzahlen (Klickrate, Kosten je Klick, Kosten je Ergebnis, Werbeausgabenrendite) für einen Zeitraum — je Kampagne und als Summe. Geld je Zeile in der Konto-Währung der Kampagne (currency, spendCent, revenueCent, cpcCent, cpaCent) UND in EUR (spendEurCent, revenueEurCent) über den beim Anlegen eingefrorenen Kurs eurRate (Fremdwährung je 1 EUR). Fremdwährungs-Zeilen ohne Kurs tragen unconverted: true und bleiben ganz aus der Summe (totals.unconvertedRows). Die Summe und ihre Kennzahlen stehen ausschließlich in EUR (totals.currency). | marketing.ads.view | from, to, campaignUlid, level | ||
POST | /api/v1/marketing/ai | Create a MarketingAi | marketing.campaign.manage | + body | ||
GET | /api/v1/marketing/audiences | Collection of MarketingAudience | marketing.campaign.manage | page, kind, id, q, order[name], order[createdAt] | ||
POST | /api/v1/marketing/audiences | Create a MarketingAudience | marketing.campaign.manage | + body | ||
POST | /api/v1/marketing/audiences/preview | Segmentgröße eines Entwurfs schätzen — Schätzt die Größe eines noch nicht gespeicherten Segments aus Art, Regel, Mitgliedern und Einwilligungs-Pflicht (estimatedSize); legt nichts an. Verlangt marketing.campaign.manage, eine Ziel-Marke brandId muss beschreibbar sein; ein unbekanntes Regel-Feld antwortet 422. | marketing.campaign.manage | + body | ||
DELETE | /api/v1/marketing/audiences/{ulid} | Delete a MarketingAudience | marketing.campaign.manage | ulid | ||
GET | /api/v1/marketing/audiences/{ulid} | Read one MarketingAudience | marketing.campaign.manage · object rule mkt.view | ulid | ||
PATCH | /api/v1/marketing/audiences/{ulid} | Update a MarketingAudience | marketing.campaign.manage | ulid, + body | ||
POST | /api/v1/marketing/audiences/{ulid}/preview | Segmentgröße live berechnen — Rechnet die Größe des Segments live aus und schreibt sie an der Zielgruppe fort (estimatedSize) — die Regel selbst bleibt unberührt. Verlangt marketing.campaign.manage IN DER MARKE der Zielgruppe. | marketing.campaign.manage | ulid, + body | ||
GET | /api/v1/marketing/autopilot | Marketing-Autopilot einer Marke — Stil, Kontakt-Obergrenze, Zeitpunkt und Kanal je Empfänger und je Kanal Stufe (suggest, approval, auto), Stil und Grenzen samt Einschaltendem; dazu offene Vorschläge und der letzte Lauf. Ohne brandId die einzige bzw. die Standard-Marke. | marketing.report.view | brandId | ||
POST | /api/v1/marketing/autopilot | Marketing-Autopilot einstellen — Speichert Stil (cautious, balanced, aggressive), Kontakt-Obergrenze (contactCapMax in contactCapDays Tagen, 0 = aus), bestTime, bestChannel und je Kanal level, style, maxIncreasePercent (0–100) und dailyCapCent. auto und höhere Grenzen verlangen marketing.ads.publish bzw. marketing.campaign.send in der Marke (403); der Einschaltende wird festgehalten. | marketing.autopilot.manage | + body | ||
GET | /api/v1/marketing/autopilot-actions | Freigabeliste und Protokoll des Autopiloten — Aktionen des Autopiloten einer Marke, jüngste zuerst: offen (status=open: Vorschläge und Freigaben), Protokoll (status=log) oder ein Zustand. Je Aktion Begründung, Vorher/Nachher, Akteur und ob sie sich zurücknehmen lässt. | marketing.report.view | page, brandId, status, channel, kind | ||
GET | /api/v1/marketing/autopilot-actions/{ulid} | Read one MarketingAutopilotAction | marketing.report.view · object rule mkt.view | ulid | ||
POST | /api/v1/marketing/autopilot-actions/{ulid}/approve | Vorschlag des Autopiloten freigeben — Führt die wartende Aktion mit einem Klick aus — über dieselben Wege und Sperren wie eine Regel (Budget-Deckel, Erhöhung höchstens um die Tagesgrenze, Wirkstellen der KI-Mitarbeiter). Verlangt marketing.autopilot.manage und das Recht der Wirkung (marketing.ads.publish für Erhöhen und Umschichten, marketing.ads.manage für Senken, Pausen und Tests, marketing.campaign.send für Nachrichten). | marketing.autopilot.manage | ulid, + body | ||
POST | /api/v1/marketing/autopilot-actions/{ulid}/reject | Vorschlag des Autopiloten ablehnen — Lehnt eine wartende Aktion bzw. einen Vorschlag ab; dieselbe Entscheidung entsteht nicht neu. | marketing.autopilot.manage | ulid, + body | ||
POST | /api/v1/marketing/autopilot-actions/{ulid}/revert | Aktion des Autopiloten zurücknehmen — Stellt Budget bzw. Zustand von vorher wieder her (Budget, Pause, angehaltene Anzeigen) bzw. schaltet Zeitpunkt und Kanal je Empfänger aus. Was wieder Geld ausgibt, verlangt marketing.ads.publish und läuft durch den Budget-Deckel. | marketing.autopilot.manage | ulid, + body | ||
POST | /api/v1/marketing/autopilot/run | Autopilot jetzt prüfen — Prüft die Marke sofort wie der stündliche Lauf: neue Vorschläge, bei auto sofort ausgeführt (im Namen des Einschaltenden), Rückfall bei fehlendem Recht. Antwort wie GET, lastRun mit den Zahlen dieses Laufs. | marketing.autopilot.manage | + body | ||
GET | /api/v1/marketing/campaign-blueprints | Fertige Abläufe — Willkommen, Reaktivierung, Launch, Geburtstag und Warenkorb-Erinnerung — je Ablauf Eintritt (entry: tag · audience · anniversary · event), Zahl der Schritte und Nachrichten, Kanäle mit Rückfall, Wartetage. available=false mit unavailableReason (Warenkorb: noCartEvent — keine Shop-Anbindung meldet einen verlassenen Warenkorb). | marketing.campaign.manage | — | ||
POST | /api/v1/marketing/campaign-blueprints/{key}/apply | Ablauf als Kampagne anlegen — Legt den Ablauf als INAKTIVE Kampagne mit fertigen Schritten an (Name name, Marke brandId). Eintritt: Willkommen über das Schlagwort entryTag (Vorgabe willkommen), Reaktivierung über audienceId oder die angelegte Zielgruppe „Seit 90 Tagen kein Kontakt", Launch über audienceId, Geburtstag am Jahrestag des Datumsfelds geburtstag am Kontakt (wird mit dem Recht platform.settings.manage angelegt). Je Kurznachricht WhatsApp → SMS → Mail, wenn whatsappTemplateUlid eine genehmigte Vorlage nennt, sonst SMS → Mail. Antwort trägt campaignUlid. Warenkorb-Erinnerung: 422. | marketing.campaign.manage | key, + body | ||
GET | /api/v1/marketing/campaigns | Collection of MarketingCampaign | marketing.campaign.manage | page, q, active, entryMode, ownerId, order[name], order[createdAt] | ||
POST | /api/v1/marketing/campaigns | Strecke anlegen — Legt die Huelle UND ihre Automation in einem Zug an (die Automation ist die Laufzeit; die Huelle traegt nur den Marketing-Bezug). Die Strecke startet INAKTIV. | marketing.campaign.manage | + body | ||
DELETE | /api/v1/marketing/campaigns/{ulid} | Delete a MarketingCampaign | marketing.campaign.manage | ulid | ||
GET | /api/v1/marketing/campaigns/{ulid} | Read one MarketingCampaign | marketing.campaign.manage | ulid | ||
PATCH | /api/v1/marketing/campaigns/{ulid} | Update a MarketingCampaign | marketing.campaign.manage | ulid, + body | ||
POST | /api/v1/marketing/campaigns/{ulid}/enroll | Empfänger in die Strecke aufnehmen — Löst das Aufnahme-Ereignis aus (derselbe Weg wie die automatische Aufnahme). Gesperrte Adressen und inaktive Strecken nehmen niemanden auf; ein bereits aufgenommener Empfänger erzeugt keinen zweiten Lauf. NUR für Strecken (entryMode=per_recipient): ein Einmal-Versand wird mit 422 abgewiesen — dort wartet kein Ereignis-Trigger auf die Aufnahme, sie liefe ins Leere. | marketing.campaign.manage | ulid, + body | ||
POST | /api/v1/marketing/campaigns/{ulid}/scan | Zielgruppe jetzt abklappern — Nimmt sofort alle Empfänger der hinterlegten Zielgruppe auf, statt auf den täglichen Lauf zu warten. Idempotent: wer schon in der Strecke ist, kommt nicht erneut hinein. Antwortet mit der Zahl der tatsächlich neu Aufgenommenen (enrolled). | marketing.campaign.manage | ulid, + body | ||
GET | /api/v1/marketing/campaigns/{ulid}/stats | Statistik je Strecken-Schritt — Zahlen je Schritt-Position (erreicht, versendet, geoeffnet, geklickt) plus die Lauf-Zustaende der Strecke. reached ist KUMULATIV (R43-10): ein Lauf zaehlt an jedem Schritt, den er ausgefuehrt hat oder vor dem er in Bedingungs-Wartung steht — nicht am Schritt, auf dem sein Cursor gerade steht. | marketing.campaign.manage | ulid | ||
POST | /api/v1/marketing/campaigns/{ulid}/test-message | Testmail EINER Nachricht der Strecke — Verschickt die Nachricht an der angegebenen Schritt-Position an eine Adresse — mit ihrem eigenen Betreff und ihren eigenen Inhalten, gerendert wie im Versand. Ohne Einwilligungs-Prüfung, ohne Drossel und OHNE Tracking-Zeile: eine Testmail ist eine Ansicht, kein Versand, und dürfte die Zustellquote der Nachricht nicht verschieben. Der Betreff trägt sichtbar [TEST]. | marketing.campaign.manage | ulid, + body | ||
GET | /api/v1/marketing/click-map | Klick-Heatmap einer Versand-Mail — Die Mail eines Versandlaufs, gerendert mit Beispielwerten, jeder verfolgte Verweis mit data-octi-link="<Position>" markiert; dazu je Position Klicks und verschiedene Empfänger. shared = dieselbe Adresse steht an mehreren Stellen (die Zahl gilt allen), unmatchedClicks = Klicks auf Adressen, die nicht in dieser Mail stehen. Bei einem Split-Test mit eigenem Inhalt je Variante wählt variant (A/B) die Mail und ihre Klicks. | marketing.report.view | dispatchUlid, variant | ||
GET | /api/v1/marketing/consent-topics | Collection of MarketingConsentTopic | marketing.consent.view | page, brandId, active, q | ||
POST | /api/v1/marketing/consent-topics | Create a MarketingConsentTopic | marketing.consent.manage | + body | ||
DELETE | /api/v1/marketing/consent-topics/{ulid} | Delete a MarketingConsentTopic | marketing.consent.manage | ulid | ||
GET | /api/v1/marketing/consent-topics/{ulid} | Read one MarketingConsentTopic | marketing.consent.view · object rule mkt.view | ulid | ||
PATCH | /api/v1/marketing/consent-topics/{ulid} | Update a MarketingConsentTopic | marketing.consent.manage | ulid, + body | ||
GET | /api/v1/marketing/consents | Collection of MarketingConsent | marketing.consent.view | page, status, channel, email, q, contactUlid, order[email], order[phone], order[channel], order[status], order[createdAt] | ||
POST | /api/v1/marketing/consents | Einwilligung von Hand erfassen — Erfasst eine Einwilligung GENAU EINES Kanals (channel): Mail mit email, SMS und WhatsApp mit phone (internationale Form, z. B. +49 170 …; unbrauchbare Nummer → 422). Nachweis: proofText (Wortlaut), Quelle manual, Zeitpunkt; alreadyConfirmed=true bestätigt sofort, sonst wartet sie auf die Bestätigung (Mail-DOI; bei SMS geht eine Bitte an die Nummer, bestätigt wird mit der Antwort „JA“, Frist wie beim Mail-DOI). Begründung overrideReason Pflicht. Verlangt marketing.consent.manage in brandId. | marketing.consent.manage | + body | ||
GET | /api/v1/marketing/consents/{ulid} | Read one MarketingConsent | marketing.consent.view | ulid | ||
POST | /api/v1/marketing/consents/{ulid}/resend-doi | Bestaetigungsmail erneut senden — Schickt die Double-Opt-in-Mail noch einmal an die Adresse der Einwilligung; bei SMS die Bitte um die Antwort „JA“ an die Nummer (neue Frist). Verlangt marketing.consent.manage IN DER MARKE der Einwilligung. | marketing.consent.manage | ulid, + body | ||
POST | /api/v1/marketing/consents/{ulid}/withdraw | Einwilligung widerrufen — Setzt die Einwilligung auf widerrufen — ab sofort geht an diese Adresse keine Werbung mehr. Verlangt marketing.consent.manage IN DER MARKE der Einwilligung und eine Begründung (overrideReason), die an der Einwilligung und im Änderungsprotokoll steht. | marketing.consent.manage | ulid, + body | ||
GET | /api/v1/marketing/dashboard | Collection of MarketingDashboard | marketing.report.view | — | ||
GET | /api/v1/marketing/dispatch-statuses | Collection of DispatchStatus | marketing.campaign.manage | page | ||
POST | /api/v1/marketing/dispatch-statuses | Create a DispatchStatus | marketing.config.manage | + body | ||
DELETE | /api/v1/marketing/dispatch-statuses/{key} | Delete a DispatchStatus | marketing.config.manage | key | ||
GET | /api/v1/marketing/dispatch-statuses/{key} | Read one DispatchStatus | marketing.campaign.manage | key | ||
PATCH | /api/v1/marketing/dispatch-statuses/{key} | Update a DispatchStatus | marketing.config.manage | key, + body | ||
GET | /api/v1/marketing/dispatches | Collection of MarketingDispatch | marketing.campaign.manage | page, campaignId, status, q, order[name], order[subject], order[status], order[scheduledAt], order[sentAt], order[createdAt] | ||
POST | /api/v1/marketing/dispatches | Geschlossen (410 Gone) — Geschlossen seit Befund R48-076: ein Versandlauf entsteht ausschließlich aus dem Nachrichten-Schritt seiner Kampagne. Antwortet 410 Gone. | marketing.campaign.manage | + body | ||
DELETE | /api/v1/marketing/dispatches/{ulid} | Delete a MarketingDispatch | marketing.campaign.manage | ulid | ||
GET | /api/v1/marketing/dispatches/{ulid} | Read one MarketingDispatch | marketing.campaign.manage · object rule mkt.view | ulid | ||
PATCH | /api/v1/marketing/dispatches/{ulid} | Geschlossen (410 Gone) — Geschlossen seit Befund R48-076: Inhalt und Zeitpunkt eines Versandlaufs kommen aus seiner Kampagne. Antwortet 410 Gone. | marketing.campaign.manage | ulid, + body | ||
POST | /api/v1/marketing/dispatches/{ulid}/schedule | Geschlossen (410 Gone) — Geschlossen seit Befund R48-076: geplant wird die Kampagne, nicht der einzelne Versandlauf. Antwortet 410 Gone. | marketing.campaign.send | ulid, + body | ||
POST | /api/v1/marketing/dispatches/{ulid}/send-now | Geschlossen (410 Gone) — Geschlossen seit Befund R48-076: ein Sofortversand ohne die Startregeln der Kampagne ging an jeder Prüfung vorbei. Antwortet 410 Gone. | marketing.campaign.send | ulid, + body | ||
POST | /api/v1/marketing/dispatches/{ulid}/test | Testmail der Kampagne verschicken — Verschickt eine Testmail der Kampagne an die angegebene Adresse, ohne die Zielgruppe anzufassen. | marketing.campaign.manage | ulid, + body | ||
GET | /api/v1/marketing/email-events | Collection of MarketingEmailEvent | marketing.campaign.manage | page, dispatchId | ||
GET | /api/v1/marketing/email-templates | Collection of MarketingEmailTemplate | marketing.campaign.manage | page, q, id, order[name], order[subject], order[createdAt] | ||
POST | /api/v1/marketing/email-templates | Create a MarketingEmailTemplate | marketing.campaign.manage | + body | ||
POST | /api/v1/marketing/email-templates/canvas | Kampagnen-Mail-Baum in den Editor-Canvas rendern — Rendert einen Mail-Baustein-Baum zu vollstaendigem Mail-HTML fuer den Editor-Canvas; der Abmelde-Block wird garantiert (angehaengt, wenn er im Baum fehlt). Persistiert nichts. | marketing.campaign.manage | + body | ||
POST | /api/v1/marketing/email-templates/preview | Create a MarketingEmailTemplate | marketing.campaign.manage | + body | ||
DELETE | /api/v1/marketing/email-templates/{ulid} | Delete a MarketingEmailTemplate | marketing.campaign.manage | ulid | ||
GET | /api/v1/marketing/email-templates/{ulid} | Read one MarketingEmailTemplate | marketing.campaign.manage | ulid | ||
PATCH | /api/v1/marketing/email-templates/{ulid} | Update a MarketingEmailTemplate | marketing.campaign.manage | ulid, + body | ||
POST | /api/v1/marketing/email-templates/{ulid}/preview | Vorlage zur Ansicht rendern — Rendert die Vorlage zur Ansicht — es wird weder versendet noch gespeichert. | marketing.campaign.manage | ulid, + body | ||
POST | /api/v1/marketing/email-templates/{ulid}/test-send | Vorlage als Testmail senden — Sendet die Vorlage mit Demo-Empfaengerdaten an EINE Adresse; Betreff mit [Test]-Vorsatz. Transportfehler werden als sent=false gemeldet, nicht als 500. | marketing.campaign.manage | ulid, + body | ||
GET | /api/v1/marketing/form-field-targets | Erlaubte Ziele der Feldzuordnung — Alle Ziele, die fields[].targetField eines Web-Formulars annehmen darf: Stammdaten-Ziele am Interessenten (lead.*) und die eigenen Felder des Interessenten (cf.<name>). | marketing.form.manage | — | ||
GET | /api/v1/marketing/form-submissions | Collection of MarketingFormSubmission | marketing.submission.view | page, status, webFormId, order[email], order[status], order[createdAt] | ||
GET | /api/v1/marketing/form-submissions/{ulid} | Read one MarketingFormSubmission | marketing.submission.view | ulid | ||
POST | /api/v1/marketing/form-submissions/{ulid}/convert | Formular-Absendung als Lead uebernehmen — Legt aus der Absendung einen Lead an und verknuepft beide. Verlangt marketing.submission.convert IN DER MARKE der Absendung. | marketing.submission.convert | ulid, + body | ||
POST | /api/v1/marketing/form-submissions/{ulid}/spam | Formular-Absendung als Spam markieren — Markiert die Formular-Absendung als Spam. | marketing.submission.spam | ulid, + body | ||
POST | /api/v1/marketing/form-submissions/{ulid}/unspam | Spam-Markierung zurücknehmen — Nimmt die Spam-Markierung der Formular-Absendung zurück. | marketing.submission.spam | ulid, + body | ||
GET | /api/v1/marketing/goal-reports | Collection of MarketingGoalReport | marketing.report.view | page, goalUlid, kind | ||
POST | /api/v1/marketing/goal-reports | Bericht jetzt erstellen — Erstellt bzw. schreibt den Bericht der Art fort: daily für heute, weekly für die letzten sieben Tage, final für den ganzen Zeitraum (nur nach dem Ende des Ziels). Zusammenfassung per KI (gedrosselt, Budget der Marke), ohne KI nur die Zahlen. | marketing.goal.manage | + body | ||
GET | /api/v1/marketing/goal-reports/{ulid} | Read one MarketingGoalReport | marketing.report.view · object rule mkt.view | ulid | ||
POST | /api/v1/marketing/goal-reports/{ulid}/send | Bericht per Mail senden — Schickt den Bericht an die Verantwortlichen des Ziels — je Empfänger genau einmal; liefert die Zahl der Zustellungen in sentCount. | marketing.goal.manage | ulid, + body | ||
GET | /api/v1/marketing/goal-tasks | Collection of MarketingGoalTask | marketing.report.view | goalUlid, status | ||
POST | /api/v1/marketing/goal-tasks | Create a MarketingGoalTask | marketing.goal.manage | + body | ||
DELETE | /api/v1/marketing/goal-tasks/{ulid} | Delete a MarketingGoalTask | marketing.goal.manage | ulid | ||
GET | /api/v1/marketing/goal-tasks/{ulid} | Read one MarketingGoalTask | marketing.report.view · object rule mkt.view | ulid | ||
PATCH | /api/v1/marketing/goal-tasks/{ulid} | Update a MarketingGoalTask | marketing.goal.manage | ulid, + body | ||
GET | /api/v1/marketing/goals | Collection of MarketingGoal | marketing.report.view | page, brandId, status | ||
POST | /api/v1/marketing/goals | Marketing-Ziel setzen — Setzt das Ziel einer Marke für vier Wochen: Vorlage (scale_despite_losses, profitability_first, break_even_growth, not_sure, custom), Kennzahl (cpa, cpl, roas) und Zielwert (cpl: Leads, cpa: Käufe, roas: Umsatz je Werbe-Euro in Hundertsteln). Je Marke höchstens ein laufendes Ziel (409). Ohne brandId gilt die einzige bzw. die Standard-Marke. | marketing.goal.manage | + body | ||
GET | /api/v1/marketing/goals/{ulid} | Read one MarketingGoal | marketing.report.view · object rule mkt.view | ulid | ||
PATCH | /api/v1/marketing/goals/{ulid} | Update a MarketingGoal | marketing.goal.manage | ulid, + body | ||
POST | /api/v1/marketing/goals/{ulid}/end | Ziel vorzeitig beenden — Beendet das laufende Ziel; der Abschlussbericht folgt im nächsten Zeitplan-Lauf. Danach lässt sich ein neues Ziel setzen. | marketing.goal.manage | ulid, + body | ||
POST | /api/v1/marketing/goals/{ulid}/launch | Kampagne starten — Startet das Ziel: ab hier entstehen Tages- und Wochenberichte. Nur ohne offene Pflichtaufgabe (422). Werbekampagnen bleiben, wie sie sind — scharf geschaltet wird jede einzeln mit marketing.ads.publish. | marketing.goal.manage | ulid, + body | ||
POST | /api/v1/marketing/goals/{ulid}/reopen | Beendetes Ziel wieder aufnehmen — Nimmt „Ziel beenden“ zurück (Rückgängig): das Ziel läuft weiter wie vorher. Nur für ein vorzeitig beendetes Ziel, solange sein Abschlussbericht noch nicht geschrieben ist und die Marke kein neues Ziel hat. | marketing.goal.manage | ulid, + body | ||
POST | /api/v1/marketing/goals/{ulid}/strategy | Strategie erzeugen — Die KI erstellt aus Ziel, Markenprofil, verbundenen Kanälen, bisherigen Ergebnissen und Erkenntnissen eine Strategie mit Kanalmix, Budgetverteilung und priorisierten Aufgaben. Offene KI-Aufgaben werden ersetzt, begonnene, erledigte und eigene bleiben. Ohne KI eine Auskunft in generation.notice. Schaltet nichts scharf, gedrosselt je Nutzer, auf das KI-Budget der Marke. | marketing.goal.manage | ulid, + body | ||
GET | /api/v1/marketing/kpi-settings | Messung der Marketing-Kennzahl lesen — Zuordnungsmodell, nach dem eigene Leads und gewonnene Deals den Kampagnen zugeordnet werden (first_touch: erster Kontakt, last_touch: letzter Kontakt vor dem Abschluss — Vorgabe, linear: zu gleichen Teilen). Den Preis je SMS-Teil für die SMS-Kosten liefert die Einstellung marketing.sms.pricePerSegmentCents (Kosten für SMS und WhatsApp). | marketing.report.view · marketing.config.manage | — | ||
PATCH | /api/v1/marketing/kpi-settings | Messung der Marketing-Kennzahl ändern — Nur gesendete Felder ändern sich; unbekanntes Modell ⇒ 422. Wirkt sofort auf Übersicht, Ziel-Fortschritt, Berichte und Strategie. Recht marketing.config.manage markenübergreifend (sonst 403). | marketing.config.manage | + body | ||
GET | /api/v1/marketing/learnings | Collection of MarketingLearning | marketing.report.view | page, brandId, result, channel, active | ||
POST | /api/v1/marketing/learnings | Erkenntnis festhalten — Eigene Erkenntnis aus einem Test außerhalb des Systems — Testname, Gewinner oder Verlierer und Begründung. | marketing.goal.manage | + body | ||
POST | /api/v1/marketing/learnings/collect | Erkenntnisse aus Tests übernehmen — Legt für jeden entschiedenen Anzeigen-Varianten- und Split-Test, der noch keine Erkenntnis hat, Gewinner und Verlierer an. Liefert die Zahl der neuen Erkenntnisse. | marketing.goal.manage | + body | ||
DELETE | /api/v1/marketing/learnings/{ulid} | Delete a MarketingLearning | marketing.goal.manage | ulid | ||
GET | /api/v1/marketing/learnings/{ulid} | Read one MarketingLearning | marketing.report.view · object rule mkt.view | ulid | ||
PATCH | /api/v1/marketing/learnings/{ulid} | Update a MarketingLearning | marketing.goal.manage | ulid, + body | ||
GET | /api/v1/marketing/link-stats | Klickzahlen je Link — Klicks und verschiedene Empfänger je Ziel-Adresse, absteigend nach Klicks und gedeckelt. Genau eine Achse angeben: dispatchUlid (Versandlauf) ODER campaignUlid (Strecke, optional mit stepPosition). clicks zählt jeden Klick, recipients verschiedene Empfänger — zwölf Klicks eines Menschen sind keine zwölffache Nachfrage. | marketing.report.view | dispatchUlid, campaignUlid, stepPosition | ||
GET | /api/v1/marketing/mail-ideas | E-Mail-Ideen — Abgelegte Ideen des Mail-Studios, neueste zuerst. status=open nur offene, used die, aus denen eine Vorlage wurde (templateId). | marketing.campaign.manage | page, status, category, brandId, channel, origin | ||
DELETE | /api/v1/marketing/mail-ideas/{ulid} | Idee verwerfen — Löscht die Idee. Verlangt marketing.campaign.manage in der Marke der Idee. | marketing.campaign.manage | ulid | ||
POST | /api/v1/marketing/mail-studio/compose | Fertige Mail im Markenstil erstellen — source: idea (Idee ideaUlid) · url (Seite url, gelesen über den gesicherten Ausgang) · clone (Nachbau der Vorlage templateUlid: gleicher Aufbau, eigener Inhalt) · variants (neue Fassungen der Vorlage templateUlid). length short\ | medium\ | long, count 1–3 (ohne Angabe bei idea die Fassungen ab Werk, Einstellung marketing.studio.mail_versions, Vorgabe 2), brief als Wunsch. Ergebnis: neue Vorlagen im Block-Editor (contentMode=visual, mit Marken-Kopf, Pflicht-Abmeldeblock, Marken-Fuß) — templates; bei idea und url bekommt jede Fassung eigenen Betreff, Inhalt und ein Bild ohne Einzelklick im Automatik-Medienbudget (templates[].image, Auskunft in mediaNotice). Ohne KI wird eine Idee ein Gerüst aus Aufhänger und Überblick (aiUsed=false). Verlangt marketing.campaign.manage in der Marke; Drossel 20/min. | marketing.campaign.manage | + body |
POST | /api/v1/marketing/mail-studio/ideas | Nachrichten-Ideen erzeugen — Erzeugt count (1–12) Ideen für channel (email Vorgabe · sms · whatsapp) aus Markenprofil und Marken-Wissen der Marke brandId, optional mit Schwerpunkt focus. Je Idee: Ansatz angle, Begründung mit Zahlen reason/reasonFigures, vorgewählter Artikel (nie ausverkauft), Kategorie (promo Aktion · education Wissen · product Produkt im Fokus · social_proof Kundenstimmen · story Geschichte · news Neuigkeit), Betreff bzw. Aufhänger hook, Überblick overview, Länge `short\ | medium\ | long, ggf. Produkt. Die Ideen werden abgelegt (GET /v1/marketing/mail-ideas). Ohne aktive KI: keine Ideen, notice=aiInactive`. Verlangt marketing.campaign.manage in der Marke (403); Drossel 20/min (429). | marketing.campaign.manage | + body |
POST | /api/v1/marketing/mail-studio/split-test | Zwei Fassungen als Betreff- und Inhaltstest — Legt aus zwei Vorlagen derselben Marke (templateUlids = [A, B]) einen Newsletter-Ablauf an (inaktiv, Name name): eine Nachricht mit A als Vorlage und B im Split-Test — Betreff und Inhalt von B werden beim Versand frisch gelesen, Testgruppe 20 %, Gewinner nach Klicks nach 4 Stunden. Zielgruppe, Zeitpunkt und Start im Kampagnen-Editor. Ergebnis: campaign {ulid, name}. Verlangt marketing.campaign.manage in der Marke. | marketing.campaign.manage | + body | ||
POST | /api/v1/marketing/mail-studio/translate | Mail übersetzen — Übersetzt die visuelle Vorlage templateUlid in die Sprachen locales (installierte Sprachen, höchstens 5) — die Fassungen stehen danach IN der Vorlage (Betreff und jeder Text-Baustein), Aufbau, Gestaltung und Verweise bleiben. Der Versand wählt die Sprache des Empfängers. Ohne KI notice=aiInactive. Verlangt marketing.campaign.manage in der Marke der Vorlage; Drossel 20/min. | marketing.campaign.manage | + body | ||
GET | /api/v1/marketing/mail-variables | Verfügbare Platzhalter — Alle Platzhalter einer Marketing-Mail mit Bedeutung, Beispielwert und Herkunft. pattern: true heißt: kein fester Name, sondern eine Form (eigene Felder). | marketing.campaign.manage | — | ||
POST | /api/v1/marketing/message-estimate | Kosten vor dem Versand schätzen — channel sms\ | whatsapp. Zielgruppe audienceId (oder bei SMS die Kampagne smsCampaignUlid, dann gelten deren Text, Zielgruppe und Marke). SMS: text wird gezählt (GSM-7 160/153, Unicode 70/67, segments) und auf das Abmeldewort geprüft (hasOptOut). Ergebnis: recipients (erreichbar), withoutConsent, withoutPhone, units (SMS-Teile bzw. Nachrichten), unitPriceCents und totalCents aus den Einstellungen marketing.sms.pricePerSegmentCents bzw. marketing.whatsapp.pricePerMessageCents (fehlt der Preis: priceMissing=true, totalCents=null), currency. Verschickt nichts. Verlangt marketing.campaign.manage oder octi.sms.manage in der Marke. | marketing.campaign.manage · octi.sms.manage | + body | |
GET | /api/v1/marketing/overview | Marketing-Übersicht — Ziel-Karte, Summen (Kosten, Leads, Käufe, Umsatz, Kosten je Lead/Kauf, Umsatz je Werbe-Euro), tägliche Werte und alle Kampagnen aller Kanäle (Werbung je Netzwerk, Mail, SMS, WhatsApp) einer Marke für einen Zeitraum. Geld in Cent (EUR). | marketing.report.view | brandId, from, to, channel | ||
GET | /api/v1/marketing/report | Collection of MarketingReport | marketing.report.view | from, to, campaignId | ||
POST | /api/v1/marketing/send-time-suggestions | Günstigsten Versandzeitpunkt vorschlagen — Schlägt aus den Öffnungszeiten der Zielgruppe (audienceId) den günstigsten Wochentag und die Stunde vor und nennt den nächsten Termin (nextAt). Zu wenige Öffnungen ⇒ alle Öffnungen, ohne Daten ⇒ Dienstag 10:00; die Grundlage steht in basis. Ohne aktive KI available: false. | marketing.campaign.manage | + body | ||
GET | /api/v1/marketing/sender-profiles | Collection of MarketingSenderProfile | marketing.campaign.manage | page, brandId, active, q, order[name], order[createdAt] | ||
POST | /api/v1/marketing/sender-profiles | Create a MarketingSenderProfile | marketing.config.manage | + body | ||
DELETE | /api/v1/marketing/sender-profiles/{ulid} | Delete a MarketingSenderProfile | marketing.config.manage | ulid | ||
GET | /api/v1/marketing/sender-profiles/{ulid} | Read one MarketingSenderProfile | marketing.campaign.manage · object rule mkt.view | ulid | ||
PATCH | /api/v1/marketing/sender-profiles/{ulid} | Update a MarketingSenderProfile | marketing.config.manage | ulid, + body | ||
POST | /api/v1/marketing/sms-studio/texts | SMS-Texte vorschlagen — Schreibt count (1–5) Varianten einer Werbe-SMS zum Auftrag brief im Ton der Marke brandId. Jede Variante passt in parts (1–3) Teile — gezählt nach GSM-7 (160 bzw. 153 Zeichen je Teil) oder Unicode (70 bzw. 67) — und trägt das Abmeldewort (fehlt es, wird es angehängt). Je Variante: text, encoding, characters, segments, perSegment, remaining, hasOptOut. Ohne KI notice=aiInactive. Verlangt marketing.campaign.manage in der Marke; Drossel 20/min. | marketing.campaign.manage | + body | ||
GET | /api/v1/marketing/suggestion-settings | Vorschläge von selbst einer Marke — Mengen je Woche (adsPerWeek, mailsPerWeek, smsPerWeek, whatsappPerWeek) und Anlässe je Tag (triggersPerDay) — 0 = aus; je Wert, ob die Marke ihn selbst setzt (own) und die Vorgabe ab Werk (defaults). Dazu der Stand: aiActive, week, weekDone, lastRunAt, nextRunAt, triggersToday, und ob SMS und WhatsApp bereit sind. Ohne brandId die einzige bzw. die Standard-Marke; Recht marketing.report.view in der Marke (403). | marketing.report.view | brandId | ||
POST | /api/v1/marketing/suggestion-settings | Vorschläge von selbst einstellen — Speichert die Mengen der Marke brandId (0–20; 0 = aus; null = wieder die Vorgabe ab Werk). Nicht genannte Werte bleiben. Recht marketing.autopilot.manage in der Marke (403). Antwort wie GET. | marketing.autopilot.manage | + body | ||
POST | /api/v1/marketing/suggestion-settings/run | Jetzt vorschlagen — Prüft die Marke brandId sofort wie der stündliche Lauf: fehlt der Wochen-Takt dieser Woche, entstehen die Vorschläge jetzt; dazu fällige Anlässe (je höchstens einmal, Tagesobergrenze). Ohne KI geschieht nichts (aiActive=false). Recht marketing.autopilot.manage in der Marke; Drossel der Marketing-KI (429). Antwort wie GET, lastRun mit den Zahlen dieses Laufs. | marketing.autopilot.manage | + body | ||
GET | /api/v1/marketing/suggestions | Offene Vorschläge einer Marke — Alle offenen Vorschläge der Marke brandId (ohne: die einzige bzw. die Standard-Marke), neueste zuerst: Anzeigen-Ideen und Nachrichten-Ideen (Mail, SMS, WhatsApp) in EINER Form — area, title, text, Ansatz angle, Begründung mit Zahlen reason/reasonFigures, vorgewählter Artikel productUlid, format, network (Netz bzw. Kanal), Herkunft origin (manual · weekly · trigger) und Anlass trigger. Bereiche nur mit ihrem Recht in der Marke (Anzeigen marketing.ads.view, Nachrichten marketing.campaign.manage); ohne beide 403. | marketing.ads.view · marketing.campaign.manage | brandId, area, origin | ||
GET | /api/v1/marketing/suppressions | Collection of MarketingSuppression | marketing.consent.view | page, email, order[reason], order[createdAt] | ||
POST | /api/v1/marketing/suppressions | Create a MarketingSuppression | marketing.consent.manage | + body | ||
DELETE | /api/v1/marketing/suppressions/{ulid} | Sperreintrag aufheben — Nimmt die Adresse von der Sperrliste — sie kann danach wieder beworben werden. Verlangt marketing.consent.manage IN DER MARKE des Eintrags; eine globale Sperre (ohne Marke) verlangt das Recht ueberhaupt. | marketing.consent.manage | ulid | ||
GET | /api/v1/marketing/suppressions/{ulid} | Read one MarketingSuppression | marketing.consent.view | ulid | ||
GET | /api/v1/marketing/warning-settings | Schwellen der Marketing-Warnungen lesen — Ab wann ein Ausreißer gemeldet wird: Tagesausgaben einer Werbekampagne in Prozent des Durchschnitts der 14 Tage davor (Vorgabe 200) plus Mindest-Mehrbetrag in Cent (5000), Kosten je Ziel der letzten 7 Tage in Prozent der 28 Tage davor (150), Unzustellbarkeit und Abmeldequote der Mails der letzten 7 Tage in Basispunkten (300 = 3 %, 100 = 1 %) ab einer Mindestmenge versendeter Mails (100). | marketing.report.view · marketing.config.manage | — | ||
PATCH | /api/v1/marketing/warning-settings | Schwellen der Marketing-Warnungen ändern — Nur gesendete Felder ändern sich; Werte außerhalb der Grenzen ⇒ 422. Wirkt bei der nächsten Prüfung (täglich 09:00 bzw. „Jetzt prüfen“). Recht marketing.config.manage markenübergreifend (sonst 403). | marketing.config.manage | + body | ||
GET | /api/v1/marketing/warnings | Marketing-Warnungen (Ausreißer) — Erkannte Ausreißer: plötzliche Ausgaben und steigende Kosten je Ziel einer Werbekampagne, sinkende Zustellbarkeit und hohe Abmeldequote im Mailversand einer Marke — mit Schwere (warning/critical), Zustand (open, acknowledged, resolved) und den verglichenen Zahlen in details. Neueste zuerst; ohne Filter alle aktiven und erledigten. | marketing.report.view | page, status, kind, order[lastSeenAt] | ||
POST | /api/v1/marketing/warnings/check | Marketing-Ausreißer jetzt prüfen — Führt die tägliche Prüfung sofort aus und antwortet mit der Bilanz: neue Warnungen (neu), versandte Benachrichtigungen (gemeldet), auffällige Gegenstände (aktiv) und erledigte Warnungen (erledigt). | marketing.ads.manage · marketing.campaign.manage | + body | ||
GET | /api/v1/marketing/warnings/{ulid} | Eine Marketing-Warnung — Art, Gegenstand, Schwere, Zustand und die verglichenen Zahlen eines Ausreißers. | marketing.report.view | ulid | ||
POST | /api/v1/marketing/warnings/{ulid}/acknowledge | Marketing-Warnung quittieren — Zur Kenntnis genommen: die Warnung bleibt aktiv, solange der Ausreißer anhält, wird aber nicht erneut gemeldet — außer sie steigt auf „kritisch“. Werbung verlangt marketing.ads.manage, Mailversand marketing.campaign.manage in der Marke der Warnung; erledigte Warnungen ⇒ 409. | marketing.report.view | ulid, + body | ||
GET | /api/v1/marketing/web-forms | Collection of MarketingWebForm | marketing.form.manage | page, active, q, order[name], order[createdAt] | ||
POST | /api/v1/marketing/web-forms | Create a MarketingWebForm | marketing.form.manage | + body | ||
DELETE | /api/v1/marketing/web-forms/{ulid} | Delete a MarketingWebForm | marketing.form.manage | ulid | ||
GET | /api/v1/marketing/web-forms/{ulid} | Read one MarketingWebForm | marketing.form.manage · object rule mkt.view | ulid | ||
PATCH | /api/v1/marketing/web-forms/{ulid} | Update a MarketingWebForm | marketing.form.manage | ulid, + body | ||
GET | /api/v1/marketing/whatsapp-templates | Collection of MarketingWhatsAppTemplate | marketing.campaign.manage | page, status, brandId, q | ||
POST | /api/v1/marketing/whatsapp-templates | WhatsApp-Vorlage anlegen — Legt einen ENTWURF an (Kategorie MARKETING). name wird in die Form von Meta gebracht (Kleinbuchstaben, Ziffern, Unterstrich), eindeutig je Marke und Sprache. body bis 1024 Zeichen mit Platzhaltern {{1}}, {{2}} … lückenlos und nicht am Anfang oder Ende; je Platzhalter in variables {label, example, source} (Beispiel Pflicht, Quelle z. B. {{ first_name }}). Optional mediaUrl (https) mit mediaType image\ | video\ | document und footer (bis 60 Zeichen). Eingereicht wird mit /submit. | marketing.campaign.manage | + body |
POST | /api/v1/marketing/whatsapp-templates/draft | WhatsApp-Vorlage per KI entwerfen — Entwurf aus einem Satz brief im Ton der Marke brandId: Name, Text mit Platzhaltern, Beispiele und Fußzeile in draft — angelegt wird erst mit POST /v1/marketing/whatsapp-templates. Ohne KI notice=aiInactive. Drossel 20/min. | marketing.campaign.manage | + body | ||
DELETE | /api/v1/marketing/whatsapp-templates/{ulid} | Delete a MarketingWhatsAppTemplate | marketing.campaign.manage | ulid | ||
GET | /api/v1/marketing/whatsapp-templates/{ulid} | Read one MarketingWhatsAppTemplate | marketing.campaign.manage | ulid | ||
PATCH | /api/v1/marketing/whatsapp-templates/{ulid} | WhatsApp-Vorlage ändern — Nur Entwürfe und abgelehnte Vorlagen — eine eingereichte oder genehmigte Fassung ist fest (Meta prüft genau sie). Eine abgelehnte Vorlage wird nach der Änderung neu eingereicht. | marketing.campaign.manage | ulid, + body | ||
POST | /api/v1/marketing/whatsapp-templates/{ulid}/campaign | Kampagne aus der Vorlage anlegen — Nur GENEHMIGTE Vorlagen: legt eine inaktive Kampagne mit einem WhatsApp-Schritt an die Zielgruppe audienceId an (Name campaignName). Die Kosten vorab zeigt POST /v1/marketing/message-estimate; gestartet wird im Fluss-Editor. Antwort trägt campaignUlid. | marketing.campaign.manage | ulid, + body | ||
POST | /api/v1/marketing/whatsapp-templates/{ulid}/refresh | Zustand bei Meta abfragen — Fragt den Zustand der Genehmigung über Twilio ab: approved, rejected (Grund in rejectionReason), pending, paused, disabled. Offene Einreichungen werden zusätzlich halbstündlich abgefragt. | marketing.campaign.manage | ulid, + body | ||
POST | /api/v1/marketing/whatsapp-templates/{ulid}/submit | Bei Meta einreichen — Legt die Vorlage über die Twilio Content API an und reicht sie bei Meta zur Genehmigung ein (Kategorie MARKETING). Zustand danach submitted bzw. pending; Meta antwortet meist binnen Minuten bis Stunden. Ohne Twilio-Zugang der Marke 422. | marketing.campaign.manage | ulid, + body |
Purpose texts that do not follow the standard pattern are taken verbatim from the interface description in the code.