API Endpoints

Öffentliche Endpoints für Blog-Posts, View-Tracking und Newsletter-Subscribers.

Basis
Base URL
https://copy-choices.de/api/v1
Beispiel: /api/v1/posts
Antwortformat
application/json
Requests: Accept: application/json
Rate Limits
POST /posts/{slug}/track-view: 60/min
POST /subscribers: 20/min
Endpoints
Aufklappen → Beispiel → Try
GET /posts Liste veröffentlichter Posts (paginert), optional Target-Filter
Query
target=all|handmade|b2b Default: all
curl
curl -s "https://copy-choices.de/api/v1/posts?target=handmade"
Target
Response (gekürzt)
{
  "filter_target": "handmade",
  "data": [ { "id": 1, "title": "…", "slug": "…", "views": { "total": 123, "unique_total": 45 } } ],
  "meta": { "current_page": 1, "last_page": 3, "per_page": 20, "total": 49 }
}
GET /posts/{slug} Post-Detail inkl. Content + Tracking-Info
Parameter
Path: slug Query: target=all|handmade|b2b
curl
curl -s "https://copy-choices.de/api/v1/posts/beispiel-slug?target=all"
Slug
Target
Response (gekürzt)
{
  "filter_target": "all",
  "data": { "id": 1, "slug": "…", "content_type": "html", "content": "…", "views": { "total": 124, "unique_total": 46 } },
  "tracking": { "vid": "uuid…", "vid_is_new": false, "unique_counted": true }
}
POST /posts/{slug}/track-view Views total + unique pro Besucher/Tag
Hinweise
Cookie: cc_vid (wird gesetzt) Rate: 60/min
curl
curl -s -X POST "https://copy-choices.de/api/v1/posts/beispiel-slug/track-view"
Slug
Response (Beispiel)
{
  "ok": true,
  "unique_counted": true,
  "views": { "total": 125, "unique_total": 47 }
}
POST /subscribers Subscriber anlegen/aktualisieren (Double-Opt-In + Honeypot)
Body
email (required) target=all|handmade|b2b (required) Rate: 20/min
curl
curl -s -X POST "https://copy-choices.de/api/v1/subscribers" \
  -H "Content-Type: application/json" \
  -d '{"name":null,"email":"max@example.com","target":"handmade","company":""}'
Email
Target
Honeypot: Wenn company gefüllt ist, antwortet der Server absichtlich „ok“, führt intern aber keine echte Anmeldung aus.
Response (Beispiel)
{
  "ok": true,
  "verified": false,
  "message": "Bitte bestätige deine E-Mail über den Link, den wir dir gesendet haben."
}