Deze API laat externe kinderopvang-software (bv. Deona, Ferm/KOALA, KoningApestaart) aanvragen uit het Lokaal Loket Kinderopvang van Luwio ophalen en erop reageren (aanbod doen, status wijzigen, annuleren, berichten sturen).
1. Authenticatie (OAuth2 Client Credentials)
Elke partij krijgt een client_id (GUID) en client_secret. Daarmee vraagt men een toegangstoken op.
POST /api/public/v1/token Content-Type: application/x-www-form-urlencoded
Optie A, via Basic-auth header:
Authorization: Basic base64(client_id:client_secret)
met body:
grant_type=client_credentials
Optie B, alles in de form-body:
grant_type=client_credentials&client_id={client_id}&client_secret={client_secret}Response (200):
{
"access_token": "<jwt>",
"token_type": "Bearer",
"expires_in": 3600
}Gebruik dit token op elke volgende call:
Authorization: Bearer <jwt>
Foutresponses:
400 unsupported_grant_type: alsgrant_typenietclient_credentialsis.400 invalid_request: ontbrekende/ongeldigeclient_id/client_secret.401: client_id onbekend of secret klopt niet.
2. Autorisatie & toegang
Een client_id/secret is altijd gekoppeld aan één tenant, en krijgt per key een vastgelegde toegang tot specifieke locaties (en/of organisaties). Enkel aanvragen van de locaties waartoe de key toegang heeft, komen terug in de resultaten. Dit wordt serverside afgedwongen, niet clientside gefilterd.
3. Endpoints
Alle routes hieronder starten met /api/public/integrations/koz-oapi/v1.
3.1 Aanvragen ophalen
GET /requests/{establishmentNumber}
GET /requestsQuery-parameters (optioneel):
| Param | Type | Betekenis |
|---|---|---|
| From | datetime | enkel aanvragen gewijzigd na deze datum (inclusief) |
| Untill | datetime | enkel aanvragen gewijzigd voor deze datum (exclusief) |
| Limit | int | paginagrootte (standaard 100, geen bovengrens) |
| Offset | int | rij-offset voor paginering |
| GroupId | guid | filter op een specifieke aanvraaggroep (extern group-id of Luwio application-id) |
Mogelijke waarden voor moments: vroeg, voormiddag, namiddag, avond.
Response (200): een lijst request met aanvragen en paginatie-info page. Eén request is één aanvraag van één kind bij één opvanglocatie. Kiest een ouder voor één kind drie locaties, dan zijn dat drie requests met dezelfde groupId. Requests zijn gesorteerd van nieuw naar oud. Alle velden en mogelijke waarden staan in sectie 5.
{
"request": [
{
"uuid": "3f2c…",
"groupId": "9a1b…",
"luwioNumber": "000.123.1",
"luwioGroupNumber": "000.123",
"started": "2026-03-01T09:15:00.000Z",
"state": "Pending",
"cancellationReason": null,
"comment": "…",
"specificNeeds": false,
"specificNeedsComment": null,
"urgent": false,
"urgentComment": null,
"calculatedSubsidyType": "trap2",
"monitorContactEmail": null,
"contacts": [ { "firstName": "…", "lastName": "…", "email": "…", "phoneNumber": "…" } ],
"subsidyTypes": [ { "group": "workAndOrEducation", "hasSubsidyType": true } ],
"schedule": {
"startDate": "2026-09-01",
"endDate": "2029-09-01",
"flexible": false,
"requestedNbOfDaysWeek1": 3,
"requestedNbOfDaysWeek2": 3,
"days": [ { "day": 1, "moments": ["voormiddag", "namiddag"] } ]
},
"monitor": null,
"childcare": { "uuid": "…", "name": "…", "establishmentNumber": "12345" },
"child": {
"uuid": "9a1b…",
"firstName": "…",
"lastName": "…",
"birthday": "2026-05-12",
"childRelationType": "parent",
"fosterChild": false,
"sibling": null,
"parent": {
"uuid": "…", "firstName": "…", "lastName": "…", "birthday": "1990-01-01",
"sex": "F", "phone": "…", "email": "…", "luwioRrn": "…", "notificationType": "email",
"address": { "street": "…", "streetNumber": "1", "boxNumber": null, "city": "…", "postcode": "2000", "country": "BE" }
}
},
"luwioState": "in_progress",
"luwioProposition": null,
"luwioSchedule": { … },
"linkedGroups": [ { "groupId": "7c4d…", "type": "multiples" } ]
}
],
"page": { "current": 1, "pageSize": 100, "rowOffset": 0, "total": 1, "totalRowCount": 1 }
}Rechten vereist: ApplicationsView.
3.2 Status wijzigen
POST /requests/{applicationForLocationId}/transition/{status}{status} moet één van volgende waarden zijn:
| Status | Betekenis |
|---|---|
| new | stopt verwerking, zet terug naar nieuw (enkel geldig als aanvraag in verwerking staat) |
| no_spot | geen plaats, annuleert de aanvraag automatisch |
| receive | aanvraag in behandeling nemen (enkel geldig vanuit status "nieuw") |
| accept | het aanbod (proposition) wordt in optie gezet |
| refuse | het aanbod wordt geweigerd, annuleert de aanvraag automatisch |
| approve | de plaats wordt definitief gereserveerd |
Idempotentie: receive is idempotent. Als de aanvraag al in status InProgress staat (dus al ontvangen was), geeft dit gewoon 200 OK terug als no-op, zonder de verwerking of automatische berichten opnieuw te starten. Dit vangt retries/races vanuit de integratiepartij op zonder dat die een 400 te zien krijgt voor iets dat al gelukt was.
Response: 200 OK (leeg), 400 bij validatie/business-fout, 404 als de aanvraag niet bestaat.
Rechten vereist: ApplicationsEdit.
3.3 Aanbod (proposition) doorgeven
POST /requests/{applicationForLocationId}/transition/proposition
Content-Type: application/jsonBody:
{
"propositionSchedules": [
{
"startDate": "2026-09-01",
"endDate": "2026-09-14",
"days": [
{ "day": 1, "early": false, "morning": true, "afternoon": true, "late": false }
]
}
]
}daysmoet exact 14 dagen bevatten (2 weken), elkedaytussen 1 en 14.endDatemoet ≥startDatezijn.
Rechten vereist: ApplicationsEdit.
3.4 Aanvraag annuleren
POST /requests/{applicationForLocationId}/transition/cancel
Content-Type: application/jsonBody:
{
"cancelledBy": "daycare",
"reason": "no_spot"
}cancelledBy: requestor, daycare, monitor, system.reason: miscarriage, duplicate_application, school_age_reached, moved, spot_elsewhere, insufficient, no_answer, no_spot, no_spot_end_date, financial, financials_changed, needs_changed, location_changed, other_reason. Betekenis per reden: zie 5.7.
Rechten vereist: ApplicationsEdit.
3.5 Bericht toevoegen aan een aanvraag
POST /requests/{applicationForLocationId}/message
Content-Type: application/jsonBody:
{
"message": "Vrije tekst van het bericht",
"sender": "requestor"
}sender: daycare, requestor (de aanvragende ouder), of monitor.
Rechten vereist: ApplicationsEdit.
4. Algemene foutresponse
Bij 400/401/404 komt telkens een foutmelding terug met validatie- of business-foutdetails.
5. Velden van een aanvraag
Betekenis van alle velden die GET /requests teruggeeft (zie 3.1).
5.1 Aanvraag (request)
| Veld | Type | Betekenis |
|---|---|---|
| uuid | guid | Id van de aanvraag bij deze opvanglocatie. Bij geïmporteerde aanvragen is dit het extern request-id uit de import. |
| groupId | guid | Id van de volledige aanvraag van het kind, gedeeld door alle opvanglocaties van die aanvraag. Bij geïmporteerde aanvragen is dit het extern group-id. Bruikbaar als query-filter GroupId. |
| luwioNumber | string | Referentienummer van de aanvraag bij deze opvanglocatie in Luwio. |
| luwioGroupNumber | string | Referentienummer van de volledige aanvraag in Luwio. |
| started | datetime (UTC) | Moment waarop de aanvraag bij deze opvanglocatie aangemaakt is. |
| state | string | Status in KOZ-termen (zie 5.6). |
| luwioState | string | Gedetailleerde status zoals in Luwio (zie 5.6). |
| cancellationReason | string | null | Reden van annulering, enkel bij een geannuleerde aanvraag (zie 5.7). |
| comment | string | Extra opmerking van de ouder. |
| specificNeeds | bool | Het kind heeft een specifieke zorgbehoefte. |
| specificNeedsComment | string | null | Toelichting bij de zorgbehoefte. |
| urgent | bool | De ouder gaf aan dat de aanvraag dringend is. |
| urgentComment | string | null | Toelichting bij de dringendheid. |
| calculatedSubsidyType | string | Door Luwio berekend subsidietype: trap2, trap3 of leeg (""). |
| subsidyTypes | lijst | Voorrangscriteria waaraan het gezin voldoet, elk met group en hasSubsidyType (altijd true). Enkel criteria die van toepassing zijn staan in de lijst (zie 5.8). |
| contacts | lijst | Extra contactpersonen van de ouder: firstName, lastName, email, phoneNumber. |
| monitor | object | null | De toeleider die de aanvraag voor het gezin indiende: firstName, lastName, email, phone, organization. null als de ouder zelf aanvroeg. |
| monitorContactEmail | string | null | E-mailadres van de contactpersoon bij de toeleider, als opgegeven. |
| childcare | object | De opvanglocatie: uuid (Luwio-id), name, establishmentNumber. |
| child | object | Kind en ouder (zie 5.2). |
| schedule | object | Het geldende opvangschema (zie 5.3). Zolang er geen contract is: het schema dat de ouder vroeg. Bij Approved: het eerste schema uit het aanvaarde aanbod. |
| luwioSchedule | object | Altijd het schema dat de ouder oorspronkelijk vroeg (zie 5.3). |
| luwioProposition | object | null | Het aanbod van de opvang, als er een is. Bevat schedules: periodes met elk startDate, endDate en days (zie 5.3). |
| linkedGroups | lijst | Gekoppelde aanvragen: meerling of broer/zus (zie 5.4). Leeg als er geen zijn. |
5.2 Kind en ouder (child, child.parent)
| Veld | Type | Betekenis |
|---|---|---|
| child.uuid | guid | Luwio-id van de aanvraag van het kind. |
| child.firstName, child.lastName | string | Naam van het kind. Leeg als het kind nog niet geboren is. |
| child.birthday | date | (Verwachte) geboortedatum. |
| child.childRelationType | string | Relatie van de aanvrager tot het kind: parent, foster_parent, guardian, other. |
| child.fosterChild | bool | Het kind is een pleegkind. |
| child.sibling | object | null | Broer of zus die al naar een opvang gaat (voorrangscriterium): firstName, lastName, birthday, childcare (als gekend in Luwio). Aanvragen die samen ingediend zijn staan in linkedGroups. |
| parent.uuid | guid | Luwio-id van de aanvrager. |
| parent.firstName, parent.lastName | string | Naam van de aanvrager. |
| parent.birthday | date | null | Geboortedatum, als gekend. |
| parent.sex | string | null | M, F of null. |
| parent.phone, parent.email | string | Contactgegevens. phone kan null zijn. |
| parent.luwioRrn | string | null | Rijksregisternummer, als gekend. |
| parent.notificationType | string | Altijd email. |
| parent.address | object | street, streetNumber, boxNumber, city, postcode, country (landcode, bv. BE). |
5.3 Schema (schedule, luwioSchedule, luwioProposition)
| Veld | Type | Betekenis |
|---|---|---|
| startDate, endDate | date | Start- en einddatum van de opvang. |
| flexible | bool | De ouder is flexibel: het aantal dagen telt, de exacte dagen zijn een voorkeur. |
| requestedNbOfDaysWeek1, requestedNbOfDaysWeek2 | decimaal | Aantal dagen in week 1 en week 2. Een halve dag telt als 0,5. |
| days | lijst | Dagen over een cyclus van twee weken. day: 1 = maandag week 1 … 7 = zondag week 1, 8 = maandag week 2 … 14 = zondag week 2. moments: vroeg, voormiddag, namiddag, avond. Kan leeg zijn als de ouder enkel een aantal dagen opgaf. |
5.4 Gekoppelde aanvragen (linkedGroups)
Voor een meerling, of voor broers en zussen die samen opvang zoeken, maakt Luwio één aanvraag per kind en koppelt die aan elkaar.
| Veld | Type | Betekenis |
|---|---|---|
| groupId | guid | groupId van de gekoppelde aanvraag. Gebruik als query-filter GroupId om die aanvraag op te halen. |
| type | string | multiples = meerling, sibling = broer/zus. |
5.5 Paginatie (page)
| Veld | Type | Betekenis |
|---|---|---|
| current | int | Huidige pagina (begint bij 1). |
| pageSize | int | Requests per pagina (Limit, standaard 100). |
| rowOffset | int | Aantal overgeslagen requests (Offset). |
| total | int | Totaal aantal pagina's. |
| totalRowCount | int | Totaal aantal requests. |
5.6 Statussen (state, luwioState)
| luwioState | state | Betekenis |
|---|---|---|
| new | New | Nieuwe aanvraag, nog niet behandeld. |
| in_progress | Pending | In behandeling bij de opvang. |
| in_progress_with_proposition | Pending | De opvang deed een aanbod, de ouder moet nog antwoorden. |
| proposition_in_option | Pending | Het aanbod staat in optie. |
| proposition_declined | Refused | Het aanbod is geweigerd. |
| contract_signed | Approved | Plaats definitief toegekend. |
| no_spot | Cancelled By KDV | Geen plaats beschikbaar. |
| no_answer | Cancelled By KDV | Geannuleerd omdat de ouder niet antwoordde. |
| cancelled_by_daycare | Cancelled By KDV | Geannuleerd door de opvang. |
| cancelled_by_requestor | Cancelled By Requestor | Geannuleerd door de ouder. |
| cancelled_by_system | Cancelled By Koza | Automatisch geannuleerd door Luwio. |
5.7 Annuleringsredenen (cancellationReason)
Dezelfde waarden gelden voor reason bij annuleren (3.4).
| Waarde | Betekenis |
|---|---|
| miscarriage | Miskraam. |
| duplicate_application | Dubbele aanvraag. |
| school_age_reached | Het kind heeft de schoolleeftijd bereikt. |
| moved | De ouder is verhuisd. |
| spot_elsewhere | Plaats gevonden bij een andere opvang. |
| insufficient | Het aanbod voldoet niet aan de noden van de ouder. |
| no_answer | De ouder antwoordde niet. |
| no_spot | Geen plaats beschikbaar. |
| no_spot_end_date | Gewenste startdatum verstreken zonder plaats (automatisch). |
| financial | Financiële reden (betalingen). |
| financials_changed | Financiële situatie van de ouder is gewijzigd. |
| needs_changed | Noden (schema) van de ouder zijn gewijzigd. |
| location_changed | De ouder koos een andere opvanglocatie. |
| other_reason | Andere reden. |
5.8 Voorrangscriteria (subsidyTypes.group)
| Waarde | Betekenis |
|---|---|
| workAndOrEducation | Aanvrager werkt, studeert of volgt een traject naar werk. |
| partnerWorkAndOrEducation | Partner werkt, studeert of volgt een traject naar werk. |
| lowIncome | Laag gezinsinkomen. |
| lowEducationLevel | Geen diploma secundair onderwijs. |
| familyMemberWithHandicap | Gezinslid met een handicap. |
| familyMemberWithLowSelfcare | Gezinslid met verminderde zelfredzaamheid. |
| familyMemberWithSocialIssue | Gezinslid met sociale of pedagogische ondersteuning. |
| siblings | Broer of zus gaat al naar de opvang. |
| fosterChildren | Pleegkind. |
| single | Alleenstaande ouder. |
| other | Ander criterium. |
Was dit artikel nuttig?
Dat is fantastisch!
Hartelijk dank voor uw beoordeling
Sorry dat we u niet konden helpen
Hartelijk dank voor uw beoordeling
Feedback verzonden
We stellen uw moeite op prijs en zullen proberen het artikel te verbeteren