API
Alles is JSON over HTTPS. Datums zijn JJJJ-MM-DD, tijden vrije tekst zoals 08:00-18:00. Er is geen versiebeheer buiten /v1; wat hier staat blijft werken.
Twee sleutels
Als freelancer gebruik je je API-sleutel uit Instellingen → API, als Authorization: Bearer cp_…. Daarmee zie je je hele agenda en kun je opties bevestigen of afwijzen.
Als opdrachtgever gebruik je het token uit de link die je van de freelancer kreeg: https://crewplanning.pages.dev/k/<token> wordt https://crewplanning.pages.dev/api/v1/k/<token>/…. Je ziet precies wat je op die pagina ook ziet, niet meer.
Opdrachtgever
GET /api/v1/k/:token/agenda?van=&tot=
Per dag een kleur: vrij, optie (jouw optie), bevestigd (voor jou), deels (een deel van de dag is bezet, met bezet_tijden), bezet, verleden. Zonder van/tot: vandaag tot 60 dagen vooruit.
curl "https://crewplanning.pages.dev/api/v1/k/<token>/agenda?van=2026-11-10&tot=2026-11-16"
{ "freelancer": { "naam": "Sam de Vries" }, "klant": { "naam": "Rotterdam Ahoy", "planner": null },
"dagen": [
{ "datum": "2026-11-10", "kleur": "bezet", "eigen": [], "bezet_tijden": [] },
{ "datum": "2026-11-11", "kleur": "deels", "eigen": [], "bezet_tijden": ["14:00-23:00"] },
{ "datum": "2026-11-12", "kleur": "optie", "eigen": [ { "id": 81, "status": "optie", … } ], "bezet_tijden": [] },
{ "datum": "2026-11-13", "kleur": "vrij", "eigen": [], "bezet_tijden": [] } ] }
POST /api/v1/k/:token/opties
Optie leggen. Alleen van is verplicht. Overlapt het met een bevestigde dienst, dan krijg je 409 met de reden. De freelancer krijgt bericht.
curl -X POST https://crewplanning.pages.dev/api/v1/k/<token>/opties -H "Content-Type: application/json" \
-d '{ "van": "2026-11-13", "tot": "2026-11-13", "tijden": "08:00-18:00", "locatie": "Ahoy, Rotterdam",
"contact": "Piet Bakker 010-2933300", "parkeren": "P Zuid", "info": "Call 07:45 bij expeditie",
"link": "https://…/callsheet.pdf", "uiterlijk": "2026-11-08" }'
201 { "aanvraag": { "id": 82, "status": "optie", "van": "2026-11-13", "tot": "2026-11-13", "vervalt_op": "2026-11-08", … } }
GET /api/v1/k/:token/opties · GET …/opties/:id · DELETE …/opties/:id
Je eigen aanvragen, de status van één aanvraag, of een optie intrekken. Statussen: optie, bevestigd, afgewezen, vervallen, geannuleerd.
Freelancer
GET /api/v1/agenda?van=&tot=
Alles in je agenda: diensten, opties en blokkades, per dag, met kleur vrij, optie, deels, bezet of verleden.
curl https://crewplanning.pages.dev/api/v1/agenda?van=2026-11-10&tot=2026-11-16 -H "Authorization: Bearer cp_…"
GET /api/v1/opties
Alle openstaande opties, oudste datum eerst.
POST /api/v1/opties/:id/bevestig · …/afwijs · …/annuleer
Zelfde regels als in de agenda: bevestigen kan niet bij een harde overlap (409), annuleren alleen bij een bevestigde dienst. Body optioneel: { "reden": "…" }. Beide kanten krijgen bericht.
curl -X POST https://crewplanning.pages.dev/api/v1/opties/82/bevestig -H "Authorization: Bearer cp_…"
Webhook
Zet in Instellingen → API een URL, en bij elke statuswissel krijg je één POST met JSON. Header X-Crewplanning-Event bevat de gebeurtenis: optie_ingediend, bevestigd, afgewezen, vervallen, geannuleerd, ingetrokken, gewijzigd. Antwoord met 2xx. Mislukt de aflevering, dan zie je dat onder Berichten; er wordt niet opnieuw geprobeerd.
{ "gebeurtenis": "bevestigd", "tijdstip": "2026-11-05T09:12:44.000Z",
"aanvraag": { "id": 82, "status": "bevestigd", "klant": { "id": 3, "naam": "Rotterdam Ahoy" }, "planner": "Piet Bakker",
"van": "2026-11-13", "tot": "2026-11-13", "tijden": "08:00-18:00", "locatie": "Ahoy, Rotterdam", … } }
Agenda-feeds
Geen API nodig: elke agenda heeft een iCal-adres voor Google Agenda, Outlook en Apple Agenda. Jij vindt het onder je agenda, elke opdrachtgever op zijn eigen pagina.
Grenzen
- Een periode is maximaal een jaar. Een aanvraag beslaat maximaal 31 dagen.
- Houd het netjes: een aanroep per seconde per sleutel is ruim voldoende. Er is nu geen limiet, wel een log.
- Vragen of iets missen? planning@crewplanning.nl.