RESTful API: Vollständige Dokumentation für Entwickler
Authentifizierung mit öffentlichem API-Key, JSON-Antworten, Rate-Limit 500 Anfragen/Min. Jeder Endpunkt ist mit cURL-, JavaScript- und PHP-Beispielen ausführlich dokumentiert.
Base URL und Authentication
Alle API-Aufrufe erfolgen über HTTPS über die untenstehende Base URL. HTTP-Anfragen werden per 301-Weiterleitung auf HTTPS umgeleitet.
Base URL
https://cerez.io/api/v1
OpenAPI-3.1-Spezifikation
Maschinenlesbare OpenAPI-3.1-Definition aller Endpunkte. Importierbar in Postman, Insomnia, Codegeneratoren und interaktive Clients.
openapi.json herunterladenAuthentifizierung: Öffentlicher API-Key
Die SDK-API verwendet einen öffentlichen API-Key: im URL-Pfad bei GET-Anfragen und im Anfragetext bei POST-Anfragen. Dieser Key wird vom SDK im Browser verwendet und ist daher clientseitig sichtbar, was normal ist. Der Authorization: Bearer-Header wird nicht verwendet. Ihren API-Key erhalten Sie im Admin-Panel > Installation.
curl https://cerez.io/api/v1/banner/YOUR_API_KEY
/api/v1/banner/{api_key}
Gibt die aktive Banner-Konfiguration für eine Domain zurück. Das SDK ruft diesen Endpoint bei jedem Seitenaufruf auf; die Antwort wird serverseitig 5 Minuten zwischengespeichert.
Pfad-Parameter
| Parameter | Typ | Beschreibung |
|---|---|---|
api_key | string | Der öffentliche API Key Ihrer Domain (erforderlich) |
Query-Parameter (optional)
| Parameter | Typ | Beschreibung |
|---|---|---|
lang | string | tr | en | de (Banner-Sprache; Standard: Domain-Einstellung) |
preview | boolean | Bei true wird kein Consent-Cookie geschrieben (für Live-Tests im Banner Builder) |
Beispielanfrage
curl https://cerez.io/api/v1/banner/YOUR_API_KEY
Erfolgreiche Antwort 200 OK
{ "success": true, "data": { "domain": "example.com", "position": "bottom", "theme": "modern", "language": "tr", "texts": { "title": "Çerez Tercihleriniz", "description": "Sitemiz deneyiminizi iyileştirmek için çerez kullanır...", "accept_all": "Tümünü Kabul Et", "reject_all": "Tümünü Reddet" }, "categories": [ { "id": "necessary", "required": true }, { "id": "analytics", "required": false }, { "id": "marketing", "required": false } ], "consent_expiry_days": 180, "products": { "cookie": true, "accessibility": false } } }
/api/v1/consent/log
Speichert die Einwilligungsentscheidung des Nutzers auf dem Server. Der Datensatz wird 90 Tage aufbewahrt, um der Nachweispflicht nach KVKK und GDPR zu genügen.
Body-Parameter (JSON)
| Parameter | Typ | Beschreibung |
|---|---|---|
api_key | string | Öffentlicher API Key (erforderlich) |
visitor_id | string | Anonyme Besucher-ID, bis zu 100 Zeichen (erforderlich) |
action | string | accept_all | reject_all | partial | update (erforderlich) |
categories_accepted | object | { necessary, analytics, marketing, functional } mit booleschen Werten (erforderlich) |
banner_variant | string | A | B (optional, A/B-Test) |
tc_string | string | IAB TCF TC String (optional) |
device_type | string | desktop | mobile | tablet (optional) |
external_id | string | Ihre eigene Benutzer-ID (optional) |
user_agent | string | Wird automatisch erfasst; manuelles Senden ist optional |
Beispielanfrage
curl -X POST https://cerez.io/api/v1/consent/log \ -H "Content-Type: application/json" \ -H "Accept: application/json" \ -d '{ "api_key": "YOUR_API_KEY", "visitor_id": "vis_a1b2c3d4", "action": "partial", "categories_accepted": { "necessary": true, "analytics": true, "marketing": false }, "device_type": "desktop" }'
Antwort 200 OK
{ "status": "ok" }
Hinweis: Fügen Sie der Anfrage den Header Accept: application/json hinzu, damit Validierungsfehler 422 zurückgeben.
/api/v1/heartbeat
Erhöht den Pageview-Zähler und markiert die Domain als aktiv. Das SDK ruft diesen Endpoint einmal pro Seitenaufruf auf.
Body-Parameter
| Parameter | Typ | Beschreibung |
|---|---|---|
api_key | string | Öffentlicher API Key |
session_id | string | Session-ID (für eindeutiges Pageview-Tracking) |
page_url | string | Aktuelle Seiten-URL |
referrer | string | document.referrer-Wert (optional) |
Antwort
{ "success": true, "pageview_count_month": 42183, "plan_limit": 100000, "usage_percent": 42.18 }
Alle SDK-Endpunkte
Alle /api/v1-Endpunkte, die mit dem öffentlichen API-Key arbeiten. Das vollständige Anfrage- und Antwortschema jedes Endpunkts finden Sie in der maschinenlesbaren OpenAPI-3.1-Definition.
Cookies und Einwilligung
| Methode | Endpoint | Beschreibung |
|---|---|---|
| GET | /banner/{api_key} | Banner-Konfiguration (Sprache, Theme, Kategorien) |
| POST | /consent/log | Einwilligungsprotokollierung (Fallback-Pfad: /consent-log) |
| GET | /consent/state/{api_key} | Serverseitige Einwilligungsabfrage (serverseitiges GTM) |
| GET | /consent/group/{api_key} | Domainübergreifende Einwilligungssynchronisierung |
| POST | /preferences | Speichern im universellen Präferenzzentrum |
Barrierefreiheit
| Methode | Endpoint | Beschreibung |
|---|---|---|
| GET | /a11y/{api_key} | Konfiguration des Barrierefreiheits-Widgets |
| GET | /a11y/{api_key}/ai-labels | KI-generierte Alt-Text- und aria-label-Vorschläge |
| POST | /a11y/feature-used | Nutzungstelemetrie der Barrierefreiheitsfunktionen |
| POST | /a11y/easy-read | KI-Textvereinfachung (Leichte Lesbarkeit) |
| POST | /a11y/ci-report | CI/CD-Barrierefreiheits-Gate-Bericht |
TCF und Vendor List
| Methode | Endpoint | Beschreibung |
|---|---|---|
| GET | /tcf/{api_key} | IAB-TCF-Konfiguration und GVL-Metadaten |
| GET | /gvl.json | Global Vendor List (24-Stunden-Edge-Cache) |
| GET | /tcf-validator-test | TCF-Validator-Testseite (HTML) |
Telemetrie und System
| Methode | Endpoint | Beschreibung |
|---|---|---|
| POST | /heartbeat | Seitenaufruf- und Lebenssignal |
| POST | /interactions | Interaktionstelemetrie (gemäß KVKK standardmäßig aus) |
| POST | /telemetry | Anonyme SDK-Leistungsmetriken |
| GET | /meta | Versions- und Funktionserkennung (öffentlich, schreibgeschützt) |
Antwort-Hüllen
Aus historischen Gründen verwenden SDK-Endpunkte unterschiedliche Antwort-Hüllen; diese Formen bleiben aus Gründen der Abwärtskompatibilität erhalten. Werten Sie Antworten gemäß der folgenden Tabelle aus.
| Hülle | Endpunkte |
|---|---|
{ ... } (ohne Hülle, direktes Objekt) | GET /banner, GET /a11y, GET /tcf, GET /gvl.json |
{ "status": "ok" } | POST /consent/log, POST /heartbeat, POST /a11y/feature-used |
{ "success": true } | POST /preferences, POST /a11y/ci-report |
{ "ok": true } | POST /telemetry |
{ "found": ... } | GET /consent/state, GET /consent/group |
{ "data": ..., "meta": ... } | Alle Management-API-Endpunkte (/api/mgmt/v1) |
API-Version
Die aktuellen API- und SDK-Versionen sowie TCF/GVL-Metadaten können Sie zur Laufzeit über den Endpunkt GET /api/v1/meta abrufen (öffentlich, schreibgeschützt).
GET /api/v1/meta
{
"api_version": "1.0.0",
"sdk_version": "2.6.2",
"products": ["cookie", "accessibility"],
"tcf": { "gvl_version": 123, "policy_version": 5 },
"docs": "https://cerez.io/kaynaklar/api-referans"
}
OpenAPI-3.1-Spezifikation
Alle 18 SDK-Endpunkte in maschinenlesbarer Form (Postman-Import / Client-Generierung).
Management-API (Server-zu-Server)
Eine separate API für programmatischen serverseitigen Zugriff. Die SDK-API (öffentlicher api_key) ist für Banner und Einwilligung; die Management-API ruft mit dem secret_key Ihre Domain-Daten ab (Cookie-Inventar, Einwilligungsdatensätze, Statistiken, Barrierefreiheits-Score). Schreibgeschützt.
Base URL
https://cerez.io/api/mgmt/v1
Authentifizierung: Bearer secret_key
Senden Sie Ihren Secret-Key im Authorization: Bearer-Header. Holen Sie den Secret-Key unter Admin-Panel > Installation > API und speichern Sie ihn NUR in einer sicheren Serverumgebung; setzen Sie ihn niemals clientseitig ein.
curl https://cerez.io/api/mgmt/v1/domain \ -H "Authorization: Bearer YOUR_SECRET_KEY"
{ "data": ..., "meta": ... } verpackt. Fehler werden als RFC 9457 application/problem+json zurückgegeben. Rate-Limit: 60 Anfragen/Minute.
Endpunkte
| Methode | Endpoint | Beschreibung |
|---|---|---|
| GET | /domain | Tarif, Abonnement und Einstellungen |
| GET | /cookies | Cookie-Kategorien und gescannte Cookies |
| GET | /stats?period=30 | Zustimmungs-/Ablehnungsrate, Geräteverteilung, Tagesreihe |
| GET | /consents?from&to&cursor | Einwilligungsdatensätze (cursor-paginiert, KVKK/DSGVO-Nachweis) |
| GET | /a11y/score | Letzter WCAG-Scan-Score und Verstoßverteilung |
| GET | /consents/receipt?visitor_id= | Einwilligungsnachweis für einen einzelnen Besucher (KVKK/DSGVO) |
| POST | /scan | Cookie-Scan auslösen (synchron, bis zu 3 Seiten) |
| GET | /scan/{id} | Scan-Status und -Ergebnis |
| GET | /webhooks | Webhook-Liste (Secret maskiert) |
| POST | /webhooks | Webhook erstellen (url + events) |
| DELETE | /webhooks/{id} | Webhook löschen |
| POST | /webhooks/{id}/test | Testereignis senden |
| GET | /dsar/export?visitor_id= | Betroffenendaten exportieren (DSGVO Art. 15) |
| POST | /dsar/erasure | Betroffenendaten anonymisieren (zweistufig) |
Erfolgreiche Antwort 200 OK
GET /api/mgmt/v1/domain
{
"data": {
"id": 42,
"site_name": "Örnek",
"domain_url": "https://example.com",
"products": ["cookie", "accessibility"],
"subscriptions": [
{ "product": "cookie", "plan_slug": "cookie_pro", "status": "active" }
],
"settings": { "kvkk_enabled": true, "consent_expiry_days": 180 }
},
"meta": { "api": "mgmt/v1", "generated_at": "2026-06-30T12:00:00+00:00" }
}
Webhooks HMAC-SHA256
Bei niederfrequenten Ereignissen wird ein signierter POST an Ihre registrierten Endpunkte gesendet: scan.completed, cookies.new_found, scan.error. Einwilligungsereignisse mit hohem Volumen werden nicht per Webhook gesendet.
Beispiel-Payload und -Header
POST https://ornek.com/webhooks/cerez
X-Cerez-Event: scan.completed
X-Cerez-Timestamp: 1782475200
X-Cerez-Signature: sha256=3a7b...e0
{
"event": "scan.completed",
"created_at": "2026-06-30T12:00:00+00:00",
"domain_id": 42,
"data": { "total_cookies": 31, "new_cookies": 2 }
}
Signaturprüfung (Empfängerseite)
Die Signatur wird aus dem Zeitstempel und dem Rohtext abgeleitet. Prüfen Sie mit einem zeitkonstanten Vergleich und stellen Sie sicher, dass der Zeitstempel nicht älter als 5 Minuten ist (Replay-Schutz).
// Node.js
const crypto = require('crypto');
const expected = 'sha256=' + crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(timestamp + '.' + rawBody)
.digest('hex');
const ok = crypto.timingSafeEqual(
Buffer.from(expected), Buffer.from(signatureHeader)
);
// PHP
$expected = 'sha256=' . hash_hmac('sha256', $timestamp . '.' . $rawBody, $secret);
$ok = hash_equals($expected, $signatureHeader);
DSAR (Betroffenenanfragen) KVKK m.11 / GDPR m.15-17
Hilft Ihnen, auf Auskunfts- und Löschanfragen zu den Daten eines Besuchers zu reagieren. Löschung = Anonymisierung: direkte Identifikatoren (visitor_id, external_id, user_agent, region) werden entfernt; der Einwilligungsnachweis (Aktion, Kategorien, TCF-String, Zeitstempel) bleibt ERHALTEN. Sie überprüfen die Identität des Besuchers.
Die Anonymisierung erfolgt zweistufig (Schutz vor versehentlicher Löschung)
# 1. Önizleme (confirm_token yok) — hiçbir şey değişmez curl -X POST https://cerez.io/api/mgmt/v1/dsar/erasure \ -H "Authorization: Bearer YOUR_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{ "visitor_id": "vis_a1b2c3" }' # -> { "data": { "dry_run": true, "matched_count": 3, "confirm_token": "..." } } # 2. Uygula (önizlemeden gelen confirm_token ile) curl -X POST https://cerez.io/api/mgmt/v1/dsar/erasure \ -H "Authorization: Bearer YOUR_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{ "visitor_id": "vis_a1b2c3", "confirm_token": "..." }' # -> { "data": { "dry_run": false, "affected_count": 3 } }
Ändert sich die Datensatzanzahl zwischen Vorschau und Anwendung, wird das Token ungültig (409). Zugriff und Löschung werden bei jedem erfolgreichen Aufruf im Audit-Protokoll erfasst. Dieses Werkzeug hilft Ihnen, Ihre Compliance-Pflichten zu erfüllen; wenden Sie sich für die rechtliche Gültigkeit an qualifizierten Rechtsbeistand.
OpenAPI-3.1-Spezifikation
Maschinenlesbare OpenAPI-3.1-Definition der Management-API (Postman/Codegen).
Management-API openapi.jsonAnfragelimits
Wird pro IP-Adresse angewendet. Bei Überschreitung des Limits enthält die Antwort einen Header mit der Wartezeit.
Retry-After-Header gibt die Wartezeit in Sekunden an. Für Burst Protection wird Exponential Backoff (1s, 2s, 4s, 8s...) empfohlen. Für eine individuelle Rate-Limit-Erhöhung im Enterprise-Plan wenden Sie sich an das Vertriebsteam.
HTTP-Statuscodes
| Code | Beschreibung | Typische Ursache |
|---|---|---|
| 200 | OK | Anfrage erfolgreich |
| 202 | Accepted | Akzeptiert (Telemetrie / Interaktion, asynchron) |
| 304 | Not Modified | Nicht geändert (ETag; gvl.json) |
| 402 | Payment Required | Aktives Abonnement erforderlich (Produkt deaktiviert) |
| 403 | Forbidden | Außerhalb der IP-Whitelist oder Plan-Limit überschritten |
| 404 | Not Found | API Key oder Ressource nicht gefunden |
| 422 | Unprocessable | Validierungsfehler; prüfen Sie das errors-Feld in der Antwort |
| 429 | Too Many Requests | Rate Limit überschritten (500/min) |
| 502 | Bad Gateway | Upstream-Dienst (KI / Scan) vorübergehender Fehler |
| 503 | Service Unavailable | Dienst vorübergehend nicht verfügbar; Retry-After |
Fehlerantwort-Format
{ "success": false, "error": { "code": "INVALID_API_KEY", "message": "API key bulunamadı veya devre dışı", "details": { "field": "api_key" } } }
Ereignisbenachrichtigungen Live
Webhook-Unterstützung ist über die Management-API verfügbar. Bei niederfrequenten Ereignissen wird ein mit HMAC-SHA256 signierter POST an Ihren registrierten Endpunkt gesendet. Einrichtung und Signaturprüfung finden Sie im Abschnitt Management-API.
scan.completed
Wird ausgelöst, wenn ein Cookie-Scan abgeschlossen ist (Gesamt- und neue Cookie-Anzahl)
cookies.new_found
Wird ausgelöst, wenn beim Scan neue Cookies gefunden werden
scan.error
Wird ausgelöst, wenn ein Scan fehlschlägt
Ihre offenen Fragen
Was ist der Unterschied zwischen SDK und API?
Gibt es einen Batch-Endpoint?
Wie funktioniert die IP-Whitelist?
Gibt es Webhook-Unterstützung?
Was passiert, wenn das Rate Limit überschritten wird?
Retry-After-Header gibt an, wie viele Sekunden Sie warten müssen. Für Burst Protection wird Exponential Backoff (1s, 2s, 4s, 8s...) empfohlen. Im Enterprise-Plan kann das Rate Limit erhöht werden.Möchten Sie die API testen?
Holen Sie sich Ihren API Key mit einer 14-tägigen kostenlosen Pro-Testphase, kopieren Sie den Code und starten Sie sofort mit der Integration.