API-Referenz
Vollständige REST API-Dokumentation mit Beispielen für alle Endpoints von Barefoot CMP.
Base URL
https://cmp.barefoot-performance.com/v1
Alle API-Requests verwenden diese Base URL als Prefix. Beispiel: GET https://cmp.barefoot-performance.com/v1/config/bf_a1b2c3d4
Allgemeine Informationen
| Eigenschaft | Wert |
|---|---|
| Format | JSON (Content-Type: application/json) |
| CORS | Global aktiviert (*) für Banner-Requests |
| Rate Limiting (Paid) | 1.000 Requests / Minute |
| Rate Limiting (Free) | 100 Requests / Minute |
| Encoding | UTF-8 |
| Versionierung | Über URL-Pfad (/v1/) |
Endpoint-Typen
Die API unterscheidet zwischen zwei Typen von Endpoints:
- Öffentliche Endpoints – Kein Auth erforderlich. Werden vom Banner und öffentlichen Integrationen verwendet (Config, Consent, Geo, Banner-Script).
- Authentifizierte Endpoints – Erfordern einen gültigen Supabase JWT im Authorization-Header. Werden vom Dashboard und API-Integrationen verwendet (Instanzen, Cookies, Scanner, Billing).
Authentifizierung
So autorisierst du API-Requests an geschützte Endpoints.
JWT-basierte Authentifizierung
Barefoot CMP verwendet Supabase JWT-Tokens für die Authentifizierung. Der Token wird beim Login im Dashboard automatisch generiert und muss bei allen authentifizierten Requests im Authorization-Header mitgeschickt werden.
Authorization: Bearer <your-jwt-token>
Token erhalten
Nach dem Login im Dashboard ist der JWT über Supabase Auth verfügbar. Für programmatischen Zugriff:
// Nach Login über Supabase Auth
const { data: { session } } = await supabase.auth.getSession();
const token = session.access_token;
// Request mit JWT-Token
const response = await fetch('https://cmp.barefoot-performance.com/v1/instances', {
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
});
const instances = await response.json();
Curl-Beispiel
curl -X GET https://cmp.barefoot-performance.com/v1/instances \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
-H "Content-Type: application/json"
Auth-Config Endpoint
Die Supabase-Verbindungsdaten für Client-seitige Auth können über diesen öffentlichen Endpoint abgerufen werden:
Gibt die Supabase-Konfiguration zurück, die für Client-seitige Authentifizierung benötigt wird.
Response:
{
"supabaseUrl": "https://xxxxx.supabase.co",
"supabaseAnonKey": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"cmpBaseUrl": "https://cmp.barefoot-performance.com"
}
Wichtig: JWT-Tokens haben eine begrenzte Gültigkeit. Supabase erneuert Tokens automatisch. Bei manuellen API-Aufrufen stelle sicher, dass du immer einen aktuellen Token verwendest.
Consent
Endpoints zum Speichern und Auswerten von Consent-Entscheidungen.
Speichert eine Consent-Entscheidung. Wird automatisch vom Banner aufgerufen, wenn der Besucher eine Auswahl trifft. Die IP-Adresse wird mit SHA-256 gehasht und gekürzt gespeichert (nicht im Klartext).
Request-Body:
{
"cmpId": "bf_a1b2c3d4",
"categories": {
"necessary": true,
"analytics": true,
"marketing": false,
"functional": true
},
"type": "custom",
"url": "https://example.com/page",
"userAgent": "Mozilla/5.0..."
}
Body-Parameter:
| Parameter | Typ | Status | Beschreibung |
|---|---|---|---|
cmpId |
string |
Erforderlich | CMP-ID der Instanz |
categories |
object |
Erforderlich | Consent-Status pro Kategorie (boolean) |
type |
string |
Erforderlich | accept_all, reject_all oder custom |
url |
string |
Optional | URL der Seite, auf der Consent gegeben wurde |
userAgent |
string |
Optional | User-Agent des Browsers |
Response (201 Created):
{
"success": true,
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
Datenschutz: Die IP-Adresse wird serverseitig mit SHA-256 gehasht und nur die ersten 12 Zeichen des Hashs gespeichert. Es ist keine Rückverfolgung auf die Original-IP möglich.
Gibt Consent-Statistiken für eine Instanz zurück. Zeigt Gesamtzahlen, Aufschlüsselung nach Typ und Akzeptanzraten pro Kategorie.
Beispiel-Request:
curl https://cmp.barefoot-performance.com/v1/consent/bf_a1b2c3d4/stats \
-H "Authorization: Bearer <token>"
Response (200 OK):
{
"total": 1250,
"acceptAll": 875,
"rejectAll": 125,
"custom": 250,
"categoryAcceptance": {
"analytics": 0.82,
"marketing": 0.65,
"functional": 0.78
},
"last24h": {
"total": 45,
"acceptAll": 32,
"rejectAll": 5,
"custom": 8
},
"last7d": {
"total": 312,
"acceptAll": 218,
"rejectAll": 38,
"custom": 56
},
"last30d": {
"total": 1250,
"acceptAll": 875,
"rejectAll": 125,
"custom": 250
}
}
Exportiert alle Consent-Einträge für DSGVO-Audits. Unterstützt CSV- und JSON-Format.
Query-Parameter:
| Parameter | Typ | Status | Beschreibung |
|---|---|---|---|
format |
string |
Optional | csv (Standard) oder json |
CSV-Spalten:
id, cmpId, timestamp, type, necessary, analytics, marketing, functional, anonymousId, country, url
Beispiel-Request:
# CSV-Export
curl https://cmp.barefoot-performance.com/v1/consent/bf_a1b2c3d4/export?format=csv \
-H "Authorization: Bearer <token>" \
-o consent-export.csv
# JSON-Export
curl https://cmp.barefoot-performance.com/v1/consent/bf_a1b2c3d4/export?format=json \
-H "Authorization: Bearer <token>"
DSGVO-Audit: Der Export enthält alle Consent-Nachweise mit Zeitstempel, anonymer ID und den gewählten Kategorien. Damit lässt sich jeder Consent lückenlos nachvollziehen.
Instanzen
CRUD-Endpoints für CMP-Instanzen (Websites). Alle Endpoints erfordern Authentifizierung.
Erstellt eine neue CMP-Instanz für eine Website. Generiert automatisch eine eindeutige CMP-ID im Format bf_XXXXXXXX.
Request-Body:
{
"domain": "example.com",
"language": "de",
"primaryColor": "#2563eb",
"position": "bottom",
"theme": "light"
}
Body-Parameter:
| Parameter | Typ | Status | Beschreibung |
|---|---|---|---|
domain |
string |
Erforderlich | Domain der Website (ohne https://) |
language |
string |
Optional | Standardsprache (de, en, etc.). Standard: de |
primaryColor |
string |
Optional | Primärfarbe als Hex-Code. Standard: #2563eb |
position |
string |
Optional | Banner-Position (bottom, top). Standard: bottom |
theme |
string |
Optional | Design-Theme (light, dark). Standard: light |
Response (201 Created):
{
"id": "bf_x7k9m2p4",
"domain": "example.com",
"language": "de",
"primaryColor": "#2563eb",
"position": "bottom",
"theme": "light",
"embedCode": "<script src=\"https://cmp.barefoot-performance.com/v1/loader.js?id=bf_x7k9m2p4\" defer></script>",
"createdAt": "2025-02-10T14:30:00Z"
}
Listet alle CMP-Instanzen des authentifizierten Benutzers auf.
Beispiel-Request:
curl https://cmp.barefoot-performance.com/v1/instances \
-H "Authorization: Bearer <token>"
Response (200 OK):
[
{
"id": "bf_x7k9m2p4",
"domain": "example.com",
"language": "de",
"primaryColor": "#2563eb",
"position": "bottom",
"theme": "light",
"createdAt": "2025-02-10T14:30:00Z"
},
{
"id": "bf_r3t5w8a1",
"domain": "shop.example.com",
"language": "en",
"primaryColor": "#10b981",
"position": "bottom",
"theme": "dark",
"createdAt": "2025-01-20T09:15:00Z"
}
]
Aktualisiert die Konfiguration einer bestehenden CMP-Instanz. Es müssen nur die zu ändernden Felder mitgeschickt werden (Partial Update).
Request-Body (nur geänderte Felder):
{
"primaryColor": "#10b981",
"position": "top",
"theme": "dark",
"showFloatingButton": false
}
Beispiel-Request:
curl -X PUT https://cmp.barefoot-performance.com/v1/instances/bf_x7k9m2p4/config \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"primaryColor": "#10b981", "theme": "dark"}'
Response (200 OK):
{
"success": true,
"instance": {
"id": "bf_x7k9m2p4",
"domain": "example.com",
"primaryColor": "#10b981",
"theme": "dark",
// ... alle Felder
}
}
Löscht eine CMP-Instanz und alle zugehörigen Daten (Consent-Logs, Cookie-Deklarationen, Scan-Ergebnisse).
Achtung: Diese Aktion kann nicht rückgängig gemacht werden! Alle Consent-Logs, Cookie-Deklarationen und Scan-Ergebnisse werden unwiderruflich gelöscht.
Beispiel-Request:
curl -X DELETE https://cmp.barefoot-performance.com/v1/instances/bf_x7k9m2p4 \
-H "Authorization: Bearer <token>"
Response (200 OK):
{
"success": true,
"message": "Instance bf_x7k9m2p4 and all associated data deleted"
}
Scanner
Cookie-Scanner Endpoints zum automatischen Erkennen von Cookies und Trackern auf Websites.
Startet einen neuen Cookie-Scan für die Website der Instanz. Der Scan läuft asynchron im Hintergrund. Verwendet Puppeteer (wenn verfügbar) oder HTTP-Fallback.
Beispiel-Request:
curl -X POST https://cmp.barefoot-performance.com/v1/instances/bf_a1b2c3d4/scan/start \
-H "Authorization: Bearer <token>"
Response (202 Accepted):
{
"success": true,
"scanId": "scan_a1b2c3d4-e5f6-7890",
"status": "scanning"
}
Hinweis: Ein Scan dauert je nach Größe der Website 10-60 Sekunden. Verwende den GET-Endpoint, um den Status und die Ergebnisse abzufragen.
Gibt die Ergebnisse des letzten Scans zurück. Zeigt gefundene Cookies, Tracker und den Status.
Beispiel-Request:
curl https://cmp.barefoot-performance.com/v1/instances/bf_a1b2c3d4/scan \
-H "Authorization: Bearer <token>"
Response (200 OK):
{
"status": "completed",
"scanId": "scan_a1b2c3d4-e5f6-7890",
"timestamp": "2025-02-10T03:00:00Z",
"duration": 23500,
"foundCookies": [
{
"name": "_ga",
"provider": "Google",
"category": "analytics",
"purpose": "Google Analytics – Besucher-Unterscheidung",
"expiry": "2 Jahre"
},
{
"name": "_fbp",
"provider": "Facebook",
"category": "marketing",
"purpose": "Facebook Pixel – Retargeting",
"expiry": "3 Monate"
}
],
"foundTrackers": [
"Google Analytics",
"Facebook Pixel",
"Google Tag Manager"
],
"summary": {
"totalCookies": 8,
"necessary": 2,
"analytics": 3,
"marketing": 2,
"functional": 1
}
}
Mögliche Status-Werte:
| Status | Beschreibung |
|---|---|
pending |
Scan ist in der Warteschlange |
scanning |
Scan läuft aktuell |
completed |
Scan erfolgreich abgeschlossen |
failed |
Scan fehlgeschlagen (z.B. Website nicht erreichbar) |
Wöchentlicher Cron-Job Endpoint für geplante Scans. Wird automatisch jeden Montag um 03:00 UTC durch Vercel Cron ausgeführt. Erfordert den X-API-Key-Header zur Autorisierung.
Cron-Schedule: 0 3 * * 1 (Montag 03:00 UTC)
Erforderlicher Header:
X-API-Key: <SCAN_API_KEY>
Hinweis: Dieser Endpoint ist nur für interne Verwendung durch Vercel Cron Jobs vorgesehen. Der SCAN_API_KEY wird als Environment Variable konfiguriert.
Policy-Generator
Automatische Cookie-Richtlinien-Generierung für Kunden-Websites.
Generiert eine vollständige HTML-Cookie-Richtlinie basierend auf den Cookie-Deklarationen der Instanz. Kann direkt als eigenständige Seite verwendet werden.
Beispiel-Request:
curl https://cmp.barefoot-performance.com/v1/instances/bf_a1b2c3d4/policy \
-H "Authorization: Bearer <token>"
Response: Vollständiges HTML-Dokument mit Cookie-Richtlinie (Content-Type: text/html).
Gibt die Policy-Daten als strukturiertes JSON zurück. Ideal für eigene Darstellungen und Custom-Templates.
Response (200 OK):
{
"domain": "example.com",
"generatedAt": "2025-02-10T12:00:00Z",
"sections": [
{
"title": "Was sind Cookies?",
"content": "Cookies sind kleine Textdateien..."
},
{
"title": "Welche Cookies verwenden wir?",
"content": "Wir verwenden folgende Kategorien..."
}
],
"cookiesByCategory": {
"necessary": [...],
"analytics": [...],
"marketing": [...],
"functional": [...]
},
"legalTexts": {
"consentInfo": "Gemäß DSGVO Art. 7...",
"rightsInfo": "Sie haben das Recht..."
}
}
Gibt ein einbettbares JavaScript-Snippet zurück, das die Cookie-Richtlinie in eine bestehende Seite (z.B. die Datenschutzseite des Kunden) integriert.
Response: JavaScript-Code (Content-Type: application/javascript), der in die Datenschutzseite eingebunden werden kann:
<!-- In der Datenschutzseite einbinden: -->
<div id="barefoot-cookie-policy"></div>
<script src="https://cmp.barefoot-performance.com/v1/instances/bf_a1b2c3d4/policy/embed"></script>
Billing
Stripe-basierte Zahlungsabwicklung für Plan-Upgrades und Abonnementverwaltung.
Erstellt eine Stripe Checkout Session für ein Plan-Upgrade. Der Benutzer wird zur Stripe-Zahlungsseite weitergeleitet.
Request-Body:
{
"plan": "pro"
}
Body-Parameter:
| Parameter | Typ | Status | Beschreibung |
|---|---|---|---|
plan |
string |
Erforderlich | pro (9 EUR/Monat) oder agency (49 EUR/Monat) |
Response (200 OK):
{
"url": "https://checkout.stripe.com/c/pay/cs_test_..."
}
JavaScript-Beispiel:
// Checkout starten und Benutzer weiterleiten
const response = await fetch('/v1/billing/create-checkout', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ plan: 'pro' })
});
const { url } = await response.json();
window.location.href = url;
Erstellt eine Stripe Customer Portal Session zur Verwaltung des bestehenden Abonnements (Kündigung, Zahlungsmethode ändern, Rechnungen einsehen).
Response (200 OK):
{
"url": "https://billing.stripe.com/p/session/..."
}
Stripe Webhook Endpoint für automatische Verarbeitung von Zahlungsevents. Wird von Stripe aufgerufen und validiert die Signatur mit dem Webhook Secret.
Verarbeitete Events:
| Event | Aktion |
|---|---|
checkout.session.completed |
Plan-Upgrade wird aktiviert, Profil aktualisiert |
customer.subscription.updated |
Plan-Änderung wird übernommen |
customer.subscription.deleted |
Downgrade auf Free-Plan |
Hinweis: Dieser Endpoint ist ausschließlich für Stripe Webhooks vorgesehen. Die Webhook-Signatur wird automatisch validiert. Manuelle Aufrufe werden abgelehnt.
Fehlerbehandlung
Fehlerformate, HTTP-Status-Codes und Rate Limiting der API.
Fehler-Format
Alle API-Fehler werden in einem einheitlichen JSON-Format zurückgegeben:
{
"error": "Beschreibung des Fehlers"
}
Beispiel – Fehlende CMP-ID:
{
"error": "Missing required parameter: cmpId"
}
Beispiel – Ungültiger Token:
{
"error": "Invalid or expired JWT token"
}
HTTP-Status-Codes
| Status | Bedeutung | Beispiel |
|---|---|---|
200 |
Erfolg | Request erfolgreich verarbeitet |
201 |
Erstellt | Neue Ressource erstellt (Instanz, Cookie, Consent) |
400 |
Ungültige Anfrage | Fehlende oder ungültige Parameter |
401 |
Nicht autorisiert | Fehlender oder ungültiger JWT-Token |
403 |
Verboten | Kein Zugriff auf diese Ressource (z.B. fremde Instanz) |
404 |
Nicht gefunden | Instanz oder Ressource existiert nicht |
429 |
Rate Limit | Zu viele Requests pro Minute |
500 |
Server-Fehler | Interner Fehler – bitte Support kontaktieren |
503 |
Nicht verfügbar | Service temporär nicht erreichbar (Wartung) |
Rate Limiting
Die API begrenzt die Anzahl der Requests pro Minute pro IP-Adresse:
| Plan | Limit |
|---|---|
| Free | 100 Requests / Minute |
| Pro / Agency | 1.000 Requests / Minute |
Rate-Limit-Header:
Jede API-Response enthält Header mit Informationen zum aktuellen Rate-Limit-Status:
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 987
X-RateLimit-Reset: 1707566400
| Header | Beschreibung |
|---|---|
X-RateLimit-Limit |
Maximale Anzahl Requests pro Minute |
X-RateLimit-Remaining |
Verbleibende Requests im aktuellen Zeitfenster |
X-RateLimit-Reset |
Unix-Timestamp, wann das Limit zurückgesetzt wird |
Retry-After bei 429
Wenn das Rate Limit überschritten wird, enthält die Response einen Retry-After-Header:
HTTP/1.1 429 Too Many Requests
Retry-After: 30
Content-Type: application/json
{
"error": "Rate limit exceeded. Please retry after 30 seconds."
}
Best Practice: Implementiere exponentielles Backoff bei 429-Responses:
async function fetchWithRetry(url, options, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
const response = await fetch(url, options);
if (response.status === 429) {
const retryAfter = response.headers.get('Retry-After') || 30;
console.log(`Rate limited. Waiting ${retryAfter}s...`);
await new Promise(r => setTimeout(r, retryAfter * 1000));
continue;
}
return response;
}
throw new Error('Max retries exceeded');
}
Support
Bei Fragen zur API oder technischen Problemen:
- E-Mail: contact-us@barefoot-performance.com
- Dokumentation: Allgemeine Dokumentation
- Bitte immer CMP-ID, Request-URL und die vollständige Fehlermeldung angeben.