{"openapi":"3.1.0","info":{"title":"ZwemExpert / ExpertSwimCamp — Publieke API","version":"1.0.0","description":"REST API voor externe koppelingen met het ZwemExpert/ExpertSwimCamp-platform. Authenticatie via API-sleutel (Bearer of X-API-Key). Alle antwoorden zijn JSON. Zie /developers voor de volledige gids.","contact":{"name":"ZwemExpert","url":"https://www.zwemexpert.nl"}},"servers":[{"url":"https://zwemexpert-website.mike-6ba.workers.dev/api/public/v1","description":"Productie (WAF-veilige worker-host)"}],"security":[{"ApiKeyAuth":[]}],"tags":[{"name":"Camps","description":"Kampen (catalogus)"},{"name":"Coaches","description":"Coaches"},{"name":"Registrations","description":"Inschrijvingen"},{"name":"Participants","description":"Deelnemers (kinderen)"},{"name":"Customers","description":"Klanten (ouders)"},{"name":"Payments","description":"Betalingen"},{"name":"Waitlist","description":"Wachtlijst/interesse-leads"},{"name":"Stats","description":"Kerncijfers"},{"name":"Webhooks","description":"Uitgaande webhooks"},{"name":"Meta","description":"Health & spec"}],"paths":{"/health":{"get":{"tags":["Meta"],"summary":"Statuscheck","security":[],"responses":{"200":{"description":"OK"}}}},"/openapi.json":{"get":{"tags":["Meta"],"summary":"OpenAPI-spec","security":[],"responses":{"200":{"description":"Spec"}}}},"/camps":{"get":{"tags":["Camps"],"summary":"Lijst kampen","security":[{"ApiKeyAuth":["camps:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":25,"maximum":100},"description":"Aantal resultaten (1-100)."},{"name":"starting_after","in":"query","schema":{"type":"integer"},"description":"Cursor: id waarna verder gepagineerd wordt (nieuw → oud)."},{"name":"ending_before","in":"query","schema":{"type":"integer"},"description":"Cursor: id waarvóór gepagineerd wordt."},{"name":"page","in":"query","schema":{"type":"integer"},"description":"Offset-paginatie (samen met per_page)."},{"name":"per_page","in":"query","schema":{"type":"integer"},"description":"Aantal per pagina bij offset-paginatie."},{"name":"sort","in":"query","schema":{"type":"string"},"description":"Sorteren, bv. `startdatum:asc`."},{"name":"fields","in":"query","schema":{"type":"string"},"description":"Kommagescheiden veldselectie."},{"name":"locale","in":"query","schema":{"type":"string","enum":["nl","en"]},"description":"Taal van vertaalbare content."},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"gepubliceerd","in":"query","schema":{"type":"boolean"}},{"name":"land","in":"query","schema":{"type":"string"}},{"name":"kamp_type","in":"query","schema":{"type":"string"}},{"name":"startdatum_from","in":"query","schema":{"type":"string","format":"date"}},{"name":"startdatum_to","in":"query","schema":{"type":"string","format":"date"}},{"name":"min_leeftijd","in":"query","schema":{"type":"integer"}},{"name":"max_leeftijd","in":"query","schema":{"type":"integer"}},{"name":"prijs_max","in":"query","schema":{"type":"number"}},{"name":"beschikbaar","in":"query","schema":{"type":"boolean"}},{"name":"expand","in":"query","schema":{"type":"string"},"description":"coaches,extras"}],"responses":{"200":{"description":"Lijst","content":{"application/json":{"schema":{"$ref":"#/components/schemas/List"}}}},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/camps/{idOrSlug}":{"get":{"tags":["Camps"],"summary":"Kamp-detail","security":[{"ApiKeyAuth":["camps:read"]}],"parameters":[{"name":"idOrSlug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Resource"},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/camps/{id}/availability":{"get":{"tags":["Camps"],"summary":"Beschikbaarheid","security":[{"ApiKeyAuth":["camps:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Resource"},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/coaches":{"get":{"tags":["Coaches"],"summary":"Lijst coaches","security":[{"ApiKeyAuth":["coaches:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":25,"maximum":100},"description":"Aantal resultaten (1-100)."},{"name":"starting_after","in":"query","schema":{"type":"integer"},"description":"Cursor: id waarna verder gepagineerd wordt (nieuw → oud)."},{"name":"ending_before","in":"query","schema":{"type":"integer"},"description":"Cursor: id waarvóór gepagineerd wordt."},{"name":"page","in":"query","schema":{"type":"integer"},"description":"Offset-paginatie (samen met per_page)."},{"name":"per_page","in":"query","schema":{"type":"integer"},"description":"Aantal per pagina bij offset-paginatie."},{"name":"sort","in":"query","schema":{"type":"string"},"description":"Sorteren, bv. `startdatum:asc`."},{"name":"fields","in":"query","schema":{"type":"string"},"description":"Kommagescheiden veldselectie."},{"name":"locale","in":"query","schema":{"type":"string","enum":["nl","en"]},"description":"Taal van vertaalbare content."},{"name":"actief","in":"query","schema":{"type":"boolean"}},{"name":"land","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Lijst","content":{"application/json":{"schema":{"$ref":"#/components/schemas/List"}}}},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/coaches/{id}":{"get":{"tags":["Coaches"],"summary":"Coach-detail","security":[{"ApiKeyAuth":["coaches:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Resource"},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/registrations":{"get":{"tags":["Registrations"],"summary":"Lijst inschrijvingen","security":[{"ApiKeyAuth":["registrations:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":25,"maximum":100},"description":"Aantal resultaten (1-100)."},{"name":"starting_after","in":"query","schema":{"type":"integer"},"description":"Cursor: id waarna verder gepagineerd wordt (nieuw → oud)."},{"name":"ending_before","in":"query","schema":{"type":"integer"},"description":"Cursor: id waarvóór gepagineerd wordt."},{"name":"page","in":"query","schema":{"type":"integer"},"description":"Offset-paginatie (samen met per_page)."},{"name":"per_page","in":"query","schema":{"type":"integer"},"description":"Aantal per pagina bij offset-paginatie."},{"name":"sort","in":"query","schema":{"type":"string"},"description":"Sorteren, bv. `startdatum:asc`."},{"name":"fields","in":"query","schema":{"type":"string"},"description":"Kommagescheiden veldselectie."},{"name":"locale","in":"query","schema":{"type":"string","enum":["nl","en"]},"description":"Taal van vertaalbare content."},{"name":"kamp_id","in":"query","schema":{"type":"integer"}},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"customer_id","in":"query","schema":{"type":"integer"}},{"name":"participant_id","in":"query","schema":{"type":"integer"}},{"name":"email","in":"query","schema":{"type":"string"}},{"name":"created_from","in":"query","schema":{"type":"string"}},{"name":"created_to","in":"query","schema":{"type":"string"}},{"name":"expand","in":"query","schema":{"type":"string"},"description":"participant,customer,camp,payments,intake"}],"responses":{"200":{"description":"Lijst","content":{"application/json":{"schema":{"$ref":"#/components/schemas/List"}}}},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Registrations"],"summary":"Inschrijving aanmaken","security":[{"ApiKeyAuth":["registrations:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistrationCreate"}}}},"responses":{"200":{"description":"Bestaande onbetaalde inschrijving hervat"},"201":{"description":"Aangemaakt"},"409":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/registrations/{id}":{"get":{"tags":["Registrations"],"summary":"Inschrijving-detail","security":[{"ApiKeyAuth":["registrations:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Resource"},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"tags":["Registrations"],"summary":"Inschrijving wijzigen","security":[{"ApiKeyAuth":["registrations:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistrationUpdate"}}}},"responses":{"200":{"description":"Gewijzigd"},"404":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/participants":{"get":{"tags":["Participants"],"summary":"Lijst deelnemers","security":[{"ApiKeyAuth":["participants:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":25,"maximum":100},"description":"Aantal resultaten (1-100)."},{"name":"starting_after","in":"query","schema":{"type":"integer"},"description":"Cursor: id waarna verder gepagineerd wordt (nieuw → oud)."},{"name":"ending_before","in":"query","schema":{"type":"integer"},"description":"Cursor: id waarvóór gepagineerd wordt."},{"name":"page","in":"query","schema":{"type":"integer"},"description":"Offset-paginatie (samen met per_page)."},{"name":"per_page","in":"query","schema":{"type":"integer"},"description":"Aantal per pagina bij offset-paginatie."},{"name":"sort","in":"query","schema":{"type":"string"},"description":"Sorteren, bv. `startdatum:asc`."},{"name":"fields","in":"query","schema":{"type":"string"},"description":"Kommagescheiden veldselectie."},{"name":"locale","in":"query","schema":{"type":"string","enum":["nl","en"]},"description":"Taal van vertaalbare content."},{"name":"customer_id","in":"query","schema":{"type":"integer"}},{"name":"zoek","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Lijst","content":{"application/json":{"schema":{"$ref":"#/components/schemas/List"}}}},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/participants/{id}":{"get":{"tags":["Participants"],"summary":"Deelnemer-detail","security":[{"ApiKeyAuth":["participants:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Resource"},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/customers":{"get":{"tags":["Customers"],"summary":"Lijst klanten","security":[{"ApiKeyAuth":["customers:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":25,"maximum":100},"description":"Aantal resultaten (1-100)."},{"name":"starting_after","in":"query","schema":{"type":"integer"},"description":"Cursor: id waarna verder gepagineerd wordt (nieuw → oud)."},{"name":"ending_before","in":"query","schema":{"type":"integer"},"description":"Cursor: id waarvóór gepagineerd wordt."},{"name":"page","in":"query","schema":{"type":"integer"},"description":"Offset-paginatie (samen met per_page)."},{"name":"per_page","in":"query","schema":{"type":"integer"},"description":"Aantal per pagina bij offset-paginatie."},{"name":"sort","in":"query","schema":{"type":"string"},"description":"Sorteren, bv. `startdatum:asc`."},{"name":"fields","in":"query","schema":{"type":"string"},"description":"Kommagescheiden veldselectie."},{"name":"locale","in":"query","schema":{"type":"string","enum":["nl","en"]},"description":"Taal van vertaalbare content."},{"name":"email","in":"query","schema":{"type":"string"}},{"name":"zoek","in":"query","schema":{"type":"string"}},{"name":"expand","in":"query","schema":{"type":"string"},"description":"participants"}],"responses":{"200":{"description":"Lijst","content":{"application/json":{"schema":{"$ref":"#/components/schemas/List"}}}},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/customers/{id}":{"get":{"tags":["Customers"],"summary":"Klant-detail","security":[{"ApiKeyAuth":["customers:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Resource"},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/payments":{"get":{"tags":["Payments"],"summary":"Lijst betalingen","security":[{"ApiKeyAuth":["payments:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":25,"maximum":100},"description":"Aantal resultaten (1-100)."},{"name":"starting_after","in":"query","schema":{"type":"integer"},"description":"Cursor: id waarna verder gepagineerd wordt (nieuw → oud)."},{"name":"ending_before","in":"query","schema":{"type":"integer"},"description":"Cursor: id waarvóór gepagineerd wordt."},{"name":"page","in":"query","schema":{"type":"integer"},"description":"Offset-paginatie (samen met per_page)."},{"name":"per_page","in":"query","schema":{"type":"integer"},"description":"Aantal per pagina bij offset-paginatie."},{"name":"sort","in":"query","schema":{"type":"string"},"description":"Sorteren, bv. `startdatum:asc`."},{"name":"fields","in":"query","schema":{"type":"string"},"description":"Kommagescheiden veldselectie."},{"name":"locale","in":"query","schema":{"type":"string","enum":["nl","en"]},"description":"Taal van vertaalbare content."},{"name":"registration_id","in":"query","schema":{"type":"integer"}},{"name":"customer_id","in":"query","schema":{"type":"integer"}},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"openstaand","in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Lijst","content":{"application/json":{"schema":{"$ref":"#/components/schemas/List"}}}},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/waitlist":{"get":{"tags":["Waitlist"],"summary":"Lijst wachtlijst","security":[{"ApiKeyAuth":["waitlist:read"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":25,"maximum":100},"description":"Aantal resultaten (1-100)."},{"name":"starting_after","in":"query","schema":{"type":"integer"},"description":"Cursor: id waarna verder gepagineerd wordt (nieuw → oud)."},{"name":"ending_before","in":"query","schema":{"type":"integer"},"description":"Cursor: id waarvóór gepagineerd wordt."},{"name":"page","in":"query","schema":{"type":"integer"},"description":"Offset-paginatie (samen met per_page)."},{"name":"per_page","in":"query","schema":{"type":"integer"},"description":"Aantal per pagina bij offset-paginatie."},{"name":"sort","in":"query","schema":{"type":"string"},"description":"Sorteren, bv. `startdatum:asc`."},{"name":"fields","in":"query","schema":{"type":"string"},"description":"Kommagescheiden veldselectie."},{"name":"locale","in":"query","schema":{"type":"string","enum":["nl","en"]},"description":"Taal van vertaalbare content."},{"name":"discipline","in":"query","schema":{"type":"string"}},{"name":"zoek","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Lijst","content":{"application/json":{"schema":{"$ref":"#/components/schemas/List"}}}},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Waitlist"],"summary":"Wachtlijst-aanmelding toevoegen","security":[{"ApiKeyAuth":["waitlist:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistCreate"}}}},"responses":{"201":{"description":"Aangemaakt"},"422":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/stats":{"get":{"tags":["Stats"],"summary":"Kerncijfers","security":[{"ApiKeyAuth":["stats:read"]}],"responses":{"200":{"description":"Cijfers"},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks":{"get":{"tags":["Webhooks"],"summary":"Lijst webhooks","security":[{"ApiKeyAuth":["webhooks:manage"]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":25,"maximum":100},"description":"Aantal resultaten (1-100)."},{"name":"starting_after","in":"query","schema":{"type":"integer"},"description":"Cursor: id waarna verder gepagineerd wordt (nieuw → oud)."},{"name":"ending_before","in":"query","schema":{"type":"integer"},"description":"Cursor: id waarvóór gepagineerd wordt."},{"name":"page","in":"query","schema":{"type":"integer"},"description":"Offset-paginatie (samen met per_page)."},{"name":"per_page","in":"query","schema":{"type":"integer"},"description":"Aantal per pagina bij offset-paginatie."},{"name":"sort","in":"query","schema":{"type":"string"},"description":"Sorteren, bv. `startdatum:asc`."},{"name":"fields","in":"query","schema":{"type":"string"},"description":"Kommagescheiden veldselectie."},{"name":"locale","in":"query","schema":{"type":"string","enum":["nl","en"]},"description":"Taal van vertaalbare content."}],"responses":{"200":{"description":"Lijst","content":{"application/json":{"schema":{"$ref":"#/components/schemas/List"}}}},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["Webhooks"],"summary":"Webhook aanmaken","security":[{"ApiKeyAuth":["webhooks:manage"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreate"}}}},"responses":{"201":{"description":"Aangemaakt (bevat eenmalig `secret`)"},"422":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks/{id}":{"get":{"tags":["Webhooks"],"summary":"Webhook-detail","security":[{"ApiKeyAuth":["webhooks:manage"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Resource"},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"tags":["Webhooks"],"summary":"Webhook verwijderen","security":[{"ApiKeyAuth":["webhooks:manage"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Resource"},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks/{id}/test":{"post":{"tags":["Webhooks"],"summary":"Testlevering versturen","security":[{"ApiKeyAuth":["webhooks:manage"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Verzonden"},"404":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks/{id}/deliveries":{"get":{"tags":["Webhooks"],"summary":"Afleverhistorie","security":[{"ApiKeyAuth":["webhooks:manage"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Resource"},"401":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Foutrespons","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","description":"API-sleutel als Bearer-token: `Authorization: Bearer ze_live_…`. Alternatief: header `X-API-Key`. Scopes: camps:read, coaches:read, registrations:read, registrations:write, participants:read, customers:read, payments:read, waitlist:read, waitlist:write, stats:read, webhooks:manage."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"type":{"type":"string","enum":["authentication_error","permission_error","invalid_request_error","not_found","rate_limit_error","idempotency_error","api_error"]},"code":{"type":"string"},"message":{"type":"string"},"param":{"type":"string"},"doc_url":{"type":"string"},"request_id":{"type":"string"}},"required":["type","code","message"]}}},"List":{"type":"object","properties":{"object":{"type":"string","enum":["list"]},"url":{"type":"string"},"has_more":{"type":"boolean"},"data":{"type":"array","items":{"type":"object"}},"pagination":{"type":"object","properties":{"limit":{"type":"integer"},"next_cursor":{"type":["integer","null"]},"total":{"type":"integer"}}}}},"RegistrationCreate":{"type":"object","description":"Referentie-modus (customer_id + participant_id) óf create-modus (customer{} + participant{}).","properties":{"camp_id":{"type":"integer"},"customer_id":{"type":"integer"},"participant_id":{"type":"integer"},"customer":{"type":"object","properties":{"email":{"type":"string"},"voornaam":{"type":"string"},"achternaam":{"type":"string"},"telefoon":{"type":"string"},"straat":{"type":"string"},"huisnummer":{"type":"string"},"postcode":{"type":"string"},"stad":{"type":"string"},"land":{"type":"string"}}},"participant":{"type":"object","properties":{"voornaam":{"type":"string"},"achternaam":{"type":"string"},"geboortedatum":{"type":"string","format":"date"},"geslacht":{"type":"string","enum":["jongen","meisje"]},"vereniging":{"type":"string"}}},"betaal_optie":{"type":"string","enum":["volledig","termijnen"]},"status":{"type":"string","enum":["pre_inschrijving","wachtlijst"]},"taal":{"type":"string","enum":["nl","en"]},"gekozen_startdatum":{"type":"string","format":"date"}},"required":["camp_id"]},"RegistrationUpdate":{"type":"object","properties":{"status":{"type":"string"},"admin_notitie":{"type":"string"},"ingecheckt":{"type":"boolean"}}},"WaitlistCreate":{"type":"object","properties":{"email":{"type":"string"},"voornaam":{"type":"string"},"achternaam":{"type":"string"},"telefoon":{"type":"string"},"discipline":{"type":"string"},"leeftijd_kind":{"type":"string"},"niveau":{"type":"string"},"bericht":{"type":"string"}},"required":["email","voornaam","discipline"]},"WebhookCreate":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["registration.created","registration.updated","registration.status_changed","registration.cancelled","payment.paid","payment.failed","payment.refunded","camp.published","camp.updated","camp.full","waitlist.created","*"]}},"beschrijving":{"type":"string"},"brand":{"type":"string","enum":["zwemexpert","expertswimcamp","all"]}},"required":["url","events"]}}}}