Luwio Publieke API voor Lokaal Loket Kinderopvang integratie

Gemaakt door Team Luwio, Gewijzigd op Do, 8 Okt om 3:12 PM op Team Luwio

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: als grant_type niet client_credentials is.
  • 400 invalid_request: ontbrekende/ongeldige client_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 /requests

Query-parameters (optioneel):

ParamTypeBetekenis
Fromdatetimeenkel aanvragen gewijzigd na deze datum (inclusief)
Untilldatetimeenkel aanvragen gewijzigd voor deze datum (exclusief)
Limitintpaginagrootte (standaard 100, geen bovengrens)
Offsetintrij-offset voor paginering
GroupIdguidfilter 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:

StatusBetekenis
newstopt verwerking, zet terug naar nieuw (enkel geldig als aanvraag in verwerking staat)
no_spotgeen plaats, annuleert de aanvraag automatisch
receiveaanvraag in behandeling nemen (enkel geldig vanuit status "nieuw")
accepthet aanbod (proposition) wordt in optie gezet
refusehet aanbod wordt geweigerd, annuleert de aanvraag automatisch
approvede 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/json

Body:

{
    "propositionSchedules": [
        {
            "startDate": "2026-09-01",
            "endDate": "2026-09-14",
            "days": [
                { "day": 1, "early": false, "morning": true, "afternoon": true, "late": false }
            ]
        }
    ]
}
  • days moet exact 14 dagen bevatten (2 weken), elke day tussen 1 en 14.
  • endDate moet ≥ startDate zijn.


Rechten vereist: ApplicationsEdit.


3.4 Aanvraag annuleren

POST /requests/{applicationForLocationId}/transition/cancel
Content-Type: application/json

Body:

