Docs durchsuchen
Guides und API-Endpunkte durchsuchen
API-Dokumentation
Public API · docs.campaignkit.ventureon.io · v1 (gepinnt auf Meta v25.0)
Einführung
Die CampaignKit API ist eine Middleware vor der Meta Marketing API: deine Kundenplattform sendet einfache, immer gleiche Requests — wir übersetzen sie in die korrekten Meta-Calls im richtigen Werbekonto. Push-Modell (du sendest uns Daten, wir holen nichts ab), REST, JSON, eine gepinnte Meta-Version.
https://api.campaignkit.ventureon.io/v1Campaign → Ad Set → Ad (+ Creative)llms.txt) und ein MCP-Server — damit Coding-KIs (Claude Code, Cursor) sich sofort zurechtfinden.Maschinenlesbar
Quickstart · Next.js
In drei Schritten zur ersten Anbindung. Beispiele sind auf Next.js (TypeScript, fetch) ausgelegt — der API-Key lebt ausschließlich serverseitig.
1 · API-Key hinterlegen
.env.local
// .env.local
CAMPAIGNKIT_API_KEY=ck_live_xxxxxxxxxxxxxxxxlib/campaignkit.ts
// lib/campaignkit.ts — schmaler Server-Wrapper (nur serverseitig nutzen)
const BASE = "https://api.campaignkit.ventureon.io/v1";
export async function campaignkit<T>(
path: string,
init: RequestInit = {},
): Promise<T> {
const res = await fetch(`${BASE}${path}`, {
...init,
headers: {
Authorization: `Bearer ${process.env.CAMPAIGNKIT_API_KEY}`,
"Content-Type": "application/json",
...init.headers,
},
});
if (!res.ok) throw new Error(`CampaignKit ${res.status}: ${await res.text()}`);
return res.json() as Promise<T>;
}2 · Verbindung prüfen
Route Handler
// app/api/check/route.ts (Next.js Route Handler)
import { campaignkit } from "@/lib/campaignkit";
export async function GET() {
const health = await campaignkit("/health");
return Response.json(health); // { data: { status: "ok", api_version: "v1" }, … }
}3 · Kampagne anlegen (geplant)
Server Action
// Server Action / Route Handler
import { campaignkit } from "@/lib/campaignkit";
// Ad Set unter dem von uns eingerichteten Ziel anlegen (target = Ziel-Schlüssel).
const adset = await campaignkit("/adsets", {
method: "POST",
headers: { "Idempotency-Key": crypto.randomUUID() },
body: JSON.stringify({
target: "sommerfest-2026",
daily_budget_cents: 5000,
}),
});Authentifizierung & Header
Jeder API-Call trägt den API-Key im Authorization-Header als Bearer-Token. Der Key bestimmt Kunde, Werbekonto und Plan — dahinter liegt der Meta-Token, den die Plattform nie sieht.
Authorization-Header
Authorization: Bearer ck_live_xxxxxxxxxxxxxxxxServer-only: Key niemals im Browser/Client-Bundle verwenden. In Next.js nur in Route Handlers, Server Actions oder Server Components.
Standard-Header
| Header | Pflicht | Beschreibung |
|---|---|---|
| Authorization | immer | Bearer <API-Key>. Bestimmt Kunde + Plan. Niemals clientseitig im Browser verwenden. |
| Content-Type | bei JSON-Body | application/json — entfällt bei Multipart-Uploads (Media). |
| Idempotency-Key | empfohlen (POST) | Eindeutige UUID pro Erstellung. Wiederholte Requests mit gleichem Key erzeugen keine Dubletten. |
| CampaignKit-Version | optional | Pinnt die API-Version (z. B. v1). Ohne Header gilt die Account-Default-Version. |
| X-Request-Id | optional | Eigene Korrelations-ID; wird in Logs & Support-Anfragen zurückgegeben. |
Zugang zur Doku
SSO-Login → volle Docs
scoped read-only Token
mcp://campaignkit/docsKonventionen
Gelten für alle Endpunkte: Cursor-Pagination, Rate-Limits und Idempotenz.
Pagination (Cursor)
Listen liefern data[] + paging.after. Den Cursor an die nächste Anfrage als after übergeben.
Envelope
{
"data": [ { "id": "238471029384", "name": "…" } ],
"paging": { "after": "QVFIUm...", "has_next": true }
}
// nächste Seite:
GET /v1/adsets?offset=25&limit=25Rate-Limits
Jede Antwort trägt X-RateLimit-*. Bei 429 die Sekundenzahl aus Retry-After abwarten (exponentielles Backoff empfohlen).
429-Antwort
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 0
Retry-After: 12Idempotenz
Bei POST-Erstellungen einen Idempotency-Key (UUID) mitsenden. Wiederholungen mit gleichem Key liefern dasselbe Ergebnis — keine doppelten Kampagnen bei Netzwerk-Retries.
Fehler
Einheitliches Fehler-Objekt mit stabilem code, lesbarer message und request_id für den Support. 4xx = dein Request, 5xx = wir/Meta.
Fehler-Schema
{
"error": {
"code": "validation_error",
"message": "objective must be OUTCOME_TRAFFIC or OUTCOME_SALES",
"details": [
{ "field": "objective", "issue": "invalid_enum" }
]
},
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}| Status | Code | Bedeutung |
|---|---|---|
| 400 | bad_request | Request-Format ungültig (JSON-Syntax, fehlende Felder). |
| 401 | unauthorized | API-Key fehlt, ungültig oder rotiert. |
| 403 | forbidden | Key-Scope deckt diese Operation nicht (z. B. reporting-only). |
| 404 | not_found | Ressource oder Endpunkt existiert nicht (falsche ID oder unbekannter Pfad). |
| 405 | method_not_allowed | HTTP-Methode für diesen Endpunkt nicht erlaubt (erlaubte Methoden im Allow-Header). |
| 409 | conflict | Idempotenz-Konflikt oder Statuskollision (u. a. deaktivierte Ziel-Kampagne beim Anlegen/Ändern/Aktivieren von Ad-Sets oder Ads). |
| 402 | payment_required | Kein aktiver Schreibzugang: Konto deaktiviert, Zahlung überfällig, Checkout offen oder Vertrag beendet (Lesen bleibt im deaktivierten/überfälligen Zustand möglich). |
| 422 | validation_error | Felder vorhanden, aber inhaltlich ungültig (siehe details[]); auch bei unvollständigem Onboarding des Kunden (details.missing listet fehlende Pflichtdaten). |
| 429 | rate_limited | Zu viele Requests → Retry-After beachten. |
| 5xx | internal_error | Fehler bei uns oder bei Meta. Mit Backoff erneut versuchen. |
Plan-Gating & Quotas
Der API-Key trägt den Plan des Kunden. Pläne unterscheiden sich nur in den Kosten — der volle API-Funktionsumfang ist überall identisch.
Publizierte Ads oder Media-Spend über dem Plan-Limit → 402 quota_exceeded: neue Ads werden gesperrt, bis der Kunde upgradet (POST /v1/plan/upgrade). Downgrade jederzeit zum nächsten Zyklus.
| Kostendimension | Starter | Growth | Scale | Enterprise |
|---|---|---|---|---|
| Grundgebühr | 149 € | 299 € | 599 € | ab 1.500 € |
| Inkl. Ads / Monat | 5 | 25 | 100 | custom |
| Inkl. Spend / Monat | 2.500,00 € | 10.000,00 € | 50.000,00 € | custom |
| Media-Fee | 5 % | 4 % | 3 % | 1–2 % |
Gleich in allen Plänen: Account-Erstellung · API-Automatisierung · Reporting · Support · Rate-Limit
Webhooks
Statt zu pollen, registrierst du eine HTTPS-URL und wir pushen Statusänderungen (z. B. Ad genehmigt/abgelehnt). Jeder Request ist HMAC-signiert.
Signatur verifizieren
Header X-CampaignKit-Signature = HMAC-SHA256 des Roh-Bodys mit deinem Webhook-Secret. Immer verifizieren, bevor du das Event verarbeitest.
Verifizierung · Next.js
// app/api/webhooks/campaignkit/route.ts
import crypto from "node:crypto";
export async function POST(req: Request) {
const raw = await req.text();
const sig = req.headers.get("X-CampaignKit-Signature") ?? "";
const expected = crypto
.createHmac("sha256", process.env.CAMPAIGNKIT_WEBHOOK_SECRET!)
.update(raw)
.digest("hex");
if (sig !== expected) return new Response("invalid signature", { status: 401 });
const event = JSON.parse(raw); // { type: "ad.status_changed", data: {…} }
// … Status verarbeiten, schnell 200 zurückgeben
return new Response("ok");
}Event-Payload
Beispiel
{
"id": "evt_2026_0001",
"type": "ad.status_changed",
"created": 1748505600,
"data": {
"ad_id": "120210394857",
"effective_status": "DISAPPROVED",
"reason": "Text-Overlay > 20%"
}
}Antworte schnell mit 200. Bei nicht-2xx wiederholen wir mit exponentiellem Backoff (bis zu 24 h), danach wird der Webhook als inaktiv markiert.
Versionierung
Die Version steckt im Pfad-Präfix (/v1). Innerhalb von v1 sind nur additive, nicht-brechende Änderungen erlaubt — neue Felder/Endpunkte kommen hinzu, bestehende verschwinden nicht.
- Pinnen: optionaler Header
CampaignKit-Version: v1fixiert das Verhalten unabhängig vom Account-Default. - Breaking Changes erscheinen nur in einer neuen Major-Version (
/v2) — niemals in/v1. - Deprecation: abgekündigte Versionen laufen mind. 6 Monate weiter; Hinweise via
Sunset-Header + Changelog.
Referenz
11 Gruppen · 41 EndpunkteJede Ressourcen-Gruppe hat eine eigene Seite mit allen Endpunkten, Parametern und Beispielen.
System
Verbindung & Health. Der einzige bereits implementierte Endpunkt — prüft API-Key und Erreichbarkeit.
1 EndpunktMedia
Übergibt fertige Bild und Video-Assets per URL an Meta und liefert die Referenz (image_hash bzw. video_id) für Creatives. Wir komprimieren NICHT und speichern die Datei nicht. Der Kunde ist für Format, Größe, Kompression und Versionierung selbst zuständig und übergibt nur die finale, öffentlich erreichbare URL.
5 EndpunkteAd Sets
Oberste für dich sichtbare Ebene (Ad Set → Ad). Beim Anlegen referenzierst du über `target` (Ziel-Schlüssel) das von uns eingerichtete Ziel — die übergeordnete Kampagne und ihre Konfiguration verwalten wir für dich. Du lieferst nur Budget/Laufzeit und optional Alter/Geschlecht/Interessen — Optimierung, Platzierung, Geo, Abrechnung, DSA und der Name kommen verbindlich aus der hinterlegten Konfiguration.
4 EndpunkteCreatives
Visuelles Asset (Bild ODER Video) + Text, Link und Call-to-Action. Die Absender-Identität (Facebook-Page, optional Instagram) kommt aus der Kunden-Konfiguration — nicht aus dem Request.
4 EndpunkteTemplates
Zwei Wege: (1) VORLAGEN ANZEIGEN — GET /v1/templates liefert je Vorlage bereits fertige, gecachte `preview_urls` (je Format), die du unverändert direkt als Bild einbettest (img-Tag). Kein eigenes Rendern nötig, kein API-Key in der Bild-URL. (2) EIGENES CREATIVE — GET /v1/templates/{id} (Felder lesen) + POST /v1/templates/render (eigene Inhalte) erzeugt ein Werbemittel für POST /v1/ads.
6 EndpunkteAds
Verknüpft Ad Set + Creative zur fertigen Anzeige. Der Name wird automatisch vergeben (Naming Convention); die Ad startet als PAUSED-Entwurf.
4 EndpunkteAudiences
Custom Audiences aus rohen CRM-Kontakten (serverseitig gehasht) und darauf basierende Lookalikes.
8 EndpunkteTargeting
Lookup-Helfer, um gültige Geo- und Interessen-Keys für das Targeting zu finden.
2 EndpunkteReporting
Normalisierte Performance-Metriken aus täglich gesyncten Snapshots. Die Kundenplattform verknüpft sie mit eigenen Verkaufsdaten.
1 EndpunktStatus / Webhooks
Review-/Lieferstatus live abfragen (Pull) oder per registrierter Webhook-URL empfangen (Push).
3 EndpunktePlan & Abrechnung
Vertragszustand und voraussichtliche Gebühr lesen, Konto selbst deaktivieren und jederzeit an die Rechnungen kommen. Es gibt keine Tarifwahl: die Stufe ergibt sich rückwirkend aus dem realen Ad-Spend.
3 Endpunkte