Je hebt Javascript nodig om deze website te kunnen gebruiken. Pas je browserinstellingen in om verder te gaan!
Legacy (v1)

Submitting a candidate

Maintain legacy Version 1 candidate submissions through the /create-user endpoint, including interactions and custom fields.

Learn how to create or update a candidate within the applicant tracking system (ATS) of your education region.

This guide explains how to call the /create-user endpoint, how to structure the payload, and how the API processes candidate data.

Endpoint overview

To submit a candidate, send a POST request to:

https://onderwijsregio.onderwijsin.nl/api/v1/create-user

Each request must include:

  • An api-key header
  • A request body encoded as application/json

Upsert behavior

As of API version 1.1.0, the /create-user endpoint uses upsert logic.

  • The candidate’s email address is used as the unique identifier.
  • If a candidate with the same email already exists, the existing record is updated.
  • If multiple records with the same email exist, only the first match is updated.

This allows you to safely resend data for the same candidate without creating duplicates.

Request payload

The request body contains the candidate data. The minimum required fields are:

  • naam
  • email
  • privacy_consent

All other fields are optional and may be included depending on your use case and region configuration.

The payload must conform to the schema returned by the /schema endpoint.

Supported field values

Some fields only accept predefined values. The most important standardized options are listed below.

nieuw
matchen
oriënteren
voorbereiden
in opleiding
werkzaam
uitgestroomd

Always refer to the /schema endpoint for the authoritative and most up-to-date list of allowed values.

Interactions

You can optionally include one or more interactions when submitting a candidate. This is useful when a candidate submits their details as part of an activity or contact moment.

  • Interactions can be sent as a single object or an array.
  • Each interaction requires at least a date and one or more interaction types.

A legacy single-interaction field is still supported for backward compatibility. It is preferred to use the interacties property.

Custom fields

In addition to the shared schema, regions may define custom fields. These fields are unique per region and are sent as an array under custom_fields.

Each custom field consists of:

  • field_name: the exact name from the schema
  • field_value: the value for that field

If your payload contains custom fields that are not defined for your region, they are ignored and do not cause the request to fail. Valid custom fields in the same payload are still processed.

Use the /schema endpoint to discover which custom fields are available for your region.

Example request

POST https://onderwijsregio.onderwijsin.nl/api/v1/create-user
Content-Type: application/json
api-key: <your-api-key>
request.json
{
  "naam": "Pietje Puk",
  "email": "pietjepuk@onderwijsin.nl",
  "privacy_consent": true,
  "fase": "nieuw",
  "interacties": {
    "datum": "2024-07-05",
    "soort": ["Inschrijving activiteit"],
    "samenvatting": "Aanmelding voor informatieavond"
  },
  "custom_fields": [
    {
      "field_name": "Voorkeur vak",
      "field_value": "Wiskunde"
    }
  ]
}

Responses

Unauthorized

response.json
{
  "statusCode": 401,
  "statusMessage": "Not authorized",
  "message": "Invalid api key"
}

Invalid payload

response.json
{
  "statusCode": 400,
  "statusMessage": "Bad request",
  "message": "Please check your request body.",
  "data": {
    "errors": ["Detailed validation errors"]
  }
}

Server error

response.json
{
  "statusCode": 500,
  "statusMessage": "Server error",
  "message": "Something went wrong creating the record. Please try again."
}

Success

response.json
{
  "statusCode": 200,
  "message": "Candidate was created successfully",
  "data": {
    "candidate": {
      "id": "recGHIjkl12345",
      "name": "Test",
      "email": "test@onderwijsin.nl",
      "phase": "nieuw",
      "privacy_consent": true,
      "regions": {
        "count": 1,
        "ids": ["recABCdef12345"],
        "origin": ["recABCdef12345"]
      },
      "timestamps": {
        "created_at": "2025-12-19T16:57:19.000Z",
        "original_created_at": "2025-12-19T16:57:19.136Z",
        "updated_at": "2025-12-19T17:10:49.000Z"
      },
      "created_by": {
        "id": "usrABCdef12345",
        "name": "Onderwijs in",
        "email": "jacob@onderwijsin.nl"
      },
      "updated_by": {
        "id": "usrABCdef12345",
        "name": "Onderwijs in",
        "email": "jacob@onderwijsin.nl"
      },
      "custom_fields": {
        "vakken": ["wiskunde"]
      }
    },
    "interactions": [
      {
        "name": "Telefonisch - 2023-01-01",
        "type": ["Telefonisch"],
        "summary": "Ingeschreven voor de activiteit XYZ",
        "performed_at": "2023-01-01T00:00:00.000Z",
        "created_at": "2025-12-19T22:42:59.000Z",
        "created_by": {
          "id": "usrABCdef12345",
          "name": "Onderwijs in",
          "email": "jacob@onderwijsin.nl"
        }
      }
    ]
  }
}

Keep in touch with the latest

Sign up for our monthly deep dives - straight to your inbox.