{"openapi":"3.1.0","info":{"title":"Mederi Integration API","version":"0.2.0","summary":"Canonieke integratielaag tussen Mederi en externe systemen.","description":"M.I.A. is de enige integratiegrens rond de Mederi-gegevens.\n\n**Mederi is master.** M.I.A. leest de bronsystemen read-only en geeft\neen canoniek contract terug; legacy tabel- en kolomnamen komen er nooit in voor.\n\n**Webhooks zijn notificaties, geen datalevering.** Een webhook zegt dat een\nobject gewijzigd is; de actuele toestand haal je op bij het endpoint.\n\nAPI-semver blijft `v1`; `info.version` is de versie van deze installatie.","contact":{"name":"Mederi","url":"https://mia.e-mederi.be"}},"servers":[{"url":"https://mia.e-mederi.be","description":"Production"},{"url":"https://sandbox.mia.e-mederi.be","description":"Sandbox"}],"tags":[{"name":"Platform","description":"Health en versie. Publiek, geen token nodig."},{"name":"Authenticatie","description":"OAuth2 client credentials."},{"name":"Practices","description":"Canonieke praktijken."},{"name":"Vacancies","description":"Canonieke vacatures."},{"name":"Metadata","description":"Betekenis van de velden en referentielijsten. Read-only."},{"name":"Candidates","description":"Candidate-identiteiten, zonder persoonsgegevens."},{"name":"Applications","description":"Sollicitaties."},{"name":"Recruitment cases","description":"Technisch identity/link-register."},{"name":"Webhooks","description":"Eigen subscriptions en leveringen."},{"name":"Salesforce mirror","description":"Salesforce schrijft naar M.I.A. Eigen scope, eigen client."}],"security":[{"oauth2ClientCredentials":[]}],"paths":{"/health":{"get":{"operationId":"systemHealth","tags":["Platform"],"summary":"Health check","description":"Publiek. Bevat bewust geen databasedetails.","parameters":[],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"service":"Mederi Integration API","status":"ok","version":"0.2.0"}}}}},"security":[]}},"/version":{"get":{"operationId":"systemVersion","tags":["Platform"],"summary":"Versie-informatie","description":"Publiek. API-versie, build en omgeving.","parameters":[],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"api_version":"v1","build":"0.2.0","php":"8.3","environment":"production"},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[]}},"/v1/health":{"get":{"operationId":"systemHealthV1","tags":["Platform"],"summary":"Health check","description":"Publiek. Bevat bewust geen databasedetails.","parameters":[],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"service":"Mederi Integration API","status":"ok","version":"0.2.0"}}}}},"security":[]}},"/v1/version":{"get":{"operationId":"systemVersionV1","tags":["Platform"],"summary":"Versie-informatie","description":"Publiek. API-versie, build en omgeving.","parameters":[],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"api_version":"v1","build":"0.2.0","php":"8.3","environment":"production"},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[]}},"/oauth/token":{"post":{"operationId":"oAuthToken","tags":["Authenticatie"],"summary":"Access token opvragen","description":"OAuth2 client credentials. Volgt RFC 6749 en NIET de M.I.A.-envelope.","parameters":[],"responses":{"200":{"description":"Access token.","headers":{"Cache-Control":{"schema":{"type":"string"},"description":"no-store"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"},"example":{"access_token":"mia_EXAMPLE-TOKEN-NIET-ECHT","token_type":"Bearer","expires_in":3600,"scope":"vacancies:read practices:read"}}}},"400":{"description":"invalid_request, invalid_scope of unsupported_grant_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"},"example":{"error":"invalid_client","error_description":"Clientauthenticatie is mislukt."}}}},"401":{"description":"invalid_client: onbekende client of verkeerd secret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"},"example":{"error":"invalid_client","error_description":"Clientauthenticatie is mislukt."}}}}},"security":[],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["grant_type"],"properties":{"grant_type":{"type":"string","const":"client_credentials"},"scope":{"type":"string","description":"Spatiegescheiden. Leeg = alle scopes van de client."}}},"example":{"grant_type":"client_credentials","scope":"vacancies:read practices:read"}}}}}},"/v1/vacancies":{"get":{"operationId":"vacancyIndex","tags":["Vacancies"],"summary":"Vacatures opvragen","description":"Gepagineerde lijst van canonieke vacatures. Mederi is master.","parameters":[{"name":"page","in":"query","required":false,"description":"Paginanummer, vanaf 1.","schema":{"type":"integer"},"example":1},{"name":"per_page","in":"query","required":false,"description":"Aantal per pagina, maximaal 100.","schema":{"type":"integer"},"example":25},{"name":"language","in":"query","required":false,"description":"nl of fr.","schema":{"type":"string"},"example":"nl"},{"name":"province","in":"query","required":false,"description":"Provinciecode uit de referentielijst provinces (zie /v1/meta/vacancies).","schema":{"type":"string"},"example":"9401"},{"name":"position","in":"query","required":false,"description":"Functiecode uit de referentielijst positions (zie /v1/meta/vacancies).","schema":{"type":"string"},"example":"9301"},{"name":"status","in":"query","required":false,"description":"created, open of filled.","schema":{"type":"string"},"example":"open"},{"name":"published","in":"query","required":false,"description":"Alleen (niet-)gepubliceerde vacatures.","schema":{"type":"boolean"},"example":true},{"name":"practice","in":"query","required":false,"description":"Filter op practice_id.","schema":{"type":"string"},"example":"TL-DEMO-001"},{"name":"updated_since","in":"query","required":false,"description":"ISO 8601 datum of datum-tijd.","schema":{"type":"string"},"example":"2026-01-01"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":[{"uuid":"facade00-0000-4000-8000-000000000001","title":"Verpleegkundige thuisverpleging (demo Antwerpen)","slug":"vacatures/verpleegkundige-thuisverpleging-demo-antwerpen","teaser":"Sandboxvacature. Alle gegevens zijn verzonnen.","language":"nl","practice":{"legacy_reference":"TL-DEMO-001","name":"Praktijk Demo Antwerpen","type":"Mederi"},"location":{"province":{"code":"9401","label":"Antwerpen"},"region":"Regio Antwerpen","postal_code":null,"city":null,"country":null,"latitude":null,"longitude":null},"position":{"code":"9301","label":"Verpleegkundige"},"employment":{"time":{"code":"Parttime","value":"part_time"},"contract":{"code":"Werknemer","value":"employee"}},"content":{"intro":"<p>Demo-intro voor de sandbox.</p>","profile":"<ul><li>Diploma verpleegkunde</li></ul>","tasks":null,"offer":null,"contact":null},"image":null,"status":{"code":"1","value":"created"},"visible":true,"published":true,"display_date":"2026-01-05","created_at":"2026-01-01T09:00:00+01:00","updated_at":"2026-02-01T09:00:00+01:00","valid_through":null,"seeking_nurse_code":null}],"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1","pagination":{"page":1,"per_page":25,"total":1,"total_pages":1}}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["vacancies:read"]}]}},"/v1/vacancies/{uuid}":{"get":{"operationId":"vacancyShow","tags":["Vacancies"],"summary":"Eén vacature opvragen","description":"De canonieke vacature op Mederi-UUID (`Vacatures_uu`).","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"},"example":"facade00-0000-4000-8000-000000000001"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"uuid":"facade00-0000-4000-8000-000000000001","title":"Verpleegkundige thuisverpleging (demo Antwerpen)","slug":"vacatures/verpleegkundige-thuisverpleging-demo-antwerpen","teaser":"Sandboxvacature. Alle gegevens zijn verzonnen.","language":"nl","practice":{"legacy_reference":"TL-DEMO-001","name":"Praktijk Demo Antwerpen","type":"Mederi"},"location":{"province":{"code":"9401","label":"Antwerpen"},"region":"Regio Antwerpen","postal_code":null,"city":null,"country":null,"latitude":null,"longitude":null},"position":{"code":"9301","label":"Verpleegkundige"},"employment":{"time":{"code":"Parttime","value":"part_time"},"contract":{"code":"Werknemer","value":"employee"}},"content":{"intro":"<p>Demo-intro voor de sandbox.</p>","profile":"<ul><li>Diploma verpleegkunde</li></ul>","tasks":null,"offer":null,"contact":null},"image":null,"status":{"code":"1","value":"created"},"visible":true,"published":true,"display_date":"2026-01-05","created_at":"2026-01-01T09:00:00+01:00","updated_at":"2026-02-01T09:00:00+01:00","valid_through":null,"seeking_nurse_code":null},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"404":{"description":"Niet gevonden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Niet gevonden."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["vacancies:read"]}]}},"/v1/practices":{"get":{"operationId":"practiceIndex","tags":["Practices"],"summary":"Praktijken opvragen","description":"Gepagineerde lijst van canonieke praktijken uit beide bronnen.","parameters":[{"name":"page","in":"query","required":false,"description":"Paginanummer, vanaf 1.","schema":{"type":"integer"},"example":1},{"name":"per_page","in":"query","required":false,"description":"Aantal per pagina, maximaal 100.","schema":{"type":"integer"},"example":25},{"name":"active","in":"query","required":false,"description":"Alleen (in)actieve praktijken.","schema":{"type":"boolean"},"example":true},{"name":"visible","in":"query","required":false,"description":"Alleen (on)zichtbare praktijken.","schema":{"type":"boolean"},"example":true},{"name":"language","in":"query","required":false,"description":"nl of fr.","schema":{"type":"string"},"example":"nl"},{"name":"province","in":"query","required":false,"description":"Provincienaam.","schema":{"type":"string"},"example":"Antwerpen"},{"name":"search","in":"query","required":false,"description":"Exacte naam; geen fuzzy zoeken.","schema":{"type":"string"},"example":"Praktijk Demo Antwerpen"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":[{"practice_id":"TL-DEMO-001","name":"Praktijk Demo Antwerpen","alias":"Demo Antwerpen","active":true,"visible":true,"language":"nl","organisation_type":"Thuisverpleegpraktijk","period":{"start_date":"2020-01-01","stop_date":"2999-12-31"},"identifiers":{"vat":"BE0000000098"},"address":{"street":"Demostraat 1","postal_code":"2000","city":"Antwerpen","country":"BE","province":"Antwerpen","latitude":51.2194,"longitude":4.4025,"geo_precision":"postal_code"},"contact":{"email":"demo-antwerpen@example.invalid","phone":"+32 3 000 00 01"},"presentation":{"logo":null,"region_text":"<p>Regio Antwerpen (demo)</p>","contact_text":null},"coach":{"reference":"facade00-0000-4000-8000-0000000c0a01"},"external_refs":{"teamleader_id":"TL-DEMO-001","tdm_ids":["TDM-DEMO-001"]},"warnings":[]}],"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1","pagination":{"page":1,"per_page":25,"total":1,"total_pages":1}}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["practices:read"]}]}},"/v1/practices/{practice_id}":{"get":{"operationId":"practiceShow","tags":["Practices"],"summary":"Eén praktijk opvragen","description":"Op `practice_id`: de Teamleader-referentie, bewust geen UUID.","parameters":[{"name":"practice_id","in":"path","required":true,"schema":{"type":"string"},"example":"TL-DEMO-001"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"practice_id":"TL-DEMO-001","name":"Praktijk Demo Antwerpen","alias":"Demo Antwerpen","active":true,"visible":true,"language":"nl","organisation_type":"Thuisverpleegpraktijk","period":{"start_date":"2020-01-01","stop_date":"2999-12-31"},"identifiers":{"vat":"BE0000000098"},"address":{"street":"Demostraat 1","postal_code":"2000","city":"Antwerpen","country":"BE","province":"Antwerpen","latitude":51.2194,"longitude":4.4025,"geo_precision":"postal_code"},"contact":{"email":"demo-antwerpen@example.invalid","phone":"+32 3 000 00 01"},"presentation":{"logo":null,"region_text":"<p>Regio Antwerpen (demo)</p>","contact_text":null},"coach":{"reference":"facade00-0000-4000-8000-0000000c0a01"},"external_refs":{"teamleader_id":"TL-DEMO-001","tdm_ids":["TDM-DEMO-001"]},"warnings":[]},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"404":{"description":"Niet gevonden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Niet gevonden."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["practices:read"]}]}},"/v1/meta/practices":{"get":{"operationId":"metaPractices","tags":["Metadata"],"summary":"Veldbetekenis van praktijken","description":"Per veld van een Practice: JSON-type, nullable, soort (enum, vrije tekst, ...), bron, toegestane waarden waar die echt vast liggen, en een voorbeeld. Geen businessdata.","parameters":[],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"resource":"practices","endpoint":"/v1/practices","identifier":"practice_id","schema_version":1,"fields":[{"path":"practice_id","json_type":"string","nullable":false,"kind":"identifier","description":"Identiteit van de praktijk: de bestaande Teamleader-referentie, bewust geen UUID-veld. Het formaat verschilt per bron: een Opticare-praktijk heeft live altijd een UUID-vormige waarde van 36 tekens. Behandel de waarde als ondoorzichtige string. Staat hetzelfde ID in beide bronnen, dan wint de Mederi-praktijk.","source":"teamleader_via_mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"TL-DEMO-001"},{"path":"name","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"Naam van de praktijk. Bij een Mederi-praktijk valt M.I.A. terug op de Mederi-kopie wanneer de Teamleader-naam ontbreekt.","source":"teamleader_via_mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"Praktijk Demo Antwerpen"},{"path":"alias","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"Korte of handelsnaam.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"Demo Antwerpen"},{"path":"active","json_type":"boolean","nullable":false,"kind":"derived","description":"Mederi-praktijk: actief in Mederi én zichtbaar. Opticare-praktijk: vandaag valt binnen period.start_date en period.stop_date.","source":"mia_derived","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":true},{"path":"visible","json_type":"boolean","nullable":false,"kind":"boolean","description":"Zichtbaar in Mederi. Een Opticare-praktijk is in deze laag altijd zichtbaar.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":true},{"path":"language","json_type":["string","null"],"nullable":true,"kind":"enum","description":"Taal van de praktijk, genormaliseerd naar ISO 639-1. Elke andere bronwaarde wordt null.","source":"teamleader_via_mederi","picklist":true,"allowed_values":[{"value":"nl","description":"Nederlands"},{"value":"fr","description":"Frans"}],"reference_list":null,"references":null,"observed_values":null,"example":"nl"},{"path":"organisation_type","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"Organisatietype zoals het in Teamleader staat, ongewijzigd doorgegeven. Vrije tekst, GEEN picklist: M.I.A. valideert noch normaliseert deze waarde en belooft geen vaste set. Niet hetzelfde als het veld practice.type op een vacature.","source":"teamleader_via_mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"Thuisverpleegpraktijk"},{"path":"period.start_date","json_type":["string","null"],"nullable":true,"kind":"date","description":"Startdatum van de praktijk.","source":"teamleader_via_mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"2020-01-01"},{"path":"period.stop_date","json_type":["string","null"],"nullable":true,"kind":"date","description":"Stopdatum. 2999-12-31 betekent in de bron \"loopt door\" en wordt ongewijzigd doorgegeven. Een datum in het verleden betekent gestopt.","source":"teamleader_via_mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":[{"value":"2999-12-31","note":"Open einde. Live bij vrijwel alle actieve Opticare-praktijken."}],"example":"2999-12-31"},{"path":"identifiers.vat","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"BTW-nummer zoals in de bron. Geen formaatvalidatie: schrijfwijze verschilt, en de waarde ontbreekt vaak (live bij de meeste Opticare-praktijken).","source":"teamleader_via_mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"BE0000000098"},{"path":"address.street","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"Straat en huisnummer.","source":"teamleader_via_mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"Demostraat 1"},{"path":"address.postal_code","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"Postcode als tekst. Kan ontbreken.","source":"teamleader_via_mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"2000"},{"path":"address.city","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"Gemeente.","source":"teamleader_via_mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"Antwerpen"},{"path":"address.country","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"Land zoals in de bron. Geen gegarandeerd ISO-formaat en niet altijd gevuld.","source":"teamleader_via_mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":[{"value":"BE","note":"Meest voorkomend. Ontbreekt bij een deel van de praktijken."}],"example":"BE"},{"path":"address.province","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"Provincie als vrije tekst uit de bron: geen code en geen referentielijst. Ontbreken is een geldige toestand (live bij de meeste Opticare-praktijken). Staat los van location.province op een vacature, dat wel een referentielijst is.","source":"teamleader_via_mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"Antwerpen"},{"path":"address.latitude","json_type":["number","null"],"nullable":true,"kind":"number","description":"Breedtegraad van het postcodegebied, niet van het pand. Zie geo_precision.","source":"mia_derived","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":51.2194},{"path":"address.longitude","json_type":["number","null"],"nullable":true,"kind":"number","description":"Lengtegraad van het postcodegebied, niet van het pand. Zie geo_precision.","source":"mia_derived","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":4.4025},{"path":"address.geo_precision","json_type":["string","null"],"nullable":true,"kind":"enum","description":"Nauwkeurigheid van latitude en longitude. null wanneer er geen coördinaat is.","source":"mia_derived","picklist":true,"allowed_values":[{"value":"postal_code","description":"Coördinaat van het postcodegebied."}],"reference_list":null,"references":null,"observed_values":null,"example":"postal_code"},{"path":"contact.email","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"Algemeen e-mailadres van de praktijk. Niet gevalideerd.","source":"teamleader_via_mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"demo-antwerpen@example.invalid"},{"path":"contact.phone","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"Telefoonnummer zoals in de bron. Geen vast formaat.","source":"teamleader_via_mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"+32 3 000 00 01"},{"path":"presentation.logo","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"Logoverwijzing uit Mederi. Formaat niet gegarandeerd. Altijd null bij een Opticare-praktijk.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":null},{"path":"presentation.region_text","json_type":["string","null"],"nullable":true,"kind":"html","description":"Tekst over het werkgebied. Altijd null bij een Opticare-praktijk.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"<p>Regio Antwerpen (demo)</p>"},{"path":"presentation.contact_text","json_type":["string","null"],"nullable":true,"kind":"html","description":"Contacttekst. Altijd null bij een Opticare-praktijk.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":null},{"path":"coach.reference","json_type":["string","null"],"nullable":true,"kind":"identifier","description":"Interne referentie van de verantwoordelijke medewerker. Bevat nooit een naam of e-mailadres. Altijd null bij een Opticare-praktijk.","source":"teamleader_via_mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"facade00-0000-4000-8000-0000000c0a01"},{"path":"external_refs.teamleader_id","json_type":"string","nullable":false,"kind":"identifier","description":"Herkomst van de identiteit. Vandaag gelijk aan practice_id.","source":"teamleader_via_mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"TL-DEMO-001"},{"path":"external_refs.tdm_ids","json_type":"array","nullable":false,"kind":"list","description":"TDM-referenties: een relatie, geen identiteit. Nul, één of meer strings. Altijd leeg bij een Opticare-praktijk.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":["TDM-DEMO-001"]},{"path":"warnings","json_type":"array","nullable":false,"kind":"enum","description":"Datakwaliteitssignalen. Meestal leeg. Een lijst met nul of meer van de toegestane waarden.","source":"mia_derived","picklist":true,"allowed_values":[{"value":"multiple_active_rows","description":"Meer dan één actieve Mederi-rij voor deze praktijk."},{"value":"source_record_missing","description":"Geen Teamleader-bronrij: adres, BTW, contact en GEO zijn onbekend."}],"reference_list":null,"references":null,"observed_values":null,"example":[]}],"reference_lists":{},"kinds":{"identifier":"Identiteit of ondoorzichtige referentie. Niet interpreteren, niet parsen.","reference":"Verwijst naar de identiteit van een andere resource (zie `references`).","free_text":"Vrije tekst uit de bron. Geen picklist, geen normalisatie, geen formaatgarantie.","html":"Vrije tekst die HTML kan bevatten, ongewijzigd uit de bron.","enum":"Vaste lijst. `allowed_values` bevat alle waarden die M.I.A. kan teruggeven.","reference_list":"Code uit een Mederi-referentielijst. De waarden staan in `reference_lists`.","legacy_code":"Ruwe bronwaarde, niet genormaliseerd. Gebruik voor logica het genormaliseerde naastliggende veld.","derived":"Door M.I.A. afgeleid uit andere bronvelden.","boolean":"true of false.","date":"Datum, YYYY-MM-DD.","date_time":"Datum en tijd, ISO 8601 met offset.","number":"Getal.","list":"Lijst van waarden.","reserved":"Staat al in het contract, maar heeft nog geen bron. Altijd null."},"sources":{"mederi":"Mederi-backend. Mederi is master.","teamleader_via_mederi":"Bedrijfsgegevens uit Teamleader, via de Mederi-databank gesynchroniseerd.","mia_derived":"Afgeleid door M.I.A. uit andere bronvelden.","none":"Nog geen bron."}},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["practices:read"]}]}},"/v1/meta/vacancies":{"get":{"operationId":"metaVacancies","tags":["Metadata"],"summary":"Veldbetekenis en referentielijsten van vacatures","description":"Per veld van een Vacancy dezelfde beschrijving, plus de Mederi-referentielijsten voor functie (positions) en provincie (provinces).","parameters":[],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"resource":"vacancies","endpoint":"/v1/vacancies","identifier":"uuid","schema_version":1,"fields":[{"path":"uuid","json_type":"string","nullable":false,"kind":"identifier","description":"Identiteit van de vacature, uitgegeven door Mederi.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"facade00-0000-4000-8000-000000000001"},{"path":"title","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"Titel: de eerste niet-lege van publieke kop, frontendnaam en interne naam.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"Verpleegkundige thuisverpleging (demo Antwerpen)"},{"path":"slug","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"Pad op de publieke site, inclusief taalvoorvoegsel: vacatures/ (nl) of postesvacants/ (fr).","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"vacatures/verpleegkundige-thuisverpleging-demo-antwerpen"},{"path":"teaser","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"Korte inleiding.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"Sandboxvacature. Alle gegevens zijn verzonnen."},{"path":"language","json_type":["string","null"],"nullable":true,"kind":"enum","description":"Taal van de vacature. De bron kent NL en FR; genormaliseerd naar ISO 639-1. Andere waarden worden null.","source":"mederi","picklist":true,"allowed_values":[{"value":"nl","description":"Nederlands"},{"value":"fr","description":"Frans"}],"reference_list":null,"references":null,"observed_values":null,"example":"nl"},{"path":"practice.legacy_reference","json_type":["string","null"],"nullable":true,"kind":"reference","description":"practice_id van de praktijk (GET /v1/practices/{practice_id}). Live verwijst dit naar een Mederi- of een Opticare-praktijk. De bron dwingt geen referentiële integriteit af.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":"practices.practice_id","observed_values":null,"example":"TL-DEMO-001"},{"path":"practice.name","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"Praktijknaam zoals vastgelegd bij het aanmaken van de vacature. Momentopname, wordt niet bijgewerkt.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"Praktijk Demo Antwerpen"},{"path":"practice.type","json_type":["string","null"],"nullable":true,"kind":"enum","description":"Uit welke keuzelijst de praktijk in het Mederi-vacatureformulier gekozen werd. Momentopname. Dit is NIET het organisatietype van de praktijk: dat staat als organisation_type in /v1/practices.","source":"mederi","picklist":true,"allowed_values":[{"value":"Mederi","description":"Praktijk uit de Mederi-praktijkenlijst."},{"value":"Opticare","description":"Opticare-praktijk."}],"reference_list":null,"references":null,"observed_values":null,"example":"Mederi"},{"path":"location.province.code","json_type":["string","null"],"nullable":true,"kind":"reference_list","description":"Provinciecode uit de Mederi-referentielijst. Kan ontbreken: het formulier laat \"geen provincie\" toe.","source":"mederi","picklist":true,"allowed_values":null,"reference_list":"provinces","references":null,"observed_values":null,"example":"9401"},{"path":"location.province.label","json_type":["string","null"],"nullable":true,"kind":"derived","description":"Label bij location.province.code, opgezocht in dezelfde referentielijst. null bij een onbekende code.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"Antwerpen"},{"path":"location.region","json_type":["string","null"],"nullable":true,"kind":"html","description":"Regio als vrije tekst.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"Regio Antwerpen"},{"path":"location.postal_code","json_type":"null","nullable":true,"kind":"reserved","description":"Gereserveerd voor een gestructureerde vacaturelocatie. Mederi heeft hier nog geen bron voor; altijd null.","source":"none","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":null},{"path":"location.city","json_type":"null","nullable":true,"kind":"reserved","description":"Gereserveerd voor een gestructureerde vacaturelocatie. Mederi heeft hier nog geen bron voor; altijd null.","source":"none","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":null},{"path":"location.country","json_type":"null","nullable":true,"kind":"reserved","description":"Gereserveerd voor een gestructureerde vacaturelocatie. Mederi heeft hier nog geen bron voor; altijd null.","source":"none","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":null},{"path":"location.latitude","json_type":"null","nullable":true,"kind":"reserved","description":"Gereserveerd voor een gestructureerde vacaturelocatie. Mederi heeft hier nog geen bron voor; altijd null.","source":"none","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":null},{"path":"location.longitude","json_type":"null","nullable":true,"kind":"reserved","description":"Gereserveerd voor een gestructureerde vacaturelocatie. Mederi heeft hier nog geen bron voor; altijd null.","source":"none","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":null},{"path":"position.code","json_type":["string","null"],"nullable":true,"kind":"reference_list","description":"Functiecode uit de Mederi-referentielijst.","source":"mederi","picklist":true,"allowed_values":null,"reference_list":"positions","references":null,"observed_values":null,"example":"9301"},{"path":"position.label","json_type":["string","null"],"nullable":true,"kind":"derived","description":"Label bij position.code, opgezocht in dezelfde referentielijst. null bij een onbekende code.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"Verpleegkundige"},{"path":"employment.time.code","json_type":["string","null"],"nullable":true,"kind":"legacy_code","description":"Ruwe bronwaarde. Het Mederi-formulier schrijft Fulltime, Parttime of ParttimeFulltime. Gebruik employment.time.value voor logica.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"Parttime"},{"path":"employment.time.value","json_type":["string","null"],"nullable":true,"kind":"enum","description":"Genormaliseerde arbeidsduur. null bij een onbekende bronwaarde.","source":"mia_derived","picklist":true,"allowed_values":[{"value":"full_time","description":"Bron: Fulltime"},{"value":"part_time","description":"Bron: Parttime"},{"value":"full_or_part_time","description":"Bron: ParttimeFulltime"}],"reference_list":null,"references":null,"observed_values":null,"example":"part_time"},{"path":"employment.contract.code","json_type":["string","null"],"nullable":true,"kind":"legacy_code","description":"Ruwe bronwaarde. Het Mederi-formulier schrijft Werknemer, Zelfstandig of \"Werknemer - zelfstandig\". Gebruik employment.contract.value voor logica.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"Werknemer"},{"path":"employment.contract.value","json_type":["string","null"],"nullable":true,"kind":"enum","description":"Genormaliseerd statuut. null bij een onbekende bronwaarde.","source":"mia_derived","picklist":true,"allowed_values":[{"value":"employee","description":"Bron: Werknemer"},{"value":"self_employed","description":"Bron: Zelfstandig"},{"value":"employee_or_self_employed","description":"Bron: Werknemer - zelfstandig"}],"reference_list":null,"references":null,"observed_values":null,"example":"employee"},{"path":"content.intro","json_type":["string","null"],"nullable":true,"kind":"html","description":"Inleiding. HTML zoals in Mederi ingevoerd, soms met geplakte opmaak.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"<p>Demo-intro voor de sandbox.</p>"},{"path":"content.profile","json_type":["string","null"],"nullable":true,"kind":"html","description":"Gezocht profiel. HTML.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"<ul><li>Diploma verpleegkunde</li></ul>"},{"path":"content.tasks","json_type":["string","null"],"nullable":true,"kind":"html","description":"Takenpakket. HTML.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":null},{"path":"content.offer","json_type":["string","null"],"nullable":true,"kind":"html","description":"Aanbod. HTML.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":null},{"path":"content.contact","json_type":["string","null"],"nullable":true,"kind":"html","description":"Contacttekst. HTML.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":null},{"path":"image","json_type":["string","null"],"nullable":true,"kind":"free_text","description":"Afbeeldingsverwijzing uit Mederi. Formaat niet gegarandeerd.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":null},{"path":"status.code","json_type":["string","null"],"nullable":true,"kind":"legacy_code","description":"Ruwe bronwaarde 1, 2 of 3. De Mederi-backend zet bij aanmaak 1 en heeft geen schermen om die waarde te wijzigen.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"1"},{"path":"status.value","json_type":["string","null"],"nullable":true,"kind":"enum","description":"Genormaliseerde status van een legacy workflow die niet in gebruik is. Bepaalt NIET of een vacature online staat: gebruik daarvoor visible en published.","source":"mia_derived","picklist":true,"allowed_values":[{"value":"created","description":"Bron: 1"},{"value":"open","description":"Bron: 2"},{"value":"filled","description":"Bron: 3"}],"reference_list":null,"references":null,"observed_values":null,"example":"created"},{"path":"visible","json_type":"boolean","nullable":false,"kind":"boolean","description":"Actief gezet in Mederi. Verwijderde vacatures worden nooit teruggegeven.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":true},{"path":"published","json_type":"boolean","nullable":false,"kind":"derived","description":"Staat online volgens de regel van de publieke site: visible én (geen display_date of display_date vandaag of vroeger).","source":"mia_derived","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":true},{"path":"display_date","json_type":["string","null"],"nullable":true,"kind":"date","description":"Online vanaf. null = meteen. Een datum in de toekomst betekent gepland.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"2026-01-05"},{"path":"created_at","json_type":["string","null"],"nullable":true,"kind":"date_time","description":"Aangemaakt.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"2026-01-01T09:00:00+01:00"},{"path":"updated_at","json_type":["string","null"],"nullable":true,"kind":"date_time","description":"Laatst bewerkt.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":"2026-02-01T09:00:00+01:00"},{"path":"valid_through","json_type":"null","nullable":true,"kind":"reserved","description":"Gereserveerd voor een gestructureerde vacaturelocatie. Mederi heeft hier nog geen bron voor; altijd null.","source":"none","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":null},{"path":"seeking_nurse_code","json_type":["string","null"],"nullable":true,"kind":"legacy_code","description":"Ruwe bronwaarde waarvan de betekenis nog niet bevestigd is. Niet interpreteren.","source":"mederi","picklist":false,"allowed_values":null,"reference_list":null,"references":null,"observed_values":null,"example":null}],"reference_lists":{"positions":{"used_by":["position.code"],"description":"Functies zoals Mederi ze beheert. active = vandaag kiesbaar in Mederi; inactieve waarden blijven staan omdat oudere vacatures ernaar kunnen verwijzen.","source":"mederi","values":[{"code":"9301","label":"Verpleegkundige","active":true}]},"provinces":{"used_by":["location.province.code"],"description":"Provincies zoals Mederi ze beheert. active = vandaag kiesbaar in Mederi.","source":"mederi","values":[{"code":"9401","label":"Antwerpen","active":true}]}},"kinds":{"identifier":"Identiteit of ondoorzichtige referentie. Niet interpreteren, niet parsen.","reference":"Verwijst naar de identiteit van een andere resource (zie `references`).","free_text":"Vrije tekst uit de bron. Geen picklist, geen normalisatie, geen formaatgarantie.","html":"Vrije tekst die HTML kan bevatten, ongewijzigd uit de bron.","enum":"Vaste lijst. `allowed_values` bevat alle waarden die M.I.A. kan teruggeven.","reference_list":"Code uit een Mederi-referentielijst. De waarden staan in `reference_lists`.","legacy_code":"Ruwe bronwaarde, niet genormaliseerd. Gebruik voor logica het genormaliseerde naastliggende veld.","derived":"Door M.I.A. afgeleid uit andere bronvelden.","boolean":"true of false.","date":"Datum, YYYY-MM-DD.","date_time":"Datum en tijd, ISO 8601 met offset.","number":"Getal.","list":"Lijst van waarden.","reserved":"Staat al in het contract, maar heeft nog geen bron. Altijd null."},"sources":{"mederi":"Mederi-backend. Mederi is master.","teamleader_via_mederi":"Bedrijfsgegevens uit Teamleader, via de Mederi-databank gesynchroniseerd.","mia_derived":"Afgeleid door M.I.A. uit andere bronvelden.","none":"Nog geen bron."}},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["vacancies:read"]}]}},"/v1/candidates":{"get":{"operationId":"candidateIndex","tags":["Candidates"],"summary":"Candidate-identiteiten opvragen","description":"Identity-only. Bevat geen enkel persoonsgegeven en geen lookup hash.","parameters":[{"name":"page","in":"query","required":false,"description":"Paginanummer, vanaf 1.","schema":{"type":"integer"},"example":1},{"name":"per_page","in":"query","required":false,"description":"Aantal per pagina, maximaal 100.","schema":{"type":"integer"},"example":25},{"name":"status","in":"query","required":false,"description":"active, merged of inactive.","schema":{"type":"string"},"example":"active"},{"name":"created_since","in":"query","required":false,"description":"ISO 8601 datum of datum-tijd.","schema":{"type":"string"},"example":"2026-01-01"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":[{"candidate_uuid":"facade00-0000-4000-8000-0000000000c1","status":"active","merged_into_candidate_uuid":null,"created_at":"2026-01-01T09:00:00+01:00","updated_at":null}],"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1","pagination":{"page":1,"per_page":25,"total":1,"total_pages":1}}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["candidates:read"]}]}},"/v1/candidates/{candidate_uuid}":{"get":{"operationId":"candidateShow","tags":["Candidates"],"summary":"Eén Candidate-identiteit opvragen","description":"Identity-only: uuid, status en merge-verwijzing.","parameters":[{"name":"candidate_uuid","in":"path","required":true,"schema":{"type":"string"},"example":"facade00-0000-4000-8000-0000000000c1"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"candidate_uuid":"facade00-0000-4000-8000-0000000000c1","status":"active","merged_into_candidate_uuid":null,"created_at":"2026-01-01T09:00:00+01:00","updated_at":null},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"404":{"description":"Niet gevonden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Niet gevonden."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["candidates:read"]}]}},"/v1/applications":{"get":{"operationId":"applicationIndex","tags":["Applications"],"summary":"Sollicitaties opvragen","description":"Gepagineerde lijst. Zonder interne id, bronmapping of persoonsgegevens.","parameters":[{"name":"page","in":"query","required":false,"description":"Paginanummer, vanaf 1.","schema":{"type":"integer"},"example":1},{"name":"per_page","in":"query","required":false,"description":"Aantal per pagina, maximaal 100.","schema":{"type":"integer"},"example":25},{"name":"candidate_uuid","in":"query","required":false,"description":"Filter op Candidate.","schema":{"type":"string"},"example":"facade00-0000-4000-8000-0000000000c1"},{"name":"vacancy_uuid","in":"query","required":false,"description":"Filter op vacature.","schema":{"type":"string"},"example":"facade00-0000-4000-8000-000000000001"},{"name":"practice_id","in":"query","required":false,"description":"Filter op praktijk.","schema":{"type":"string"},"example":"TL-DEMO-001"},{"name":"resolution","in":"query","required":false,"description":"resolved, unresolved of ambiguous.","schema":{"type":"string"},"example":"resolved"},{"name":"created_since","in":"query","required":false,"description":"ISO 8601 datum of datum-tijd.","schema":{"type":"string"},"example":"2026-01-01"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":[{"application_uuid":"facade00-0000-4000-8000-0000000000a1","candidate_uuid":"facade00-0000-4000-8000-0000000000c1","vacancy_uuid":"facade00-0000-4000-8000-000000000001","practice_id":"TL-DEMO-001","resolution":"resolved","consent_flag":true,"entrypoint_raw":null,"entrypoint_code":null,"created_at":"2026-01-02T10:00:00+01:00","updated_at":null}],"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1","pagination":{"page":1,"per_page":25,"total":1,"total_pages":1}}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["applications:read"]}]},"post":{"operationId":"applicationStore","tags":["Applications"],"summary":"Sollicitatie aanmaken","description":"Resolveert de Candidate-identiteit en legt de Application vast. Ondersteunt `Idempotency-Key`.","parameters":[],"responses":{"201":{"description":"Aangemaakt.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"application_uuid":"facade00-0000-4000-8000-0000000000a1","candidate_uuid":"facade00-0000-4000-8000-0000000000c1","resolution":"resolved","candidate_created":true,"application_created":true,"vacancy_uuid":"facade00-0000-4000-8000-000000000001","practice_id":"TL-DEMO-001","consent_flag":true,"entrypoint_raw":null,"entrypoint_code":null,"created_at":"2026-01-02T10:00:00+01:00"},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"200":{"description":"Bestond al; de bestaande sollicitatie komt terug met application_created: false.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"application_uuid":"facade00-0000-4000-8000-0000000000a1","candidate_uuid":"facade00-0000-4000-8000-0000000000c1","resolution":"resolved","candidate_created":false,"application_created":false,"vacancy_uuid":"facade00-0000-4000-8000-000000000001","practice_id":"TL-DEMO-001","consent_flag":true,"entrypoint_raw":null,"entrypoint_code":null,"created_at":"2026-01-02T10:00:00+01:00"},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"409":{"description":"Ambiguïteit, gelijktijdig verzoek of dubbele bronidentiteit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"CANDIDATE_IDENTITY_AMBIGUOUS","message":"Ambiguïteit, gelijktijdig verzoek of dubbele bronidentiteit."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["applications:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationIntake"},"example":{"vacancy_uuid":"facade00-0000-4000-8000-000000000001","email":"demo.kandidaat@example.invalid","consent_flag":true}}}}}},"/v1/applications/{application_uuid}":{"get":{"operationId":"applicationShow","tags":["Applications"],"summary":"Eén sollicitatie opvragen","description":"De canonieke Application op UUID.","parameters":[{"name":"application_uuid","in":"path","required":true,"schema":{"type":"string"},"example":"facade00-0000-4000-8000-0000000000a1"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"application_uuid":"facade00-0000-4000-8000-0000000000a1","candidate_uuid":"facade00-0000-4000-8000-0000000000c1","vacancy_uuid":"facade00-0000-4000-8000-000000000001","practice_id":"TL-DEMO-001","resolution":"resolved","consent_flag":true,"entrypoint_raw":null,"entrypoint_code":null,"created_at":"2026-01-02T10:00:00+01:00","updated_at":null},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"404":{"description":"Niet gevonden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Niet gevonden."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["applications:read"]}]}},"/v1/applications/{application_uuid}/submission":{"post":{"operationId":"applicationSubmit","tags":["Applications"],"summary":"Verzonden sollicitatie vastleggen","description":"Stap 2 van het websiteformulier: gegevens en CV-referentie. Idempotent; een tweede identieke call geeft `changed: false`.","parameters":[{"name":"application_uuid","in":"path","required":true,"schema":{"type":"string"},"example":"facade00-0000-4000-8000-0000000000a1"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"application_uuid":"facade00-0000-4000-8000-0000000000a1","changed":true,"submitted_at":"2026-01-02T10:05:00+01:00"},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"404":{"description":"Niet gevonden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Niet gevonden."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["applications:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationSubmission"},"example":{"first_name":"Demo","last_name":"Kandidaat","city":"Gent","email":"demo.kandidaat@example.invalid","phone":"+32 470 00 00 00","diploma":"Bachelor verpleegkunde","profile":"Verpleegkundige","motivation":"Graag meer uitleg over de uurregeling.","cv":{"file_name":"cv-demo.pdf","url":"https://d3pte7xbglt2zj.cloudfront.net/www/VacaturesCanidates/cv-demo_1234.pdf","content_type":"application/pdf"}}}}}},"get":{"operationId":"applicationSubmission","tags":["Applications"],"summary":"Verzonden sollicitatie opvragen","description":"De ingevulde gegevens en de CV-referentie van een verzonden sollicitatie.","parameters":[{"name":"application_uuid","in":"path","required":true,"schema":{"type":"string"},"example":"facade00-0000-4000-8000-0000000000a1"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"application_uuid":"facade00-0000-4000-8000-0000000000a1","first_name":"Demo","last_name":"Kandidaat","city":"Gent","email":"demo.kandidaat@example.invalid","phone":"+32 470 00 00 00","diploma":"Bachelor verpleegkunde","profile":"Verpleegkundige","motivation":"Graag meer uitleg over de uurregeling.","cv":{"file_name":"cv-demo.pdf","url":"https://d3pte7xbglt2zj.cloudfront.net/www/VacaturesCanidates/cv-demo_1234.pdf","content_type":"application/pdf"},"submitted_at":"2026-01-02T10:05:00+01:00","created_at":"2026-01-02T10:05:00+01:00","updated_at":null},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"404":{"description":"Niet gevonden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Niet gevonden."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["applications:read"]}]}},"/v1/applications/{application_uuid}/intake":{"get":{"operationId":"applicationIntake","tags":["Applications"],"summary":"Contactgegevens uit de intake opvragen","description":"Voornaam, naam, e-mailadres en gsm zoals ingevuld in stap 1 van het formulier. Beschikbaar zodra de aanvraag bestaat, ook wanneer de kandidaat de sollicitatie niet afmaakte en er dus geen verzending met CV is.","parameters":[{"name":"application_uuid","in":"path","required":true,"schema":{"type":"string"},"example":"facade00-0000-4000-8000-0000000000a1"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"application_uuid":"facade00-0000-4000-8000-0000000000a1","first_name":"Jana","last_name":"Peeters","email":"jana.peeters@example.invalid","phone":"0470 00 00 00","created_at":"2026-01-02T10:00:00+01:00","updated_at":null},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["applications:read"]}]}},"/v1/recruitment-cases":{"get":{"operationId":"recruitmentCaseIndex","tags":["Recruitment cases"],"summary":"Recruitment cases opvragen","description":"Technisch identity/link-register. Geen workflow, geen statusbeheer.","parameters":[{"name":"page","in":"query","required":false,"description":"Paginanummer, vanaf 1.","schema":{"type":"integer"},"example":1},{"name":"per_page","in":"query","required":false,"description":"Aantal per pagina, maximaal 100.","schema":{"type":"integer"},"example":25},{"name":"resolution","in":"query","required":false,"description":"resolved, unresolved of ambiguous.","schema":{"type":"string"},"example":"resolved"},{"name":"candidate_uuid","in":"query","required":false,"description":"Filter op Candidate.","schema":{"type":"string"},"example":"facade00-0000-4000-8000-0000000000c1"},{"name":"application_uuid","in":"query","required":false,"description":"Filter op Application.","schema":{"type":"string"},"example":"facade00-0000-4000-8000-0000000000a1"},{"name":"created_since","in":"query","required":false,"description":"ISO 8601 datum of datum-tijd.","schema":{"type":"string"},"example":"2026-01-01"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":[{"recruitment_uuid":"facade00-0000-4000-8000-0000000000d1","candidate_uuid":"facade00-0000-4000-8000-0000000000c1","application_uuid":"facade00-0000-4000-8000-0000000000a1","resolution":"resolved","link_basis":"strict_email_vacancy_bidirectional","source":{"mederi_source":"VacaturesRecrutering","mederi_key":"1234"},"created_at":"2026-01-03T11:00:00+01:00","updated_at":null}],"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1","pagination":{"page":1,"per_page":25,"total":1,"total_pages":1}}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["recruitment-cases:read"]}]}},"/v1/recruitment-cases/{recruitment_uuid}":{"get":{"operationId":"recruitmentCaseShow","tags":["Recruitment cases"],"summary":"Eén recruitment case opvragen","description":"De koppeling tussen legacy dossier, Candidate en Application.","parameters":[{"name":"recruitment_uuid","in":"path","required":true,"schema":{"type":"string"},"example":"facade00-0000-4000-8000-0000000000d1"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"recruitment_uuid":"facade00-0000-4000-8000-0000000000d1","candidate_uuid":"facade00-0000-4000-8000-0000000000c1","application_uuid":"facade00-0000-4000-8000-0000000000a1","resolution":"resolved","link_basis":"strict_email_vacancy_bidirectional","source":{"mederi_source":"VacaturesRecrutering","mederi_key":"1234"},"created_at":"2026-01-03T11:00:00+01:00","updated_at":null},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"404":{"description":"Niet gevonden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Niet gevonden."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["recruitment-cases:read"]}]}},"/v1/webhooks":{"get":{"operationId":"webhookIndex","tags":["Webhooks"],"summary":"Eigen subscriptions opvragen","description":"Uitsluitend de subscriptions van de authenticerende client.","parameters":[{"name":"page","in":"query","required":false,"description":"Paginanummer, vanaf 1.","schema":{"type":"integer"},"example":1},{"name":"per_page","in":"query","required":false,"description":"Aantal per pagina, maximaal 100.","schema":{"type":"integer"},"example":25}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":[{"webhook_uuid":"facade00-0000-4000-8000-0000000000e1","url":"https://consumer.example.invalid/mia/webhooks","event_types":["vacancy.created","vacancy.updated"],"status":"active","created_at":"2026-01-04T12:00:00+01:00","updated_at":null,"last_success_at":null,"last_failure_at":null}],"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1","pagination":{"page":1,"per_page":25,"total":1,"total_pages":1}}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["webhooks:read"]}]},"post":{"operationId":"webhookStore","tags":["Webhooks"],"summary":"Subscription aanmaken","description":"Antwoordt eenmalig met het signing secret. Daarna is het nergens meer op te vragen.","parameters":[],"responses":{"201":{"description":"Aangemaakt; bevat eenmalig het signing secret.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"webhook_uuid":"facade00-0000-4000-8000-0000000000e1","url":"https://consumer.example.invalid/mia/webhooks","event_types":["vacancy.created","vacancy.updated"],"status":"active","created_at":"2026-01-04T12:00:00+01:00","updated_at":null,"last_success_at":null,"last_failure_at":null,"secret":"whsec_EXAMPLE-SECRET-NIET-ECHT"},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["webhooks:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookIntake"},"example":{"url":"https://consumer.example.invalid/mia/webhooks","event_types":["vacancy.created","vacancy.updated"]}}}}}},"/v1/webhooks/{webhook_uuid}":{"get":{"operationId":"webhookShow","tags":["Webhooks"],"summary":"Eén subscription opvragen","description":"Zonder secret; dat wordt nooit teruggegeven.","parameters":[{"name":"webhook_uuid","in":"path","required":true,"schema":{"type":"string"},"example":"facade00-0000-4000-8000-0000000000e1"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"webhook_uuid":"facade00-0000-4000-8000-0000000000e1","url":"https://consumer.example.invalid/mia/webhooks","event_types":["vacancy.created","vacancy.updated"],"status":"active","created_at":"2026-01-04T12:00:00+01:00","updated_at":null,"last_success_at":null,"last_failure_at":null},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"404":{"description":"Niet gevonden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Niet gevonden."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["webhooks:read"]}]},"patch":{"operationId":"webhookUpdate","tags":["Webhooks"],"summary":"Subscription wijzigen","description":"Url, event_types en status. Alleen de opgegeven velden wijzigen.","parameters":[{"name":"webhook_uuid","in":"path","required":true,"schema":{"type":"string"},"example":"facade00-0000-4000-8000-0000000000e1"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"webhook_uuid":"facade00-0000-4000-8000-0000000000e1","url":"https://consumer.example.invalid/mia/webhooks","event_types":["vacancy.created","vacancy.updated"],"status":"active","created_at":"2026-01-04T12:00:00+01:00","updated_at":null,"last_success_at":null,"last_failure_at":null},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"404":{"description":"Niet gevonden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Niet gevonden."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["webhooks:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookPatch"},"example":{"status":"disabled"}}}}},"delete":{"operationId":"webhookDestroy","tags":["Webhooks"],"summary":"Subscription uitschakelen","description":"Zet de status op `disabled`. Er wordt niets fysiek verwijderd.","parameters":[{"name":"webhook_uuid","in":"path","required":true,"schema":{"type":"string"},"example":"facade00-0000-4000-8000-0000000000e1"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"webhook_uuid":"facade00-0000-4000-8000-0000000000e1","url":"https://consumer.example.invalid/mia/webhooks","event_types":["vacancy.created","vacancy.updated"],"status":"active","created_at":"2026-01-04T12:00:00+01:00","updated_at":null,"last_success_at":null,"last_failure_at":null},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"404":{"description":"Niet gevonden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Niet gevonden."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["webhooks:write"]}]}},"/v1/webhooks/{webhook_uuid}/rotate-secret":{"post":{"operationId":"webhookRotateSecret","tags":["Webhooks"],"summary":"Signing secret roteren","description":"Nieuw secret, eenmalig getoond. Het oude is onmiddellijk ongeldig.","parameters":[{"name":"webhook_uuid","in":"path","required":true,"schema":{"type":"string"},"example":"facade00-0000-4000-8000-0000000000e1"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"webhook_uuid":"facade00-0000-4000-8000-0000000000e1","url":"https://consumer.example.invalid/mia/webhooks","event_types":["vacancy.created","vacancy.updated"],"status":"active","created_at":"2026-01-04T12:00:00+01:00","updated_at":null,"last_success_at":null,"last_failure_at":null,"secret":"whsec_EXAMPLE-SECRET-NIET-ECHT"},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"404":{"description":"Niet gevonden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Niet gevonden."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["webhooks:write"]}]}},"/v1/webhooks/{webhook_uuid}/test":{"post":{"operationId":"webhookTest","tags":["Webhooks"],"summary":"Testevent versturen","description":"Zet een `system.ping` klaar voor deze subscription. 202: aanvaard, nog niet afgeleverd.","parameters":[{"name":"webhook_uuid","in":"path","required":true,"schema":{"type":"string"},"example":"facade00-0000-4000-8000-0000000000e1"}],"responses":{"202":{"description":"Aanvaard; de dispatcher levert het event af.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"event_uuid":"facade00-0000-4000-8000-00000000beef","event_type":"system.ping","webhook_uuid":"facade00-0000-4000-8000-0000000000e1","status":"queued"},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"404":{"description":"Niet gevonden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Niet gevonden."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["webhooks:write"]}]}},"/v1/webhooks/{webhook_uuid}/deliveries":{"get":{"operationId":"webhookDeliveries","tags":["Webhooks"],"summary":"Leveringen van een subscription","description":"Status per poging. Zonder responsebody: die wordt nooit bewaard.","parameters":[{"name":"webhook_uuid","in":"path","required":true,"schema":{"type":"string"},"example":"facade00-0000-4000-8000-0000000000e1"},{"name":"page","in":"query","required":false,"description":"Paginanummer, vanaf 1.","schema":{"type":"integer"},"example":1},{"name":"per_page","in":"query","required":false,"description":"Aantal per pagina, maximaal 100.","schema":{"type":"integer"},"example":25}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":[{"delivery_uuid":"facade00-0000-4000-8000-00000000dead","event_uuid":"facade00-0000-4000-8000-00000000beef","webhook_uuid":"facade00-0000-4000-8000-0000000000e1","status":"delivered","attempts":1,"last_http_status":200,"last_error_code":null,"next_retry_at":null,"created_at":"2026-01-05T13:00:00+01:00","updated_at":"2026-01-05T13:00:01+01:00","delivered_at":"2026-01-05T13:00:01+01:00"}],"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1","pagination":{"page":1,"per_page":25,"total":1,"total_pages":1}}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"404":{"description":"Niet gevonden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Niet gevonden."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["webhooks:read"]}]}},"/v1/salesforce/{object}/{id}":{"put":{"operationId":"salesforceMirrorUpsert","tags":["Salesforce mirror"],"summary":"Salesforce-record spiegelen (volledige snapshot)","description":"Body = het VOLLEDIGE Salesforce-record zoals de REST API het levert; geen merge. Idempotent op record + inhoud. Oudere ontvangsten (SystemModstamp, anders LastModifiedDate) worden als versie bewaard maar niet toegepast. 15-tekens Ids worden 18 tekens. Alleen voor de client \"Salesforce Mirror\".","parameters":[{"name":"object","in":"path","required":true,"schema":{"type":"string"},"example":"Contact"},{"name":"id","in":"path","required":true,"schema":{"type":"string"},"example":"003000000000001AAA"},{"name":"X-Salesforce-Org-Id","in":"header","required":true,"description":"Org Id van de Salesforce-org die deze omgeving spiegelt (15 of 18 tekens).","schema":{"type":"string"},"example":"00D000000000001EAA"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"object":"Contact","id":"003000000000001AAA","changed":true,"stale":false,"version_number":1,"change_kind":"upsert","projection_status":"no_table","unprojected_field_count":0},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"409":{"description":"Gelijktijdige schrijfactie voor hetzelfde record; opnieuw proberen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"MIRROR_CONCURRENT_WRITE","message":"Gelijktijdige schrijfactie voor hetzelfde record; opnieuw proberen."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"413":{"description":"Body groter dan de limiet van dit endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"PAYLOAD_TOO_LARGE","message":"Body groter dan de limiet van dit endpoint."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["salesforce-mirror:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Het volledige Salesforce-record. Velden en types volgen de Salesforce-org; M.I.A. bewaart de payload ongewijzigd.","additionalProperties":true},"example":{"attributes":{"type":"Contact"},"Id":"003000000000001AAA","LastName":"Demo","Email":"demo.contact@example.invalid","SystemModstamp":"2026-09-16T10:15:30.000+0000"}}}}},"delete":{"operationId":"salesforceMirrorDestroy","tags":["Salesforce mirror"],"summary":"Salesforce-record als verwijderd markeren","description":"Soft delete: er verdwijnt niets. X-Salesforce-System-Modstamp is verplicht; een vertraagde, oudere delete wordt als audit bewaard en niet toegepast.","parameters":[{"name":"object","in":"path","required":true,"schema":{"type":"string"},"example":"Contact"},{"name":"id","in":"path","required":true,"schema":{"type":"string"},"example":"003000000000001AAA"},{"name":"X-Salesforce-Org-Id","in":"header","required":true,"description":"Org Id van de Salesforce-org die deze omgeving spiegelt (15 of 18 tekens).","schema":{"type":"string"},"example":"00D000000000001EAA"},{"name":"X-Salesforce-System-Modstamp","in":"header","required":true,"description":"Brontijd van de delete, ISO-8601 UTC.","schema":{"type":"string"},"example":"2026-09-16T10:15:30.000+0000"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"object":"Contact","id":"003000000000001AAA","changed":true,"stale":false,"version_number":2,"change_kind":"delete","projection_status":"no_table"},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"404":{"description":"Niet gevonden.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"NOT_FOUND","message":"Niet gevonden."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"409":{"description":"Gelijktijdige schrijfactie voor hetzelfde record; opnieuw proberen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"MIRROR_CONCURRENT_WRITE","message":"Gelijktijdige schrijfactie voor hetzelfde record; opnieuw proberen."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["salesforce-mirror:write"]}]}},"/v1/salesforce/{object}/{id}/blob":{"put":{"operationId":"salesforceMirrorBlob","tags":["Salesforce mirror"],"summary":"Bestandsinhoud spiegelen","description":"Ruwe bytes voor ContentVersion.VersionData of Attachment.Body, met X-Content-SHA256. Opslag buiten de databank, content-addressed.","parameters":[{"name":"object","in":"path","required":true,"schema":{"type":"string"},"example":"Contact"},{"name":"id","in":"path","required":true,"schema":{"type":"string"},"example":"003000000000001AAA"},{"name":"X-Salesforce-Org-Id","in":"header","required":true,"description":"Org Id van de Salesforce-org die deze omgeving spiegelt (15 of 18 tekens).","schema":{"type":"string"},"example":"00D000000000001EAA"},{"name":"X-Content-SHA256","in":"header","required":true,"description":"sha256 van de body, 64 hex-tekens.","schema":{"type":"string"},"example":"0000000000000000000000000000000000000000000000000000000000000000"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"object":"ContentVersion","id":"068000000000001AAA","field":"VersionData","sha256":"0000000000000000000000000000000000000000000000000000000000000000","byte_length":1024,"changed":true},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"409":{"description":"Gelijktijdige schrijfactie voor hetzelfde record; opnieuw proberen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"MIRROR_CONCURRENT_WRITE","message":"Gelijktijdige schrijfactie voor hetzelfde record; opnieuw proberen."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"413":{"description":"Body groter dan de limiet van dit endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"PAYLOAD_TOO_LARGE","message":"Body groter dan de limiet van dit endpoint."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["salesforce-mirror:write"]}],"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}}}},"/v1/salesforce-schema/{object}":{"put":{"operationId":"salesforceMirrorSchema","tags":["Salesforce mirror"],"summary":"Salesforce Describe aanleveren","description":"De Describe JSON van een object. Wordt bewaard en genormaliseerd; wijzigt nooit de databankstructuur.","parameters":[{"name":"object","in":"path","required":true,"schema":{"type":"string"},"example":"Contact"},{"name":"X-Salesforce-Org-Id","in":"header","required":true,"description":"Org Id van de Salesforce-org die deze omgeving spiegelt (15 of 18 tekens).","schema":{"type":"string"},"example":"00D000000000001EAA"},{"name":"X-Salesforce-Api-Version","in":"header","required":false,"description":"API-versie van de Describe.","schema":{"type":"string"},"example":"68.0"}],"responses":{"200":{"description":"OK.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuccessEnvelope"},"example":{"success":true,"data":{"object":"Contact","schema_hash":"0000000000000000000000000000000000000000000000000000000000000000","field_count":2,"source":"describe_push","changed":true},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"401":{"description":"Geen of ongeldig token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"UNAUTHENTICATED","message":"Geen of ongeldig token."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"403":{"description":"Token mist de vereiste scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"INSUFFICIENT_SCOPE","message":"Token mist de vereiste scope."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"422":{"description":"Ongeldige parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"VALIDATION_ERROR","message":"Ongeldige parameters."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"503":{"description":"Bron tijdelijk onbereikbaar.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"LEGACY_SOURCE_UNAVAILABLE","message":"Bron tijdelijk onbereikbaar."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"409":{"description":"Gelijktijdige schrijfactie voor hetzelfde record; opnieuw proberen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"MIRROR_CONCURRENT_WRITE","message":"Gelijktijdige schrijfactie voor hetzelfde record; opnieuw proberen."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}},"413":{"description":"Body groter dan de limiet van dit endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"},"example":{"success":false,"error":{"code":"PAYLOAD_TOO_LARGE","message":"Body groter dan de limiet van dit endpoint."},"meta":{"request_id":"facade00-0000-4000-8000-00000000cafe","api_version":"v1"}}}}}},"security":[{"oauth2ClientCredentials":["salesforce-mirror:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","fields"],"description":"Salesforce sObject Describe JSON.","additionalProperties":true},"example":{"name":"Contact","fields":[{"name":"Id","type":"id","length":18},{"name":"LastName","type":"string","length":80}]}}}}}}},"webhooks":{"vacancy.created":{"post":{"operationId":"webhookVacancyCreated","summary":"M.I.A. stuurt vacancy.created naar jouw endpoint.","description":"Een notificatie, geen datalevering: haal de actuele toestand op bij het endpoint in `links.self`.\n\nVerifieer ALTIJD de signatuur vóór je de payload gebruikt.","parameters":[{"name":"X-MIA-Event-Id","in":"header","required":true,"description":"Het event_uuid.","schema":{"type":"string"}},{"name":"X-MIA-Event-Type","in":"header","required":true,"description":"Het eventtype, bv. vacancy.created.","schema":{"type":"string"}},{"name":"X-MIA-Timestamp","in":"header","required":true,"description":"Unix seconds (UTC) op moment van versturen.","schema":{"type":"string"}},{"name":"X-MIA-Signature","in":"header","required":true,"description":"v1=<hex hmac_sha256(timestamp + \".\" + raw_body, secret)>","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"event_uuid":"facade00-0000-4000-8000-00000000beef","event_type":"vacancy.created","event_version":1,"occurred_at":"2026-09-09T10:00:00+02:00","entity":{"type":"vacancy","id":"facade00-0000-4000-8000-000000000001"},"links":{"self":"https://mia.e-mederi.be/v1/vacancies/facade00-0000-4000-8000-000000000001"}}}}},"responses":{"2XX":{"description":"Aanvaard. Elke 2xx geldt als geslaagd."},"4XX":{"description":"Afgewezen. Wordt niet opnieuw geprobeerd, behalve 408, 425 en 429."},"5XX":{"description":"Tijdelijke fout. Wordt opnieuw geprobeerd volgens de backoff."}}}},"vacancy.updated":{"post":{"operationId":"webhookVacancyUpdated","summary":"M.I.A. stuurt vacancy.updated naar jouw endpoint.","description":"Een notificatie, geen datalevering: haal de actuele toestand op bij het endpoint in `links.self`.\n\nVerifieer ALTIJD de signatuur vóór je de payload gebruikt.","parameters":[{"name":"X-MIA-Event-Id","in":"header","required":true,"description":"Het event_uuid.","schema":{"type":"string"}},{"name":"X-MIA-Event-Type","in":"header","required":true,"description":"Het eventtype, bv. vacancy.updated.","schema":{"type":"string"}},{"name":"X-MIA-Timestamp","in":"header","required":true,"description":"Unix seconds (UTC) op moment van versturen.","schema":{"type":"string"}},{"name":"X-MIA-Signature","in":"header","required":true,"description":"v1=<hex hmac_sha256(timestamp + \".\" + raw_body, secret)>","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"event_uuid":"facade00-0000-4000-8000-00000000beef","event_type":"vacancy.updated","event_version":1,"occurred_at":"2026-09-09T10:00:00+02:00","entity":{"type":"vacancy","id":"facade00-0000-4000-8000-000000000001"},"links":{"self":"https://mia.e-mederi.be/v1/vacancies/facade00-0000-4000-8000-000000000001"}}}}},"responses":{"2XX":{"description":"Aanvaard. Elke 2xx geldt als geslaagd."},"4XX":{"description":"Afgewezen. Wordt niet opnieuw geprobeerd, behalve 408, 425 en 429."},"5XX":{"description":"Tijdelijke fout. Wordt opnieuw geprobeerd volgens de backoff."}}}},"vacancy.deleted":{"post":{"operationId":"webhookVacancyDeleted","summary":"M.I.A. stuurt vacancy.deleted naar jouw endpoint.","description":"Een notificatie, geen datalevering: haal de actuele toestand op bij het endpoint in `links.self`.\n\nVerifieer ALTIJD de signatuur vóór je de payload gebruikt.","parameters":[{"name":"X-MIA-Event-Id","in":"header","required":true,"description":"Het event_uuid.","schema":{"type":"string"}},{"name":"X-MIA-Event-Type","in":"header","required":true,"description":"Het eventtype, bv. vacancy.deleted.","schema":{"type":"string"}},{"name":"X-MIA-Timestamp","in":"header","required":true,"description":"Unix seconds (UTC) op moment van versturen.","schema":{"type":"string"}},{"name":"X-MIA-Signature","in":"header","required":true,"description":"v1=<hex hmac_sha256(timestamp + \".\" + raw_body, secret)>","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"event_uuid":"facade00-0000-4000-8000-00000000beef","event_type":"vacancy.deleted","event_version":1,"occurred_at":"2026-09-09T10:00:00+02:00","entity":{"type":"vacancy","id":"facade00-0000-4000-8000-000000000001"}}}}},"responses":{"2XX":{"description":"Aanvaard. Elke 2xx geldt als geslaagd."},"4XX":{"description":"Afgewezen. Wordt niet opnieuw geprobeerd, behalve 408, 425 en 429."},"5XX":{"description":"Tijdelijke fout. Wordt opnieuw geprobeerd volgens de backoff."}}}},"practice.created":{"post":{"operationId":"webhookPracticeCreated","summary":"M.I.A. stuurt practice.created naar jouw endpoint.","description":"Een notificatie, geen datalevering: haal de actuele toestand op bij het endpoint in `links.self`.\n\nVerifieer ALTIJD de signatuur vóór je de payload gebruikt.","parameters":[{"name":"X-MIA-Event-Id","in":"header","required":true,"description":"Het event_uuid.","schema":{"type":"string"}},{"name":"X-MIA-Event-Type","in":"header","required":true,"description":"Het eventtype, bv. practice.created.","schema":{"type":"string"}},{"name":"X-MIA-Timestamp","in":"header","required":true,"description":"Unix seconds (UTC) op moment van versturen.","schema":{"type":"string"}},{"name":"X-MIA-Signature","in":"header","required":true,"description":"v1=<hex hmac_sha256(timestamp + \".\" + raw_body, secret)>","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"event_uuid":"facade00-0000-4000-8000-00000000beef","event_type":"practice.created","event_version":1,"occurred_at":"2026-09-09T10:00:00+02:00","entity":{"type":"practice","id":"TL-DEMO-001"},"links":{"self":"https://mia.e-mederi.be/v1/practices/TL-DEMO-001"}}}}},"responses":{"2XX":{"description":"Aanvaard. Elke 2xx geldt als geslaagd."},"4XX":{"description":"Afgewezen. Wordt niet opnieuw geprobeerd, behalve 408, 425 en 429."},"5XX":{"description":"Tijdelijke fout. Wordt opnieuw geprobeerd volgens de backoff."}}}},"practice.updated":{"post":{"operationId":"webhookPracticeUpdated","summary":"M.I.A. stuurt practice.updated naar jouw endpoint.","description":"Een notificatie, geen datalevering: haal de actuele toestand op bij het endpoint in `links.self`.\n\nVerifieer ALTIJD de signatuur vóór je de payload gebruikt.","parameters":[{"name":"X-MIA-Event-Id","in":"header","required":true,"description":"Het event_uuid.","schema":{"type":"string"}},{"name":"X-MIA-Event-Type","in":"header","required":true,"description":"Het eventtype, bv. practice.updated.","schema":{"type":"string"}},{"name":"X-MIA-Timestamp","in":"header","required":true,"description":"Unix seconds (UTC) op moment van versturen.","schema":{"type":"string"}},{"name":"X-MIA-Signature","in":"header","required":true,"description":"v1=<hex hmac_sha256(timestamp + \".\" + raw_body, secret)>","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"event_uuid":"facade00-0000-4000-8000-00000000beef","event_type":"practice.updated","event_version":1,"occurred_at":"2026-09-09T10:00:00+02:00","entity":{"type":"practice","id":"TL-DEMO-001"},"links":{"self":"https://mia.e-mederi.be/v1/practices/TL-DEMO-001"}}}}},"responses":{"2XX":{"description":"Aanvaard. Elke 2xx geldt als geslaagd."},"4XX":{"description":"Afgewezen. Wordt niet opnieuw geprobeerd, behalve 408, 425 en 429."},"5XX":{"description":"Tijdelijke fout. Wordt opnieuw geprobeerd volgens de backoff."}}}},"practice.deleted":{"post":{"operationId":"webhookPracticeDeleted","summary":"M.I.A. stuurt practice.deleted naar jouw endpoint.","description":"Een notificatie, geen datalevering: haal de actuele toestand op bij het endpoint in `links.self`.\n\nVerifieer ALTIJD de signatuur vóór je de payload gebruikt.","parameters":[{"name":"X-MIA-Event-Id","in":"header","required":true,"description":"Het event_uuid.","schema":{"type":"string"}},{"name":"X-MIA-Event-Type","in":"header","required":true,"description":"Het eventtype, bv. practice.deleted.","schema":{"type":"string"}},{"name":"X-MIA-Timestamp","in":"header","required":true,"description":"Unix seconds (UTC) op moment van versturen.","schema":{"type":"string"}},{"name":"X-MIA-Signature","in":"header","required":true,"description":"v1=<hex hmac_sha256(timestamp + \".\" + raw_body, secret)>","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"event_uuid":"facade00-0000-4000-8000-00000000beef","event_type":"practice.deleted","event_version":1,"occurred_at":"2026-09-09T10:00:00+02:00","entity":{"type":"practice","id":"TL-DEMO-001"}}}}},"responses":{"2XX":{"description":"Aanvaard. Elke 2xx geldt als geslaagd."},"4XX":{"description":"Afgewezen. Wordt niet opnieuw geprobeerd, behalve 408, 425 en 429."},"5XX":{"description":"Tijdelijke fout. Wordt opnieuw geprobeerd volgens de backoff."}}}},"candidate.created":{"post":{"operationId":"webhookCandidateCreated","summary":"M.I.A. stuurt candidate.created naar jouw endpoint.","description":"Een notificatie, geen datalevering: haal de actuele toestand op bij het endpoint in `links.self`.\n\nVerifieer ALTIJD de signatuur vóór je de payload gebruikt.","parameters":[{"name":"X-MIA-Event-Id","in":"header","required":true,"description":"Het event_uuid.","schema":{"type":"string"}},{"name":"X-MIA-Event-Type","in":"header","required":true,"description":"Het eventtype, bv. candidate.created.","schema":{"type":"string"}},{"name":"X-MIA-Timestamp","in":"header","required":true,"description":"Unix seconds (UTC) op moment van versturen.","schema":{"type":"string"}},{"name":"X-MIA-Signature","in":"header","required":true,"description":"v1=<hex hmac_sha256(timestamp + \".\" + raw_body, secret)>","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"event_uuid":"facade00-0000-4000-8000-00000000beef","event_type":"candidate.created","event_version":1,"occurred_at":"2026-09-09T10:00:00+02:00","entity":{"type":"candidate","id":"facade00-0000-4000-8000-0000000000c1"},"links":{"self":"https://mia.e-mederi.be/v1/candidates/facade00-0000-4000-8000-0000000000c1"}}}}},"responses":{"2XX":{"description":"Aanvaard. Elke 2xx geldt als geslaagd."},"4XX":{"description":"Afgewezen. Wordt niet opnieuw geprobeerd, behalve 408, 425 en 429."},"5XX":{"description":"Tijdelijke fout. Wordt opnieuw geprobeerd volgens de backoff."}}}},"application.created":{"post":{"operationId":"webhookApplicationCreated","summary":"M.I.A. stuurt application.created naar jouw endpoint.","description":"Een notificatie, geen datalevering: haal de actuele toestand op bij het endpoint in `links.self`.\n\nVerifieer ALTIJD de signatuur vóór je de payload gebruikt.","parameters":[{"name":"X-MIA-Event-Id","in":"header","required":true,"description":"Het event_uuid.","schema":{"type":"string"}},{"name":"X-MIA-Event-Type","in":"header","required":true,"description":"Het eventtype, bv. application.created.","schema":{"type":"string"}},{"name":"X-MIA-Timestamp","in":"header","required":true,"description":"Unix seconds (UTC) op moment van versturen.","schema":{"type":"string"}},{"name":"X-MIA-Signature","in":"header","required":true,"description":"v1=<hex hmac_sha256(timestamp + \".\" + raw_body, secret)>","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"event_uuid":"facade00-0000-4000-8000-00000000beef","event_type":"application.created","event_version":1,"occurred_at":"2026-09-09T10:00:00+02:00","entity":{"type":"application","id":"facade00-0000-4000-8000-0000000000a1"},"links":{"self":"https://mia.e-mederi.be/v1/applications/facade00-0000-4000-8000-0000000000a1"}}}}},"responses":{"2XX":{"description":"Aanvaard. Elke 2xx geldt als geslaagd."},"4XX":{"description":"Afgewezen. Wordt niet opnieuw geprobeerd, behalve 408, 425 en 429."},"5XX":{"description":"Tijdelijke fout. Wordt opnieuw geprobeerd volgens de backoff."}}}},"application.submitted":{"post":{"operationId":"webhookApplicationSubmitted","summary":"M.I.A. stuurt application.submitted naar jouw endpoint.","description":"Een notificatie, geen datalevering: haal de actuele toestand op bij het endpoint in `links.self`.\n\nVerifieer ALTIJD de signatuur vóór je de payload gebruikt.","parameters":[{"name":"X-MIA-Event-Id","in":"header","required":true,"description":"Het event_uuid.","schema":{"type":"string"}},{"name":"X-MIA-Event-Type","in":"header","required":true,"description":"Het eventtype, bv. application.submitted.","schema":{"type":"string"}},{"name":"X-MIA-Timestamp","in":"header","required":true,"description":"Unix seconds (UTC) op moment van versturen.","schema":{"type":"string"}},{"name":"X-MIA-Signature","in":"header","required":true,"description":"v1=<hex hmac_sha256(timestamp + \".\" + raw_body, secret)>","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"event_uuid":"facade00-0000-4000-8000-00000000beef","event_type":"application.submitted","event_version":1,"occurred_at":"2026-09-09T10:00:00+02:00","entity":{"type":"application","id":"facade00-0000-4000-8000-0000000000a1"},"links":{"self":"https://mia.e-mederi.be/v1/applications/facade00-0000-4000-8000-0000000000a1"}}}}},"responses":{"2XX":{"description":"Aanvaard. Elke 2xx geldt als geslaagd."},"4XX":{"description":"Afgewezen. Wordt niet opnieuw geprobeerd, behalve 408, 425 en 429."},"5XX":{"description":"Tijdelijke fout. Wordt opnieuw geprobeerd volgens de backoff."}}}},"recruitment_case.created":{"post":{"operationId":"webhookRecruitmentCaseCreated","summary":"M.I.A. stuurt recruitment_case.created naar jouw endpoint.","description":"Een notificatie, geen datalevering: haal de actuele toestand op bij het endpoint in `links.self`.\n\nVerifieer ALTIJD de signatuur vóór je de payload gebruikt.","parameters":[{"name":"X-MIA-Event-Id","in":"header","required":true,"description":"Het event_uuid.","schema":{"type":"string"}},{"name":"X-MIA-Event-Type","in":"header","required":true,"description":"Het eventtype, bv. recruitment_case.created.","schema":{"type":"string"}},{"name":"X-MIA-Timestamp","in":"header","required":true,"description":"Unix seconds (UTC) op moment van versturen.","schema":{"type":"string"}},{"name":"X-MIA-Signature","in":"header","required":true,"description":"v1=<hex hmac_sha256(timestamp + \".\" + raw_body, secret)>","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"event_uuid":"facade00-0000-4000-8000-00000000beef","event_type":"recruitment_case.created","event_version":1,"occurred_at":"2026-09-09T10:00:00+02:00","entity":{"type":"recruitment_case","id":"facade00-0000-4000-8000-0000000000d1"},"links":{"self":"https://mia.e-mederi.be/v1/recruitment-cases/facade00-0000-4000-8000-0000000000d1"}}}}},"responses":{"2XX":{"description":"Aanvaard. Elke 2xx geldt als geslaagd."},"4XX":{"description":"Afgewezen. Wordt niet opnieuw geprobeerd, behalve 408, 425 en 429."},"5XX":{"description":"Tijdelijke fout. Wordt opnieuw geprobeerd volgens de backoff."}}}},"system.ping":{"post":{"operationId":"webhookSystemPing","summary":"M.I.A. stuurt system.ping naar jouw endpoint.","description":"Een notificatie, geen datalevering: haal de actuele toestand op bij het endpoint in `links.self`.\n\nVerifieer ALTIJD de signatuur vóór je de payload gebruikt.","parameters":[{"name":"X-MIA-Event-Id","in":"header","required":true,"description":"Het event_uuid.","schema":{"type":"string"}},{"name":"X-MIA-Event-Type","in":"header","required":true,"description":"Het eventtype, bv. system.ping.","schema":{"type":"string"}},{"name":"X-MIA-Timestamp","in":"header","required":true,"description":"Unix seconds (UTC) op moment van versturen.","schema":{"type":"string"}},{"name":"X-MIA-Signature","in":"header","required":true,"description":"v1=<hex hmac_sha256(timestamp + \".\" + raw_body, secret)>","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"},"example":{"event_uuid":"facade00-0000-4000-8000-00000000beef","event_type":"system.ping","event_version":1,"occurred_at":"2026-09-09T10:00:00+02:00"}}}},"responses":{"2XX":{"description":"Aanvaard. Elke 2xx geldt als geslaagd."},"4XX":{"description":"Afgewezen. Wordt niet opnieuw geprobeerd, behalve 408, 425 en 429."},"5XX":{"description":"Tijdelijke fout. Wordt opnieuw geprobeerd volgens de backoff."}}}}},"components":{"securitySchemes":{"oauth2ClientCredentials":{"type":"oauth2","description":"Server-to-server. Wissel client_id + client_secret om voor een access token.\n\nCredentials horen in de `Authorization: Basic`-header. Er zijn geen refresh tokens:\nvraag gewoon een nieuw token aan wanneer het huidige verloopt.","flows":{"clientCredentials":{"tokenUrl":"https://mia.e-mederi.be/oauth/token","scopes":{"practices:read":"Praktijken lezen","vacancies:read":"Vacatures lezen","candidates:read":"Candidate-identiteiten lezen","applications:read":"Sollicitaties lezen","applications:write":"Sollicitaties aanmaken en verzonden sollicitaties vastleggen","recruitment-cases:read":"Recruitment cases lezen","webhooks:read":"Eigen webhook subscriptions lezen","webhooks:write":"Eigen webhook subscriptions beheren","salesforce-mirror:write":"Salesforce-records naar de M.I.A.-mirror schrijven (alleen de Salesforce Mirror-client)"}}}}},"schemas":{"Practice":{"type":"object","description":"Canonieke praktijk. Veldbetekenis ook via GET /v1/meta/practices.","properties":{"practice_id":{"type":"string","description":"Identiteit van de praktijk: de bestaande Teamleader-referentie, bewust geen UUID-veld. Het formaat verschilt per bron: een Opticare-praktijk heeft live altijd een UUID-vormige waarde van 36 tekens. Behandel de waarde als ondoorzichtige string. Staat hetzelfde ID in beide bronnen, dan wint de Mederi-praktijk. [kind: identifier]"},"name":{"type":["string","null"],"description":"Naam van de praktijk. Bij een Mederi-praktijk valt M.I.A. terug op de Mederi-kopie wanneer de Teamleader-naam ontbreekt. [kind: free_text]"},"alias":{"type":["string","null"],"description":"Korte of handelsnaam. [kind: free_text]"},"active":{"type":"boolean","description":"Mederi-praktijk: actief in Mederi én zichtbaar. Opticare-praktijk: vandaag valt binnen period.start_date en period.stop_date. [kind: derived]"},"visible":{"type":"boolean","description":"Zichtbaar in Mederi. Een Opticare-praktijk is in deze laag altijd zichtbaar. [kind: boolean]"},"language":{"type":["string","null"],"description":"Taal van de praktijk, genormaliseerd naar ISO 639-1. Elke andere bronwaarde wordt null. [kind: enum]","enum":["nl","fr",null]},"organisation_type":{"type":["string","null"],"description":"Organisatietype zoals het in Teamleader staat, ongewijzigd doorgegeven. Vrije tekst, GEEN picklist: M.I.A. valideert noch normaliseert deze waarde en belooft geen vaste set. Niet hetzelfde als het veld practice.type op een vacature. [kind: free_text]"},"period":{"type":"object","properties":{"start_date":{"type":["string","null"],"description":"Startdatum van de praktijk. [kind: date]","format":"date"},"stop_date":{"type":["string","null"],"description":"Stopdatum. 2999-12-31 betekent in de bron \"loopt door\" en wordt ongewijzigd doorgegeven. Een datum in het verleden betekent gestopt. [kind: date]","format":"date"}},"required":["start_date","stop_date"]},"identifiers":{"type":"object","properties":{"vat":{"type":["string","null"],"description":"BTW-nummer zoals in de bron. Geen formaatvalidatie: schrijfwijze verschilt, en de waarde ontbreekt vaak (live bij de meeste Opticare-praktijken). [kind: free_text]"}},"required":["vat"]},"address":{"type":"object","properties":{"street":{"type":["string","null"],"description":"Straat en huisnummer. [kind: free_text]"},"postal_code":{"type":["string","null"],"description":"Postcode als tekst. Kan ontbreken. [kind: free_text]"},"city":{"type":["string","null"],"description":"Gemeente. [kind: free_text]"},"country":{"type":["string","null"],"description":"Land zoals in de bron. Geen gegarandeerd ISO-formaat en niet altijd gevuld. [kind: free_text]"},"province":{"type":["string","null"],"description":"Provincie als vrije tekst uit de bron: geen code en geen referentielijst. Ontbreken is een geldige toestand (live bij de meeste Opticare-praktijken). Staat los van location.province op een vacature, dat wel een referentielijst is. [kind: free_text]"},"latitude":{"type":["number","null"],"description":"Breedtegraad van het postcodegebied, niet van het pand. Zie geo_precision. [kind: number]"},"longitude":{"type":["number","null"],"description":"Lengtegraad van het postcodegebied, niet van het pand. Zie geo_precision. [kind: number]"},"geo_precision":{"type":["string","null"],"description":"Nauwkeurigheid van latitude en longitude. null wanneer er geen coördinaat is. [kind: enum]","enum":["postal_code",null]}},"required":["street","postal_code","city","country","province","latitude","longitude","geo_precision"]},"contact":{"type":"object","properties":{"email":{"type":["string","null"],"description":"Algemeen e-mailadres van de praktijk. Niet gevalideerd. [kind: free_text]"},"phone":{"type":["string","null"],"description":"Telefoonnummer zoals in de bron. Geen vast formaat. [kind: free_text]"}},"required":["email","phone"]},"presentation":{"type":"object","properties":{"logo":{"type":["string","null"],"description":"Logoverwijzing uit Mederi. Formaat niet gegarandeerd. Altijd null bij een Opticare-praktijk. [kind: free_text]"},"region_text":{"type":["string","null"],"description":"Tekst over het werkgebied. Altijd null bij een Opticare-praktijk. [kind: html]"},"contact_text":{"type":["string","null"],"description":"Contacttekst. Altijd null bij een Opticare-praktijk. [kind: html]"}},"required":["logo","region_text","contact_text"]},"coach":{"type":"object","properties":{"reference":{"type":["string","null"],"description":"Interne referentie van de verantwoordelijke medewerker. Bevat nooit een naam of e-mailadres. Altijd null bij een Opticare-praktijk. [kind: identifier]"}},"required":["reference"]},"external_refs":{"type":"object","properties":{"teamleader_id":{"type":"string","description":"Herkomst van de identiteit. Vandaag gelijk aan practice_id. [kind: identifier]"},"tdm_ids":{"type":"array","description":"TDM-referenties: een relatie, geen identiteit. Nul, één of meer strings. Altijd leeg bij een Opticare-praktijk. [kind: list]","items":{"type":"string"}}},"required":["teamleader_id","tdm_ids"]},"warnings":{"type":"array","description":"Datakwaliteitssignalen. Meestal leeg. Een lijst met nul of meer van de toegestane waarden. [kind: enum]","items":{"type":"string","enum":["multiple_active_rows","source_record_missing"]}}},"required":["practice_id","name","alias","active","visible","language","organisation_type","period","identifiers","address","contact","presentation","coach","external_refs","warnings"]},"Vacancy":{"type":"object","description":"Canonieke vacature. Veldbetekenis en referentielijsten via GET /v1/meta/vacancies.","properties":{"uuid":{"type":"string","description":"Identiteit van de vacature, uitgegeven door Mederi. [kind: identifier]"},"title":{"type":["string","null"],"description":"Titel: de eerste niet-lege van publieke kop, frontendnaam en interne naam. [kind: free_text]"},"slug":{"type":["string","null"],"description":"Pad op de publieke site, inclusief taalvoorvoegsel: vacatures/ (nl) of postesvacants/ (fr). [kind: free_text]"},"teaser":{"type":["string","null"],"description":"Korte inleiding. [kind: free_text]"},"language":{"type":["string","null"],"description":"Taal van de vacature. De bron kent NL en FR; genormaliseerd naar ISO 639-1. Andere waarden worden null. [kind: enum]","enum":["nl","fr",null]},"practice":{"type":"object","properties":{"legacy_reference":{"type":["string","null"],"description":"practice_id van de praktijk (GET /v1/practices/{practice_id}). Live verwijst dit naar een Mederi- of een Opticare-praktijk. De bron dwingt geen referentiële integriteit af. [kind: reference]"},"name":{"type":["string","null"],"description":"Praktijknaam zoals vastgelegd bij het aanmaken van de vacature. Momentopname, wordt niet bijgewerkt. [kind: free_text]"},"type":{"type":["string","null"],"description":"Uit welke keuzelijst de praktijk in het Mederi-vacatureformulier gekozen werd. Momentopname. Dit is NIET het organisatietype van de praktijk: dat staat als organisation_type in /v1/practices. [kind: enum]","enum":["Mederi","Opticare",null]}},"required":["legacy_reference","name","type"]},"location":{"type":"object","properties":{"province":{"type":"object","properties":{"code":{"type":["string","null"],"description":"Provinciecode uit de Mederi-referentielijst. Kan ontbreken: het formulier laat \"geen provincie\" toe. [kind: reference_list]"},"label":{"type":["string","null"],"description":"Label bij location.province.code, opgezocht in dezelfde referentielijst. null bij een onbekende code. [kind: derived]"}},"required":["code","label"]},"region":{"type":["string","null"],"description":"Regio als vrije tekst. [kind: html]"},"postal_code":{"type":"null","description":"Gereserveerd voor een gestructureerde vacaturelocatie. Mederi heeft hier nog geen bron voor; altijd null. [kind: reserved]"},"city":{"type":"null","description":"Gereserveerd voor een gestructureerde vacaturelocatie. Mederi heeft hier nog geen bron voor; altijd null. [kind: reserved]"},"country":{"type":"null","description":"Gereserveerd voor een gestructureerde vacaturelocatie. Mederi heeft hier nog geen bron voor; altijd null. [kind: reserved]"},"latitude":{"type":"null","description":"Gereserveerd voor een gestructureerde vacaturelocatie. Mederi heeft hier nog geen bron voor; altijd null. [kind: reserved]"},"longitude":{"type":"null","description":"Gereserveerd voor een gestructureerde vacaturelocatie. Mederi heeft hier nog geen bron voor; altijd null. [kind: reserved]"}},"required":["province","region","postal_code","city","country","latitude","longitude"]},"position":{"type":"object","properties":{"code":{"type":["string","null"],"description":"Functiecode uit de Mederi-referentielijst. [kind: reference_list]"},"label":{"type":["string","null"],"description":"Label bij position.code, opgezocht in dezelfde referentielijst. null bij een onbekende code. [kind: derived]"}},"required":["code","label"]},"employment":{"type":"object","properties":{"time":{"type":"object","properties":{"code":{"type":["string","null"],"description":"Ruwe bronwaarde. Het Mederi-formulier schrijft Fulltime, Parttime of ParttimeFulltime. Gebruik employment.time.value voor logica. [kind: legacy_code]"},"value":{"type":["string","null"],"description":"Genormaliseerde arbeidsduur. null bij een onbekende bronwaarde. [kind: enum]","enum":["full_time","part_time","full_or_part_time",null]}},"required":["code","value"]},"contract":{"type":"object","properties":{"code":{"type":["string","null"],"description":"Ruwe bronwaarde. Het Mederi-formulier schrijft Werknemer, Zelfstandig of \"Werknemer - zelfstandig\". Gebruik employment.contract.value voor logica. [kind: legacy_code]"},"value":{"type":["string","null"],"description":"Genormaliseerd statuut. null bij een onbekende bronwaarde. [kind: enum]","enum":["employee","self_employed","employee_or_self_employed",null]}},"required":["code","value"]}},"required":["time","contract"]},"content":{"type":"object","properties":{"intro":{"type":["string","null"],"description":"Inleiding. HTML zoals in Mederi ingevoerd, soms met geplakte opmaak. [kind: html]"},"profile":{"type":["string","null"],"description":"Gezocht profiel. HTML. [kind: html]"},"tasks":{"type":["string","null"],"description":"Takenpakket. HTML. [kind: html]"},"offer":{"type":["string","null"],"description":"Aanbod. HTML. [kind: html]"},"contact":{"type":["string","null"],"description":"Contacttekst. HTML. [kind: html]"}},"required":["intro","profile","tasks","offer","contact"]},"image":{"type":["string","null"],"description":"Afbeeldingsverwijzing uit Mederi. Formaat niet gegarandeerd. [kind: free_text]"},"status":{"type":"object","properties":{"code":{"type":["string","null"],"description":"Ruwe bronwaarde 1, 2 of 3. De Mederi-backend zet bij aanmaak 1 en heeft geen schermen om die waarde te wijzigen. [kind: legacy_code]"},"value":{"type":["string","null"],"description":"Genormaliseerde status van een legacy workflow die niet in gebruik is. Bepaalt NIET of een vacature online staat: gebruik daarvoor visible en published. [kind: enum]","enum":["created","open","filled",null]}},"required":["code","value"]},"visible":{"type":"boolean","description":"Actief gezet in Mederi. Verwijderde vacatures worden nooit teruggegeven. [kind: boolean]"},"published":{"type":"boolean","description":"Staat online volgens de regel van de publieke site: visible én (geen display_date of display_date vandaag of vroeger). [kind: derived]"},"display_date":{"type":["string","null"],"description":"Online vanaf. null = meteen. Een datum in de toekomst betekent gepland. [kind: date]","format":"date"},"created_at":{"type":["string","null"],"description":"Aangemaakt. [kind: date_time]","format":"date-time"},"updated_at":{"type":["string","null"],"description":"Laatst bewerkt. [kind: date_time]","format":"date-time"},"valid_through":{"type":"null","description":"Gereserveerd voor een gestructureerde vacaturelocatie. Mederi heeft hier nog geen bron voor; altijd null. [kind: reserved]"},"seeking_nurse_code":{"type":["string","null"],"description":"Ruwe bronwaarde waarvan de betekenis nog niet bevestigd is. Niet interpreteren. [kind: legacy_code]"}},"required":["uuid","title","slug","teaser","language","practice","location","position","employment","content","image","status","visible","published","display_date","created_at","updated_at","valid_through","seeking_nurse_code"]},"FieldMeta":{"type":"object","description":"Beschrijving van één veld. allowed_values alleen bij kind enum. observed_values beschrijft wat live voorkomt en is nooit een lijst van toegestane waarden.","required":["path","json_type","nullable","kind","description","source","picklist","allowed_values","reference_list","references","observed_values","example"],"properties":{"path":{"type":"string","description":"Pad in het contract, met punten."},"json_type":{"description":"JSON-type, of een lijst met \"null\" erbij wanneer nullable."},"nullable":{"type":"boolean"},"kind":{"type":"string","enum":["identifier","reference","free_text","html","enum","reference_list","legacy_code","derived","boolean","date","date_time","number","list","reserved"]},"description":{"type":"string"},"source":{"type":"string","enum":["mederi","teamleader_via_mederi","mia_derived","none"]},"picklist":{"type":"boolean","description":"true bij enum en reference_list."},"allowed_values":{"type":["array","null"],"items":{"type":"object","required":["value"],"properties":{"value":{"type":"string"},"description":{"type":"string"}}}},"reference_list":{"type":["string","null"],"description":"Sleutel in reference_lists."},"references":{"type":["string","null"],"description":"resource.veld waarnaar verwezen wordt."},"observed_values":{"type":["array","null"],"items":{"type":"object","properties":{"value":{"type":"string"},"note":{"type":"string"}}}},"example":{"description":"Synthetisch voorbeeld."}}},"ReferenceValue":{"type":"object","required":["code","label","active"],"properties":{"code":{"type":"string"},"label":{"type":"string"},"active":{"type":"boolean","description":"Vandaag kiesbaar in Mederi."}}},"ResourceMeta":{"type":"object","required":["resource","endpoint","identifier","schema_version","fields","reference_lists","kinds","sources"],"properties":{"resource":{"type":"string","enum":["practices","vacancies"]},"endpoint":{"type":"string"},"identifier":{"type":"string"},"schema_version":{"type":"integer"},"fields":{"type":"array","items":{"$ref":"#/components/schemas/FieldMeta"}},"reference_lists":{"type":"object","additionalProperties":{"type":"object","properties":{"used_by":{"type":"array","items":{"type":"string"}},"description":{"type":"string"},"source":{"type":"string"},"values":{"type":"array","items":{"$ref":"#/components/schemas/ReferenceValue"}}}}},"kinds":{"type":"object","additionalProperties":{"type":"string"}},"sources":{"type":"object","additionalProperties":{"type":"string"}}}},"SuccessEnvelope":{"type":"object","description":"Elke /v1-respons heeft deze vorm.","required":["success","data","meta"],"properties":{"success":{"type":"boolean","const":true},"data":{"description":"De resource, of een lijst ervan."},"meta":{"$ref":"#/components/schemas/Meta"}}},"ErrorEnvelope":{"type":"object","required":["success","error","meta"],"properties":{"success":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"issue":{"type":"string"}}}}}},"meta":{"$ref":"#/components/schemas/Meta"}}},"Meta":{"type":"object","required":["request_id","api_version"],"properties":{"request_id":{"type":"string","format":"uuid"},"api_version":{"type":"string","const":"v1"},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"Pagination":{"type":"object","required":["page","per_page","total","total_pages"],"properties":{"page":{"type":"integer","minimum":1},"per_page":{"type":"integer","minimum":1,"maximum":100},"total":{"type":"integer","minimum":0},"total_pages":{"type":"integer","minimum":0}}},"TokenResponse":{"type":"object","required":["access_token","token_type","expires_in","scope"],"properties":{"access_token":{"type":"string"},"token_type":{"type":"string","const":"Bearer"},"expires_in":{"type":"integer"},"scope":{"type":"string"}}},"OAuthError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","enum":["invalid_request","invalid_client","invalid_scope","unsupported_grant_type","server_error"]},"error_description":{"type":"string"}}},"ApplicationIntake":{"type":"object","description":"Nieuwe sollicitatie. Stuur `Idempotency-Key` mee om herhaling veilig te maken.","required":["vacancy_uuid","email"],"properties":{"vacancy_uuid":{"type":"string"},"email":{"type":"string","format":"email"},"consent_flag":{"type":["boolean","null"]},"entrypoint_raw":{"type":["string","null"]},"entrypoint_code":{"type":["string","null"]},"practice_id":{"type":["string","null"]}}},"ApplicationSubmission":{"type":"object","description":"Verzonden websitesollicitatie. Alleen `cv` is verplicht: de overige velden zijn in het webformulier niet allemaal afdwingbaar.","required":["cv"],"properties":{"first_name":{"type":["string","null"]},"last_name":{"type":["string","null"]},"city":{"type":["string","null"]},"email":{"type":["string","null"],"format":"email"},"phone":{"type":["string","null"]},"diploma":{"type":["string","null"]},"profile":{"type":["string","null"]},"motivation":{"type":["string","null"]},"cv":{"type":"object","description":"Verwijzing naar het CV. M.I.A. bewaart de URL, niet de bytes.","required":["file_name","url"],"properties":{"file_name":{"type":"string"},"url":{"type":"string","format":"uri","description":"Absolute https-URL."},"content_type":{"type":["string","null"]}}}}},"WebhookIntake":{"type":"object","required":["url","event_types"],"properties":{"url":{"type":"string","format":"uri","description":"Https, publiek bereikbaar. Geen privaat of link-local adres."},"event_types":{"type":"array","items":{"type":"string","enum":["vacancy.created","vacancy.updated","vacancy.deleted","practice.created","practice.updated","practice.deleted","candidate.created","application.created","application.submitted","recruitment_case.created","system.ping"]}}}},"WebhookPatch":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"event_types":{"type":"array","items":{"type":"string","enum":["vacancy.created","vacancy.updated","vacancy.deleted","practice.created","practice.updated","practice.deleted","candidate.created","application.created","application.submitted","recruitment_case.created","system.ping"]}},"status":{"type":"string","enum":["active","disabled"]}}},"WebhookEvent":{"type":"object","description":"De payload van een uitgaande webhook. Notificatie, geen snapshot.","required":["event_uuid","event_type","event_version","occurred_at"],"properties":{"event_uuid":{"type":"string","format":"uuid"},"event_type":{"type":"string","enum":["vacancy.created","vacancy.updated","vacancy.deleted","practice.created","practice.updated","practice.deleted","candidate.created","application.created","application.submitted","recruitment_case.created","system.ping"]},"event_version":{"type":"integer","const":1},"occurred_at":{"type":"string","format":"date-time"},"entity":{"type":"object","properties":{"type":{"type":"string"},"id":{"type":["string","null"]}}},"links":{"type":"object","properties":{"self":{"type":"string","format":"uri"}}}}}}}}