Docs durchsuchen

Guides und API-Endpunkte durchsuchen

API-Dokumentation

Public API · docs.campaignkit.ventureon.io · v1 (gepinnt auf Meta v25.0)

01

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.

Base URL
https://api.campaignkit.ventureon.io/v1
Hierarchie
Campaign → Ad Set → Ad (+ Creative)
KI-optimiert. Konsistente Benennung, eine OpenAPI-Spec als Single Source of Truth, plus Docs als gebündeltes Markdown (llms.txt) und ein MCP-Server — damit Coding-KIs (Claude Code, Cursor) sich sofort zurechtfinden.

Maschinenlesbar

02

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_xxxxxxxxxxxxxxxx

lib/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 · Ad Set anlegen

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("/meta/adsets", {
  method: "POST",
  headers: { "Idempotency-Key": crypto.randomUUID() },
  body: JSON.stringify({
    target: "sommerfest-2026",
    daily_budget_cents: 5000,
  }),
});
03

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_xxxxxxxxxxxxxxxx

Server-only: Key niemals im Browser/Client-Bundle verwenden. In Next.js nur in Route Handlers, Server Actions oder Server Components.

Standard-Header

HeaderPflichtBeschreibung
AuthorizationimmerBearer <API-Key>. Bestimmt den Kunden und damit das Werbekonto. Niemals clientseitig im Browser verwenden.
Content-Typebei JSON-Bodyapplication/json — entfällt bei Multipart-Uploads (Media).
Idempotency-Keyempfohlen (POST)Eindeutige UUID pro Erstellung. Wiederholte Requests mit gleichem Key erzeugen keine Dubletten.
CampaignKit-VersionoptionalPinnt die API-Version (z. B. v1). Ohne Header gilt die Account-Default-Version.
X-Request-IdoptionalEigene Korrelations-ID; wird in Logs & Support-Anfragen zurückgegeben.

Zugang zur Doku

Menschen

SSO-Login → volle Docs

KI-Tools

scoped read-only Token

MCP
mcp://campaignkit/docs
04

Konventionen

Gelten für alle Endpunkte: Pagination, Rate-Limits und Idempotenz.

Pagination

Listen liefern data[] im selben Umschlag wie jede andere Antwort. Geblättert wird über limit (Standard 25, höchstens 100) und offset. Kommen weniger als limit Einträge zurück, war es die letzte Seite.

Envelope

{
  "data": [ { "id": "a51f9c33-7e2b-4d18-8a0e-6b9c1d4f2e77", "name": "…" } ],
  "request_id": "9f2c1b70-5a83-4c2e-9d11-7e40b6a8c5d3"
}

// nächste Seite:
GET /v1/meta/adsets?limit=25&offset=25

Rate-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: 12

Idempotenz

Bei POST-Erstellungen einen Idempotency-Key (UUID) mitsenden. Wiederholungen mit gleichem Key liefern dasselbe Ergebnis — keine doppelten Kampagnen bei Netzwerk-Retries.

05

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"
}
StatusCodeBedeutung
401unauthorizedAPI-Key fehlt, ungültig oder rotiert.
402payment_requiredZugang gesperrt. Das ist ein administrativer Schalter deines Ansprechpartners, kein Zahlungsstatus. Lesen (Status, Insights) bleibt möglich, deshalb trifft 402 nur schreibende Aufrufe.
403forbiddenKey-Scope deckt diese Operation nicht (z. B. reporting-only).
404not_foundRessource oder Endpunkt existiert nicht (falsche ID oder unbekannter Pfad).
405method_not_allowedHTTP-Methode für diesen Endpunkt nicht erlaubt (erlaubte Methoden im Allow-Header).
409conflictIdempotenz-Konflikt oder Statuskollision (u. a. deaktivierte Ziel-Kampagne beim Anlegen/Ändern/Aktivieren von Ad-Sets oder Ads).
422validation_errorRequest-Body nicht lesbar oder inhaltlich ungültig (siehe details[]); auch bei unvollständigem Onboarding des Kunden (details.missing listet fehlende Pflichtdaten).
429rate_limitedZu viele Requests → Retry-After beachten.
5xxinternal_errorFehler bei uns oder bei Meta. Mit Backoff erneut versuchen.
06

Zugang

Der API-Key bestimmt den Kunden und damit das Werbekonto. Es gibt keine Tarifstufen und keine Kontingente in der API.

Ist ein Zugang gesperrt, antworten schreibende Aufrufe (Ad-Sets, Ads, Creatives anlegen oder aktivieren) mit 402 payment_required. Lesende Aufrufe (Status, Insights, Listen) funktionieren weiter, damit du laufende Anzeigen weiter auswerten kannst. Die Freischaltung erfolgt über deinen Ansprechpartner.

07

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.

08

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.

v1 · stablev2 · geplant
  • Pinnen: optionaler Header CampaignKit-Version: v1 fixiert 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

10 Gruppen · 32 Endpunkte

Jede 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 Endpunkt

Media

Ü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 Endpunkte

Creatives

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 Endpunkte

Ad 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 Endpunkte

Ads

Verknüpft Ad Set + Creative zur fertigen Anzeige. Der Name wird automatisch vergeben (Naming Convention); die Ad startet als PAUSED-Entwurf.

4 Endpunkte

Targeting

Lookup-Helfer, um gültige Geo- und Interessen-Keys für das Targeting zu finden.

2 Endpunkte

Status / Webhooks

Review-/Lieferstatus live abfragen (Pull) oder per registrierter Webhook-URL empfangen (Push).

1 Endpunkt

Webhooks

Status-Webhooks (Registrierung; Push bei ad.status_changed).

2 Endpunkte

Reporting

Normalisierte Performance-Metriken aus täglich gesyncten Snapshots. Die Kundenplattform verknüpft sie mit eigenen Verkaufsdaten.

1 Endpunkt

Audiences

Custom Audiences aus rohen CRM-Kontakten (serverseitig gehasht) und darauf basierende Lookalikes.

8 Endpunkte