{
    "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/json

Body:

{
    "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)

VeldTypeBetekenis
uuidguidId van de aanvraag bij deze opvanglocatie. Bij geïmporteerde aanvragen is dit het extern request-id uit de import.
groupIdguidId 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.
luwioNumberstringReferentienummer van de aanvraag bij deze opvanglocatie in Luwio.
luwioGroupNumberstringReferentienummer van de volledige aanvraag in Luwio.
starteddatetime (UTC)Moment waarop de aanvraag bij deze opvanglocatie aangemaakt is.
statestringStatus in KOZ-termen (zie 5.6).
luwioStatestringGedetailleerde status zoals in Luwio (zie 5.6).
cancellationReasonstring | nullReden van annulering, enkel bij een geannuleerde aanvraag (zie 5.7).
commentstringExtra opmerking van de ouder.
specificNeedsboolHet kind heeft een specifieke zorgbehoefte.
specificNeedsCommentstring | nullToelichting bij de zorgbehoefte.
urgentboolDe ouder gaf aan dat de aanvraag dringend is.
urgentCommentstring | nullToelichting bij de dringendheid.
calculatedSubsidyTypestringDoor Luwio berekend subsidietype: trap2, trap3 of leeg ("").
subsidyTypeslijstVoorrangscriteria waaraan het gezin voldoet, elk met group en hasSubsidyType (altijd true). Enkel criteria die van toepassing zijn staan in de lijst (zie 5.8).
contactslijstExtra contactpersonen van de ouder: firstName, lastName, email, phoneNumber.
monitorobject | nullDe toeleider die de aanvraag voor het gezin indiende: firstName, lastName, email, phone, organization. null als de ouder zelf aanvroeg.
monitorContactEmailstring | nullE-mailadres van de contactpersoon bij de toeleider, als opgegeven.
childcareobjectDe opvanglocatie: uuid (Luwio-id), name, establishmentNumber.
childobjectKind en ouder (zie 5.2).
scheduleobjectHet 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.
luwioScheduleobjectAltijd het schema dat de ouder oorspronkelijk vroeg (zie 5.3).
luwioPropositionobject | nullHet aanbod van de opvang, als er een is. Bevat schedules: periodes met elk startDate, endDate en days (zie 5.3).
linkedGroupslijstGekoppelde aanvragen: meerling of broer/zus (zie 5.4). Leeg als er geen zijn.

5.2 Kind en ouder (child, child.parent)

VeldTypeBetekenis
child.uuidguidLuwio-id van de aanvraag van het kind.
child.firstName, child.lastNamestringNaam van het kind. Leeg als het kind nog niet geboren is.
child.birthdaydate(Verwachte) geboortedatum.
child.childRelationTypestringRelatie van de aanvrager tot het kind: parent, foster_parent, guardian, other.
child.fosterChildboolHet kind is een pleegkind.
child.siblingobject | nullBroer 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.uuidguidLuwio-id van de aanvrager.
parent.firstName, parent.lastNamestringNaam van de aanvrager.
parent.birthdaydate | nullGeboortedatum, als gekend.
parent.sexstring | nullM, F of null.
parent.phone, parent.emailstringContactgegevens. phone kan null zijn.
parent.luwioRrnstring | nullRijksregisternummer, als gekend.
parent.notificationTypestringAltijd email.
parent.addressobjectstreet, streetNumber, boxNumber, city, postcode, country (landcode, bv. BE).

5.3 Schema (schedule, luwioSchedule, luwioProposition)

VeldTypeBetekenis
startDate, endDatedateStart- en einddatum van de opvang.
flexibleboolDe ouder is flexibel: het aantal dagen telt, de exacte dagen zijn een voorkeur.
requestedNbOfDaysWeek1, requestedNbOfDaysWeek2decimaalAantal dagen in week 1 en week 2. Een halve dag telt als 0,5.
dayslijstDagen 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.

VeldTypeBetekenis
groupIdguidgroupId van de gekoppelde aanvraag. Gebruik als query-filter GroupId om die aanvraag op te halen.
typestringmultiples = meerling, sibling = broer/zus.

5.5 Paginatie (page)

VeldTypeBetekenis
currentintHuidige pagina (begint bij 1).
pageSizeintRequests per pagina (Limit, standaard 100).
rowOffsetintAantal overgeslagen requests (Offset).
totalintTotaal aantal pagina's.
totalRowCountintTotaal aantal requests.

5.6 Statussen (state, luwioState)

luwioStatestateBetekenis
newNewNieuwe aanvraag, nog niet behandeld.
in_progressPendingIn behandeling bij de opvang.
in_progress_with_propositionPendingDe opvang deed een aanbod, de ouder moet nog antwoorden.
proposition_in_optionPendingHet aanbod staat in optie.
proposition_declinedRefusedHet aanbod is geweigerd.
contract_signedApprovedPlaats definitief toegekend.
no_spotCancelled By KDVGeen plaats beschikbaar.
no_answerCancelled By KDVGeannuleerd omdat de ouder niet antwoordde.
cancelled_by_daycareCancelled By KDVGeannuleerd door de opvang.
cancelled_by_requestorCancelled By RequestorGeannuleerd door de ouder.
cancelled_by_systemCancelled By KozaAutomatisch geannuleerd door Luwio.

5.7 Annuleringsredenen (cancellationReason)

Dezelfde waarden gelden voor reason bij annuleren (3.4).

WaardeBetekenis
miscarriageMiskraam.
duplicate_applicationDubbele aanvraag.
school_age_reachedHet kind heeft de schoolleeftijd bereikt.
movedDe ouder is verhuisd.
spot_elsewherePlaats gevonden bij een andere opvang.
insufficientHet aanbod voldoet niet aan de noden van de ouder.
no_answerDe ouder antwoordde niet.
no_spotGeen plaats beschikbaar.
no_spot_end_dateGewenste startdatum verstreken zonder plaats (automatisch).
financialFinanciële reden (betalingen).
financials_changedFinanciële situatie van de ouder is gewijzigd.
needs_changedNoden (schema) van de ouder zijn gewijzigd.
location_changedDe ouder koos een andere opvanglocatie.
other_reasonAndere reden.

5.8 Voorrangscriteria (subsidyTypes.group)

WaardeBetekenis
workAndOrEducationAanvrager werkt, studeert of volgt een traject naar werk.
partnerWorkAndOrEducationPartner werkt, studeert of volgt een traject naar werk.
lowIncomeLaag gezinsinkomen.
lowEducationLevelGeen diploma secundair onderwijs.
familyMemberWithHandicapGezinslid met een handicap.
familyMemberWithLowSelfcareGezinslid met verminderde zelfredzaamheid.
familyMemberWithSocialIssueGezinslid met sociale of pedagogische ondersteuning.
siblingsBroer of zus gaat al naar de opvang.
fosterChildrenPleegkind.
singleAlleenstaande ouder.
otherAnder 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

Laat ons weten hoe we dit artikel kunnen verbeteren!

Selecteer tenminste een van de redenen
CAPTCHA-verificatie is vereist.

Feedback verzonden

We stellen uw moeite op prijs en zullen proberen het artikel te verbeteren