Developer portal — API
Connect external systems to the ZwemExpert / ExpertSwimCamp platform through our REST API: camps, registrations, payments, customers and more — plus outbound webhooks for real-time updates.
Base URL
https://zwemexpert-website.mike-6ba.workers.dev/api/public/v1
Authentication
Every request requires an API key via the Authorization: Bearer … header (or X-API-Key). Keys are created by an administrator and are limited per brand and per scope.
curl -H "Authorization: Bearer ze_live_…" \
"https://zwemexpert-website.mike-6ba.workers.dev/api/public/v1/camps?limit=10&locale=en"
Conventions
- Responses are JSON; lists use the shape
{ object:"list", data:[…], pagination:{…} }. - Pagination: cursor (
starting_after,limit) or offset (page,per_page). - Language via
?locale=nl|en; translatable fields follow the language. - Filter/sort/expand:
?status=…,?sort=startdatum:asc,?expand=coaches,?fields=id,naam. - Rate limit per key; see
X-RateLimit-*.
Scopes
camps:read | Read camps and availability |
coaches:read | Read coaches |
registrations:read | Read registrations |
registrations:write | Create/update registrations |
participants:read | Read participants (children) |
customers:read | Read customers (parents) |
payments:read | Read payments |
waitlist:read | Read the waitlist |
waitlist:write | Add waitlist entries |
stats:read | Read key figures |
webhooks:manage | Manage webhooks |
Errors
Errors carry a stable error.code and a localized error.message.
authentication_error | 401 | Invalid/missing key |
permission_error | 403 | Scope or brand not allowed |
invalid_request_error | 400/422 | Invalid input |
not_found | 404 | Resource does not exist |
rate_limit_error | 429 | Too many requests |
idempotency_error | 409 | Idempotency conflict |
api_error | 500 | Internal error |
Webhooks
Subscribe to events; we deliver a POST with an HMAC-SHA256 signature (header X-ZE-Signature: t=…,v1=…, signed over `${t}.${body}` with the webhook secret).
Available events: registration.created, registration.updated, registration.status_changed, registration.cancelled, payment.paid, payment.failed, payment.refunded, camp.published, camp.updated, camp.full, waitlist.created.
POST https://jouw-systeem.nl/webhook
X-ZE-Event: registration.created
X-ZE-Signature: t=1736531200,v1=
{ "id": "evt_…", "type": "registration.created",
"created": "2026-07-11T12:00:00Z", "brand": "zwemexpert",
"data": { "object": { "object": "registration", "id": 123, … } } }
Endpoint reference
Full machine-readable spec: openapi.json (importable into Postman, Insomnia or Redoc).