Documentation

Open Personen offers:

  • Implementation of the Haal Centraal BRP bevragen API specification.

  • Extension to connect with a StUF-BG compatible service to serve real personal data via the BRP API.

  • Extension to use a local database to provide test data via the BRP API.

  • Conversion service to convert BRP API requests to StUF-BG requests and StUF-BG responses to BRP API responses (future release).

The Source code is available for non-commercial use.

Getting started

To get you started, you might find some of these links relevant:

Introduction

Open Personen offers an implementation of the Haal Centraal BRP bevragen API specification and can connect to a StUF-BG service to retrieve personal data. In addition, Open Personen can simply convert StUF-BG messages to BRP API messages without an actual connection. Finally, you can use Open Personen with a test set that you either import or construct yourself via the user interface.

Open Personen meets the need for several other components to request personal data and to link persons (e.g. to a zaak in the Open Zaak).

The project is designed line with the Common Ground model and works well with other API’s and components in this model.

Welcome screen of Open Personen

Source code

The source code for this project is available on Github.

This project is not open-source but freely available for non-commercial use. It is licensed under the Business Source License (BSL) 1.1 and will become open-source after some time, as stated in the Change Date of the license parameters.

After the Change Date the Licensed Work, being this project, will be available under the European Union Public Licence (EUPL) 1.2.

Want to know more? Read Why this license?

This project makes use of various open-source Python libraries and npm packages under the hood.

Why this license?

Open Personen is released under the Business Source License (BSL) 1.1. To answer questions about why we choose this license, please continue reading.

What is the BSL?

The Business Source License (BSL) is a license like any other that states certain permissions, meaning what you can and cannot do with the product.

The BSL basically allows you, or your organization, to do everything except to use it in production. You can still use it in production but you are required to purchase it from us under a different license.

The BSL also states that after a certain amount of time or when development costs are covered (either by paid licenses or otherwise), the product is released under the EUPL. This is not something we say casually, this is actually stated in the BSL license document.

Why not release it directly under the EUPL?

In the Common Ground community, the projects commisioned by the VNG, a municipality or any other public organization, are typically licensed under the EUPL. These projects, including the code development, are paid with public money from these public organizations.

Open Personen was initiated, developed and paid for by us, Maykin Media. Although we would love to license Open Personen under the EUPL directly, this would mean we would not get paid for the development.

Why not EUPL and charge for your consultancy services?

We really want to create a quality product that consists of a proper testsuite, documentation, easy installation experience and so on. We see some projects that are open source but are either of poor quality or lack documentation. Effectively, this means those open source products are unusable.

By creating a quality open source product, anyone can offer their (consultancy) services around it. We do this as well and we’re pretty good at it but some parties are just better in marketing their services than we are. We are really good at developing quality products and consultancy. Hence, we primarily will get our money from developing. Using the BSL allows us to do just that.

Can I use Open Personen?

Yes! You personally, or your organization can use this project for demo and test purposes or in pilot projects. If you want to use it in production, contact Maykin Media for an appropriate license.

Can I use Open Personen in production?

Yes, just not with the BSL. You can contact Maykin Media for an appropriate license to use it in production.

Why did we choose BSL specifically?

The BSL allows us to develop this project almost as an open source project and gives organizations and other developers a chance to try it out, use it for testing, look at the code and make contributions.

The BSL also enforces the eventual release of this project as open source, in this case the EUPL. This explicit promise is very important to us.

Can I contribute to Open Personen?

Ofcourse! Within the Common Ground community there are many pilot projects that require a product offering the Haal Centraal BRP API. These projects can benefit from your contributions.

We understand though, that contributing to a project that is not completely free to use in production is less attractive. We really hope that we can release the project under the EUPL as soon as possible.

What are alternative licenses?

For information about licensing arrangements for production usage of the Software, please contact Maykin Media.

Paid licenses will help the development of this project and will speed up the release under the EUPL.

API-specifications

Open Personen adheres to the API-specifications as described by the VNG standard for “Haal Centraal BRP bevragen”. The interaction between these API’s can be found there as well.

Supported API versions

The following API’s are available in Open Personen:

API

Specification version(s)

BRP bevragen API

1.0.0 ( Redoc, Swagger )

Unsupported API’s

Some of the Haal Centraal API’s are related to the BRP bevragen API but have not reached a stable version yet. We choose to only support stable API specifications in Open Personen. They are mentioned here to give readers a complete overview.

These API’s are NOT available in Open Personen

API

Specification version(s)

BRP update API

(unknown)

BRP bewoning API

(unknown)

BRP historie bevragen API

(unknown)

BRP tabellen bevragen API

(unknown)

Reisdocumenten bevragen API

(unknown)

Installation

In addition to making its source code available publicly, Open Personen offers and maintains a minimal setup that works out-of-the-box for simple use cases.

For the sake of simplicity, we have chosen to use Docker and Docker Compose for this.

Quickstart

Warning

The quickstart instructions are only intended for development and testing purposes. Do not use the quickstart instructions in a production setting. The certificate and certificate key stored in the StUF-BG Client will be exposed when making an API call to an external StUF-BG service.

The default docker-compose settings have some convenience settings to get started quickly and these should never be used for anything besides testing:

  • A default secret is set in the SECRET_KEY environment variable

  • A predefined database and database account is used.

  • The demo data source is used as backend.

  • API authorizations are disabled.

With the above remarks in mind, let’s go:

  1. Download the docker-compose file:

    $ wget https://raw.githubusercontent.com/maykinmedia/open-personen/master/docker-compose-quickstart.yml -O docker-compose.yml
    
    PS> wget https://raw.githubusercontent.com/maykinmedia/open-personen/master/docker-compose-quickstart.yml -Odocker-compose.yml
    
  2. Start the Docker containers:

    $ docker-compose up -d
    
  3. Import a test dataset of persons. You can use the test dataset provided by the RvIG. Just copy the ODS-file URL to the command below:

    $ docker-compose exec web src/manage.py import_demodata --url <url>
    
  4. The API should now be available on http://localhost:8000/api/. You can retrieve a person via the BRP API in your webbrowser:

    http://localhost:8000/api/ingeschrevenpersonen/999990676
    
Next steps

You can read how to add persons to this test dataset using this Demo backend. If you want to expose real persons you can connect Open Personen to a StUF-BG backend.

You can also read on how to enable Authorizations.

Authorizations

Open Personen uses API-tokens as authorizations mechanism. You can connect an API-token to a user for identification.

Any backend change requires a change in the environment that are present when the application is launched. Add this setting to enable authorizations:

OPENPERSONEN_USE_AUTHENTICATION=True
Manage API tokens

You can manage API-tokens in the admin interface or create tokens from the command line.

  1. Point your webbrowser to the admin interface, for example: http://localhost:8000/admin/

  2. Login with the username and password of a superuser (see Quickstart).

  3. Navigate to API Autorisaties > Tokens

  4. Click on Token toevoegen

  5. Select a Gebruiker to link the API token to an existing user. Click on Opslaan en opnieuw bewerken.

  6. The Key field should now have a value like e5640c8bde0b9b1a168595d798df721ef12bbbef

  7. You can now make API calls using this API-token. For example:

    $ curl -i -H "Accept: application/json" -H "Authorization: Token e5640c8bde0b9b1a168595d798df721ef12bbbef" http://localhost:8000/api/ingeschrevenpersonen/999990676
    

    You can not access the API from your browser anymore, since you need to pass the proper authorization header.

  8. You can also create API-tokens from the command line:

    $ python src/manage.py generate_token demo
    API token: e5640c8bde0b9b1a168595d798df721ef12bbbef
    
    $ docker-compose exec web src/manage.py generate_token demo
    API token: e5640c8bde0b9b1a168595d798df721ef12bbbef
    

    This causes a user demo to be created with the generated token. By default, this user has no permission to access the admin interface.

Environment configuration reference

Open Personen can be ran both as a Docker container or directly on a VPS or dedicated server. It relies on other services, such as database and cache backends, which can be configured through environment variables.

Available environment variables
Required settings
  • DJANGO_SETTINGS_MODULE: which environment settings to use. Available options: - openpersonen.conf.docker - openpersonen.conf.dev - openpersonen.conf.ci

  • SECRET_KEY: secret key that’s used for certain cryptographic utilities. You should generate one via [miniwebtool](https://www.miniwebtool.com/django-secret-key-generator/)

  • ALLOWED_HOSTS: A comma separated (without spaces!) list of domains that serve the installation. Used to protect against Host header attacks. Defaults to * for the docker environment and defaults to 127.0.0.1,localhost for the dev environment.

Core settings
  • OPENPERSONEN_BACKEND: The data source to use for obtaining person data. Can be any of the values below:

    • openpersonen.contrib.demo.backend.default (default)

    • openpersonen.contrib.stufbg.backend.default

  • OPENPERSONEN_USE_AUTHENTICATION: Require an API-token to access the API. Defaults to True.

Database settings
  • DB_HOST: Hostname of the PostgreSQL database. Defaults to db for the docker environment, otherwise defaults to localhost.

  • DB_USER: Username of the database user. Defaults to openpersonen,

  • DB_PASSWORD: Password of the database user. Defaults to openpersonen,

  • DB_NAME: Name of the PostgreSQL database. Defaults to openpersonen,

  • DB_PORT: Port number of the database. Defaults to 5432.

Other settings
  • ADMINS: Comma seperated list (without spaces!) of e-mail addresses to sent an email in the case of any errors. Defaults to an empty list.

  • SITE_ID: The database ID of the site object. Defaults to 1.

  • DEBUG: Used for more traceback information on development environment. Various other security settings are derived from this setting! Defaults to True for the dev environment, otherwise defaults to False.

  • IS_HTTPS: Used to construct absolute URLs and controls a variety of security settings. Defaults to the inverse of DEBUG.

  • SUBPATH: If hosted on a subpath, provide the value here. If you provide /gateway, Open Personen assumes its running at the base URL: https://somedomain/gateway/. Defaults to an empty string.

  • SENTRY_DSN: URL of the sentry project to send error reports to. Defaults to an empty string (ie. no monitoring).

Specifying the environment variables

There are two strategies to specify the environment variables:

  • provide them in a .env file

  • start the Open Personen processes (with uwsgi/gunicorn/celery) in a process manager that defines the environment variables

Providing a .env file

This is the most simple setup and easiest to debug. The .env file must be at the root of the project - i.e. on the same level as the src directory ( NOT in the src directory).

The syntax is key-value:

SOME_VAR=some_value
OTHER_VAR="quoted_value"
Provide the envvars via the process manager

If you use a process manager (such as supervisor/systemd), use their techniques to define the envvars. The Open Personen implementation will pick them up out of the box.

Data sources

Data is provided through a certain backend in Open Personen. A backend provides the technical details to connect to a certain data source.

There are currently 2 backends available:

  • StUF-BG - Allows Open Personen to connect to a StUF-BG compatible service to retrieve person data.

  • Demo - Provides a local testset of persons to use for testing purposes.

Demo backend

This backend provides a local testset of persons to use for testing purposes. No external service is needed, all data is stored and retrieved a from the local database.

Installation

Any backend change requires a change in the environment that are present when the application is launched. Add this setting to use the Demo backend:

OPENPERSONEN_BACKEND=openpersonen.contrib.demo.backend.default
Configuration

The demo backend does not require any additional configuration but you probably want to load a predefined testset of persons or you can create test persons yourself.

Import testset

An example testset can be found on the Rijksdienst voor Identiteitsgegevens (RvIG) website. You can load this set directly into the demo backend.

$ python src/manage.py import_demodata --url=<testset url>
$ docker-compose exec web src/manage.py import_demodata --url=<testset url>

Example data

To give you some quick insights in the testset that is provided, here’s a family tree present in this testset:

  • C.F. Wiegman (999990676) partner of A.H. Holthuizen (999990421), children:

    • A. Holthuizen (999991978) no partner

      • no children

    • A.F. Holthuizen (999991760) no partner

      • no children

    • M. du Burck-Holthuizen (999993392) partner of J.L. du Burck (999991589), children:

      • M. du Burck (999991115) no partner

        • no children

      • C. Djibet-du Burck (999992223) partner of R. Djibet (999994347), children:

        • N.Q. Djibet (999994281) no partner

          • no children

        • F.Z. Djibet (999993264) no partner

          • no children

        • N.H. Djibet (999994177) partner of K.S.A. Bronwaßer (999995224), children:

          • R.S. Bronwasser (999992612)

Create test persons

When using the demo backend you can create and delete persons freely. The management interface allows you to create, update and delete persons and manage their basic properties. This can be usefull when using predefined BSNs in a test environment that don’t match up with an existing testset or if you want to test specific field values or relations between persons.

  1. If you haven’t done so already, make a superuser account to login to the admin:

    $ python src/manage.py createsuperuser
    
    $ docker-compose exec web src/manage.py createsuperuser
    
  2. Point your webbrowser to the admin interface, for example: http://localhost:8000/admin/

  3. Login with the username and password from step 1.

  4. Navigate to Demo backend > Personen

  5. You can edit, create or delete persons that become available via the API.

Next steps

You can continue to read how to enable Authorizations.

StUF-BG backend

This backend allows Open Personen to connect to a StUF-BG compatible service to retrieve person data.

Installation

Any backend change requires a change in the environment that are present when the application is launched. Add this setting to use the StUF-BG backend:

OPENPERSONEN_BACKEND=openpersonen.contrib.stufbg.backend.default

The StUF-BG backend requires authorizations to be enabled. You can do this by setting:

OPENPERSONEN_USE_AUTHENTICATION=True
Configuration

The StUF-BG backend requires you to setup some connection settings within the admin interface of Open Personen.

  1. If you haven’t done so already, make a superuser account to login to the admin:

    $ python src/manage.py createsuperuser
    
    $ docker-compose exec web src/manage.py createsuperuser
    
  2. Point your webbrowser to the admin interface, for example: http://localhost:8000/admin/

  3. Login with the username and password from step 1.

  4. Navigate to StUF-BG backend > StUF-BG Client

  5. Fill in all relevant fields and click on OPSLAAN.

Next steps

You can continue to read how to enable Authorizations.

In depth
Implementation

The StUF-BG specification does not map exactly to the Haal Centraal BRP API. There are several implementation details that are documented below, starting with a mapping of all API to StUF-BG attributes.

If an attribute mapping has no design decision remarks, the attribute value is not changed.

StUF-BG attribute notation
  • attribute - API value is derived directly from attribute.

  • FUNCTION(attribute) - API value is derived from attribute via a specific FUNCTION. These FUNCTIONs should be self explanatory.

  • “value” - API value is staticly set to this “value”.

  • (attribute == “value”) - API value is derived from simple calculation.

  • (calculated) - API value is derived from complex calculation. The remarks should indicate how exactly.

Ingeschreven persoon

API attribute

StUF-BG attribute

Design decision remarks

burgerservicenummer

inp.bsn

geheimhoudingPersoonsgegevens

inp.indicatieGeheim

naam.geslachtsnaam

geslachtsnaam

naam.voorletters

voorletters

naam.voornamen

voornamen

naam.voorvoegsel

voorvoegselGeslachtsnaam

naam.inOnderzoek.geslachtsnaam

(inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

naam.inOnderzoek.voornamen

(inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

naam.inOnderzoek.voorvoegsel

(inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

naam.inOnderzoek.datumIngangOnderzoek.dag

null

naam.inOnderzoek.datumIngangOnderzoek.datum

null

naam.inOnderzoek.datumIngangOnderzoek.jaar

null

naam.inOnderzoek.datumIngangOnderzoek.maand

null

naam.aanhef

(calculated)

See features

naam.aanschrijfwijze

(calculated)

See features

naam.gebruikInLopendeTekst

(calculated)

See features

naam.aanduidingNaamgebruik

aanduidingNaamgebruik

geboorte.datum.dag

DAY(geboortedatum)

geboorte.datum.datum

geboortedatum

geboorte.datum.jaar

YEAR(geboortedatum)

geboorte.datum.maand

MONTH(geboortedatum)

geboorte.land.code

COUNTRY_CODE(inp.geboorteLand)

geboorte.land.omschrijving

inp.geboorteLand

geboorte.plaats.code

CITY_CODE(inp.geboorteplaats)

geboorte.plaats.omschrijving

inp.geboorteplaats

geboorte.inOnderzoek.datum

(inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

geboorte.inOnderzoek.land

(inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

geboorte.inOnderzoek.plaats

(inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

geboorte.inOnderzoek.datumIngangOnderzoek.dag

null

geboorte.inOnderzoek.datumIngangOnderzoek.datum

null

geboorte.inOnderzoek.datumIngangOnderzoek.jaar

null

geboorte.inOnderzoek.datumIngangOnderzoek.maand

null

geslachtsaanduiding

geslachtsaanduiding

leeftijd

(calculated)

See features

datumEersteInschrijvingGBA.dag

DAY(inp.datumInschrijving)

datumEersteInschrijvingGBA.datum

inp.datumInschrijving

datumEersteInschrijvingGBA.jaar

YEAR(inp.datumInschrijving)

datumEersteInschrijvingGBA.maand

MONTH(inp.datumInschrijving)

kiesrecht.europeesKiesrecht

(ing.aanduidingEuropeesKiesrecht == 2)

StUF-BG value “2” evaluates to “true”.

kiesrecht.uitgeslotenVanKiesrecht

(ing.aanduidingUitgeslotenKiesrecht == A)

StUF-BG value “A” evaluates to “true”.

kiesrecht.einddatumUitsluitingEuropeesKiesrecht.dag

null

kiesrecht.einddatumUitsluitingEuropeesKiesrecht.datum

null

kiesrecht.einddatumUitsluitingEuropeesKiesrecht.jaar

null

kiesrecht.einddatumUitsluitingEuropeesKiesrecht.maand

null

kiesrecht.einddatumUitsluitingKiesrecht.dag

null

kiesrecht.einddatumUitsluitingKiesrecht.datum

null

kiesrecht.einddatumUitsluitingKiesrecht.jaar

null

kiesrecht.einddatumUitsluitingKiesrecht.maand

null

inOnderzoek.burgerservicenummer

(inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

inOnderzoek.geslachtsaanduiding

(inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

inOnderzoek.datumIngangOnderzoek.dag

null

inOnderzoek.datumIngangOnderzoek.datum

null

inOnderzoek.datumIngangOnderzoek.jaar

null

inOnderzoek.datumIngangOnderzoek.maand

null

nationaliteit.aanduidingBijzonderNederlanderschap

inp.aanduidingBijzonderNederlanderschap

nationaliteit.datumIngangGeldigheid.dag

DAY(inp.heeftAlsNationaliteit.inp.datumVerkrijging)

nationaliteit.datumIngangGeldigheid.datum

inp.heeftAlsNationaliteit.inp.datumVerkrijging

nationaliteit.datumIngangGeldigheid.jaar

YEAR(inp.heeftAlsNationaliteit.inp.datumVerkrijging)

nationaliteit.datumIngangGeldigheid.maand

MONTH(inp.heeftAlsNationaliteit.inp.datumVerkrijging)

nationaliteit.nationaliteit.code

inp.heeftAlsNationaliteit.gerelateerde.code

nationaliteit.nationaliteit.omschrijving

inp.heeftAlsNationaliteit.gerelateerde.omschrijving

nationaliteit.redenOpname.code

REDEN_CODE(inp.heeftAlsNationaliteit.inp.redenVerkrijging)

nationaliteit.redenOpname.omschrijving

inp.heeftAlsNationaliteit.inp.redenVerkrijging

nationaliteit.inOnderzoek.aanduidingBijzonderNederlanderschap

(inOnderzoek.elementnaam == aanduidingBijzonderNederlanderschap)

One of the multiple inOnderzoek occurrances matches

nationaliteit.inOnderzoek.nationaliteit

(inOnderzoek.groepsnaam == Nationaliteit)

One of the multiple inOnderzoek occurrances matches

nationaliteit.inOnderzoek.redenOpname

True

TODO

nationaliteit.inOnderzoek.datumIngangOnderzoek.dag

null

nationaliteit.inOnderzoek.datumIngangOnderzoek.datum

null

nationaliteit.inOnderzoek.datumIngangOnderzoek.jaar

null

nationaliteit.inOnderzoek.datumIngangOnderzoek.maand

null

opschortingBijhouding.reden

inp.redenOpschortingBijhouding

opschortingBijhouding.datum.dag

DAY(inp.datumOpschortingBijhouding)

opschortingBijhouding.datum.datum

inp.datumOpschortingBijhouding

opschortingBijhouding.datum.jaar

YEAR(inp.datumOpschortingBijhouding)

opschortingBijhouding.datum.maand

MONTH(inp.datumOpschortingBijhouding)

overlijden.indicatieOverleden

(inp.redenOpschortingBijhouding == O)

overlijden.datum.dag

DAY(overlijdensdatum)

overlijden.datum.datum

overlijdensdatum

overlijden.datum.jaar

YEAR(overlijdensdatum)

overlijden.datum.maand

MONTH(overlijdensdatum)

overlijden.land.code

COUNTRY_CODE(inp.overlijdenLand)

overlijden.land.omschrijving

inp.overlijdenLand

overlijden.plaats.code

CITY_CODE(inp.overlijdenplaats)

overlijden.plaats.omschrijving

inp.overlijdenplaats

overlijden.inOnderzoek.datum

(inOnderzoek.groepsnaam == Overlijden)

One of the multiple inOnderzoek occurrances matches

overlijden.inOnderzoek.land

(inOnderzoek.groepsnaam == Overlijden)

One of the multiple inOnderzoek occurrances matches

overlijden.inOnderzoek.plaats

(inOnderzoek.groepsnaam == Overlijden)

One of the multiple inOnderzoek occurrances matches

overlijden.inOnderzoek.datumIngangOnderzoek.dag

null

overlijden.inOnderzoek.datumIngangOnderzoek.datum

null

overlijden.inOnderzoek.datumIngangOnderzoek.jaar

null

overlijden.inOnderzoek.datumIngangOnderzoek.maand

null

verblijfplaats.functieAdres

woonadres

TODO

verblijfplaats.huisletter

verblijfsadres.aoa.huisletter

verblijfplaats.huisnummer

verblijfsadres.aoa.huisnummer

verblijfplaats.huisnummertoevoeging

verblijfsadres.aoa.huisnummertoevoeging

verblijfplaats.aanduidingBijHuisnummer

null

TODO

verblijfplaats.identificatiecodeNummeraanduiding

verblijfsadres.aoa.identificatie

verblijfplaats.naamOpenbareRuimte

verblijfsadres.gor.openbareRuimteNaam

verblijfplaats.postcode

verblijfsadres.aoa.postcode

verblijfplaats.woonplaatsnaam

verblijfsadres.wpl.woonplaatsNaam

verblijfplaats.identificatiecodeAdresseerbaarObject

verblijfsadres.wpl.identificatie

verblijfplaats.indicatieVestigingVanuitBuitenland

True

TODO

verblijfplaats.locatiebeschrijving

verblijfsadres.inp.locatiebeschrijving

verblijfplaats.straatnaam

verblijfsadres.gor.straatnaam

verblijfplaats.vanuitVertrokkenOnbekendWaarheen

True

TODO

verblijfplaats.datumAanvangAdreshouding.dag

DAY(verblijfsadres.begindatumVerblijf)

verblijfplaats.datumAanvangAdreshouding.datum

verblijfsadres.begindatumVerblijf

verblijfplaats.datumAanvangAdreshouding.jaar

YEAR(verblijfsadres.begindatumVerblijf)

verblijfplaats.datumAanvangAdreshouding.maand

MONTH(verblijfsadres.begindatumVerblijf)

verblijfplaats.datumIngangGeldigheid.dag

DAY(inp.verblijftIn.gerelateerde.ingangsdatumObject)

verblijfplaats.datumIngangGeldigheid.datum

inp.verblijftIn.gerelateerde.ingangsdatumObject

verblijfplaats.datumIngangGeldigheid.jaar

YEAR(inp.verblijftIn.gerelateerde.ingangsdatumObject)

verblijfplaats.datumIngangGeldigheid.maand

MONTH(inp.verblijftIn.gerelateerde.ingangsdatumObject)

verblijfplaats.datumInschrijvingInGemeente.dag

null

verblijfplaats.datumInschrijvingInGemeente.datum

null

verblijfplaats.datumInschrijvingInGemeente.jaar

null

verblijfplaats.datumInschrijvingInGemeente.maand

null

verblijfplaats.datumVestigingInNederland.dag

null

verblijfplaats.datumVestigingInNederland.datum

null

verblijfplaats.datumVestigingInNederland.jaar

null

verblijfplaats.datumVestigingInNederland.maand

null

verblijfplaats.gemeenteVanInschrijving.code

inp.verblijftIn.gerelateerde.gemeenteCode

verblijfplaats.gemeenteVanInschrijving.omschrijving

inp.verblijftIn.gerelateerde.gemeenteNaam

verblijfplaats.landVanwaarIngeschreven.code

“”

TODO

verblijfplaats.landVanwaarIngeschreven.omschrijving

“”

TODO

verblijfplaats.verblijfBuitenland.adresRegel1

sub.verblijfBuitenland.sub.adresBuitenland1

verblijfplaats.verblijfBuitenland.adresRegel2

sub.verblijfBuitenland.sub.adresBuitenland2

verblijfplaats.verblijfBuitenland.adresRegel3

sub.verblijfBuitenland.sub.adresBuitenland3

verblijfplaats.verblijfBuitenland.vertrokkenOnbekendWaarheen

True

TODO

verblijfplaats.verblijfBuitenland.land.code

COUNTRY_CODE(sub.verblijfBuitenland.lnd.landcode)

verblijfplaats.verblijfBuitenland.land.omschrijving

sub.verblijfBuitenland.lnd.landcode

verblijfplaats.datumAanvangAdreshouding

True

TODO

verblijfplaats.datumIngangGeldigheid

True

TODO

verblijfplaats.datumInschrijvingInGemeente

True

TODO

verblijfplaats.datumVestigingInNederland

True

TODO

verblijfplaats.gemeenteVanInschrijving

True

TODO

verblijfplaats.inOnderzoek.huisletter

(inOnderzoek.groepsnaam == Verblijfsplaats)

verblijfplaats.inOnderzoek.huisnummer

(inOnderzoek.groepsnaam == Verblijfsplaats)

verblijfplaats.inOnderzoek.huisnummertoevoeging

(inOnderzoek.groepsnaam == Verblijfsplaats)

verblijfplaats.inOnderzoek.identificatiecodeNummeraanduiding

(inOnderzoek.groepsnaam == Verblijfsplaats)

verblijfplaats.inOnderzoek.identificatiecodeAdresseerbaarObject

(inOnderzoek.groepsnaam == Verblijfsplaats)

verblijfplaats.inOnderzoek.landVanwaarIngeschreven

(inOnderzoek.groepsnaam == Verblijfsplaats)

verblijfplaats.inOnderzoek.locatiebeschrijving

(inOnderzoek.groepsnaam == Verblijfsplaats)

verblijfplaats.inOnderzoek.naamOpenbareRuimte

(inOnderzoek.groepsnaam == Verblijfsplaats)

verblijfplaats.inOnderzoek.postcode

(inOnderzoek.groepsnaam == Verblijfsplaats)

verblijfplaats.inOnderzoek.straatnaam

(inOnderzoek.groepsnaam == Verblijfsplaats)

verblijfplaats.inOnderzoek.verblijfBuitenland

(inOnderzoek.groepsnaam == Verblijfsplaats)

verblijfplaats.inOnderzoek.woonplaatsnaam

(inOnderzoek.groepsnaam == Verblijfsplaats)

verblijfplaats.inOnderzoek.datumIngangOnderzoek.dag

null

verblijfplaats.inOnderzoek.datumIngangOnderzoek.datum

null

verblijfplaats.inOnderzoek.datumIngangOnderzoek.jaar

null

verblijfplaats.inOnderzoek.datumIngangOnderzoek.maand

null

gezagsverhouding.indicatieCurateleRegister

ing.indicatieCurateleRegister

gezagsverhouding.indicatieGezagMinderjarige

ing.indicatieGezagMinderjarige

gezagsverhouding.inOnderzoek.indicatieCurateleRegister

(inOnderzoek.groepsnaam == Gezagsverhouding)

gezagsverhouding.inOnderzoek.indicatieGezagMinderjarige

(inOnderzoek.groepsnaam == Gezagsverhouding)

gezagsverhouding.inOnderzoek.datumIngangOnderzoek.dag

(inOnderzoek.groepsnaam == Gezagsverhouding)

gezagsverhouding.inOnderzoek.datumIngangOnderzoek.datum

(inOnderzoek.groepsnaam == Gezagsverhouding)

gezagsverhouding.inOnderzoek.datumIngangOnderzoek.jaar

(inOnderzoek.groepsnaam == Gezagsverhouding)

gezagsverhouding.inOnderzoek.datumIngangOnderzoek.maand

(inOnderzoek.groepsnaam == Gezagsverhouding)

verblijfstitel.aanduiding.code

vbt.aanduidingVerblijfstitel

verblijfstitel.aanduiding.omschrijving

(calculated)

Obtained from mapping https://publicaties.rvig.nl/dsresource?objectid=4801&type=org

verblijfstitel.datumEinde.dag

DAY(ing.datumVerliesVerblijfstitel)

verblijfstitel.datumEinde.datum

ing.datumVerliesVerblijfstitel

verblijfstitel.datumEinde.jaar

YEAR(ing.datumVerliesVerblijfstitel)

verblijfstitel.datumEinde.maand

MONTH(ing.datumVerliesVerblijfstitel)

verblijfstitel.datumIngang.dag

DAY(ing.datumVerkrijgingVerblijfstitel)

verblijfstitel.datumIngang.datum

ing.datumVerkrijgingVerblijfstitel

verblijfstitel.datumIngang.jaar

YEAR(ing.datumVerkrijgingVerblijfstitel)

verblijfstitel.datumIngang.maand

MONTH(ing.datumVerkrijgingVerblijfstitel)

verblijfstitel.inOnderzoek.aanduiding

(inOnderzoek.elementnaam == aanduidingVerblijfstitel)

One of the multiple inOnderzoek occurrances matches

verblijfstitel.inOnderzoek.datumEinde

null

verblijfstitel.inOnderzoek.datumIngang

null

verblijfstitel.inOnderzoek.datumIngangOnderzoek.dag

null

verblijfstitel.inOnderzoek.datumIngangOnderzoek.datum

null

verblijfstitel.inOnderzoek.datumIngangOnderzoek.jaar

null

verblijfstitel.inOnderzoek.datumIngangOnderzoek.maand

null

Kind

API attribute

StUF-BG attribute

Design decision remarks

burgerservicenummer

inp.heeftAlsKinderen.inp.bsn

geheimhoudingPersoonsgegevens

inp.heeftAlsKinderen.inp.indicatieGeheim

naam.geslachtsnaam

inp.heeftAlsKinderen.geslachtsnaam

naam.voorletters

inp.heeftAlsKinderen.voorletters

naam.voornamen

inp.heeftAlsKinderen.voornamen

naam.voorvoegsel

inp.heeftAlsKinderen.voorvoegselGeslachtsnaam

naam.inOnderzoek.geslachtsnaam

(inp.heeftAlsKinderen.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

naam.inOnderzoek.voornamen

(inp.heeftAlsKinderen.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

naam.inOnderzoek.voorvoegsel

(inp.heeftAlsKinderen.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

naam.inOnderzoek.datumIngangOnderzoek.dag

null

naam.inOnderzoek.datumIngangOnderzoek.datum

null

naam.inOnderzoek.datumIngangOnderzoek.jaar

null

naam.inOnderzoek.datumIngangOnderzoek.maand

null

geboorte.datum.dag

DAY(inp.heeftAlsKinderen.geboortedatum)

geboorte.datum.datum

inp.heeftAlsKinderen.geboortedatum

geboorte.datum.jaar

YEAR(inp.heeftAlsKinderen.geboortedatum)

geboorte.datum.maand

MONTH(inp.heeftAlsKinderen.geboortedatum)

geboorte.land.code

COUNTRY_CODE(inp.heeftAlsKinderen.inp.geboorteLand)

geboorte.land.omschrijving

inp.heeftAlsKinderen.inp.geboorteLand

geboorte.plaats.code

CITY_CODE(inp.heeftAlsKinderen.inp.geboorteplaats)

geboorte.plaats.omschrijving

inp.heeftAlsKinderen.inp.geboorteplaats

geboorte.inOnderzoek.datum

(inp.heeftAlsKinderen.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

geboorte.inOnderzoek.land

(inp.heeftAlsKinderen.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

geboorte.inOnderzoek.plaats

(inp.heeftAlsKinderen.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

geboorte.inOnderzoek.datumIngangOnderzoek.dag

null

geboorte.inOnderzoek.datumIngangOnderzoek.datum

null

geboorte.inOnderzoek.datumIngangOnderzoek.jaar

null

geboorte.inOnderzoek.datumIngangOnderzoek.maand

null

leeftijd

(calculated)

See features

inOnderzoek.burgerservicenummer

(inp.heeftAlsKinderen.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

inOnderzoek.datumIngangOnderzoek.dag

null

inOnderzoek.datumIngangOnderzoek.datum

null

inOnderzoek.datumIngangOnderzoek.jaar

null

inOnderzoek.datumIngangOnderzoek.maand

null

Ouder

API attribute

StUF-BG attribute

Design decision remarks

burgerservicenummer

inp.heeftAlsOuders.inp.bsn

geslachtsaanduiding

inp.heeftAlsOuders.geslachtsaanduiding

ouderAanduiding

inp.heeftAlsOuders.ouderAanduiding

datumIngangFamilierechtelijkeBetrekking.dag

DAY(inp.heeftAlsOuders.datumIngangFamilierechtelijkeBetrekking)

datumIngangFamilierechtelijkeBetrekking.datum

inp.heeftAlsOuders.datumIngangFamilierechtelijkeBetrekking

datumIngangFamilierechtelijkeBetrekking.jaar

YEAR(inp.heeftAlsOuders.datumIngangFamilierechtelijkeBetrekking)

datumIngangFamilierechtelijkeBetrekking.maand

MONTH(inp.heeftAlsOuders.datumIngangFamilierechtelijkeBetrekking)

naam.geslachtsnaam

inp.heeftAlsOuders.gerelateerde.geslachtsnaam

naam.voorletters

inp.heeftAlsOuders.gerelateerde.voorletters

naam.voornamen

inp.heeftAlsOuders.gerelateerde.voornamen

naam.voorvoegsel

inp.heeftAlsOuders.gerelateerde.voorvoegselGeslachtsnaam

naam.inOnderzoek.geslachtsnaam

(inp.heeftAlsOuders.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

naam.inOnderzoek.voornamen

(inp.heeftAlsOuders.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

naam.inOnderzoek.voorvoegsel

(inp.heeftAlsOuders.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

naam.inOnderzoek.datumIngangOnderzoek.dag

null

naam.inOnderzoek.datumIngangOnderzoek.datum

null

naam.inOnderzoek.datumIngangOnderzoek.jaar

null

naam.inOnderzoek.datumIngangOnderzoek.maand

null

inOnderzoek.burgerservicenummer

(inp.heeftAlsOuders.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

inOnderzoek.datumIngangFamilierechtelijkeBetrekking

null

inOnderzoek.geslachtsaanduiding

(inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

inOnderzoek.datumIngangOnderzoek.dag

null

inOnderzoek.datumIngangOnderzoek.datum

null

inOnderzoek.datumIngangOnderzoek.jaar

null

inOnderzoek.datumIngangOnderzoek.maand

null

geboorte.datum.dag

DAY(inp.heeftAlsOuders.geboortedatum)

geboorte.datum.datum

inp.heeftAlsOuders.geboortedatum

geboorte.datum.jaar

YEAR(inp.heeftAlsOuders.geboortedatum)

geboorte.datum.maand

MONTH(inp.heeftAlsOuders.geboortedatum)

geboorte.land.code

COUNTRY_CODE(inp.heeftAlsOuders.inp.geboorteLand)

geboorte.land.omschrijving

inp.heeftAlsOuders.inp.geboorteLand

geboorte.plaats.code

CITY_CODE(inp.heeftAlsOuders.inp.geboorteplaats)

geboorte.plaats.omschrijving

inp.heeftAlsOuders.inp.geboorteplaats

geboorte.inOnderzoek.datum

(inp.heeftAlsOuders.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

geboorte.inOnderzoek.land

(inp.heeftAlsOuders.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

geboorte.inOnderzoek.plaats

(inp.heeftAlsOuders.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

geboorte.inOnderzoek.datumIngangOnderzoek.dag

null

geboorte.inOnderzoek.datumIngangOnderzoek.datum

null

geboorte.inOnderzoek.datumIngangOnderzoek.jaar

null

geboorte.inOnderzoek.datumIngangOnderzoek.maand

null

geheimhoudingPersoonsgegevens

inp.heeftAlsOuders.inp.indicatieGeheim

Partner

API attribute

StUF-BG attribute

Design decision remarks

burgerservicenummer

inp.heeftAlsEchtgenootPartner.inp.bsn

geslachtsaanduiding

inp.heeftAlsEchtgenootPartner.geslachtsaanduiding

soortVerbintenis

inp.heeftAlsEchtgenootPartner.inp.soortVerbintenis

naam.geslachtsnaam

inp.heeftAlsEchtgenootPartner.gerelateerde.geslachtsnaam

naam.voorletters

inp.heeftAlsEchtgenootPartner.gerelateerde.voorletters

naam.voornamen

inp.heeftAlsEchtgenootPartner.gerelateerde.voornamen

naam.voorvoegsel

inp.heeftAlsEchtgenootPartner.gerelateerde.voorvoegselGeslachtsnaam

naam.inOnderzoek.geslachtsnaam

(inp.heeftAlsEchtgenootPartner.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

naam.inOnderzoek.voornamen

(inp.heeftAlsEchtgenootPartner.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

naam.inOnderzoek.voorvoegsel

(inp.heeftAlsEchtgenootPartner.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

naam.inOnderzoek.datumIngangOnderzoek.dag

1

Fixed value since not in StUF-BG and cannot be null.

naam.inOnderzoek.datumIngangOnderzoek.datum

null

naam.inOnderzoek.datumIngangOnderzoek.jaar

1900

Fixed value since not in StUF-BG and cannot be null.

naam.inOnderzoek.datumIngangOnderzoek.maand

1

Fixed value since not in StUF-BG and cannot be null.

geboorte.datum.dag

DAY(inp.heeftAlsEchtgenootPartner.geboortedatum)

geboorte.datum.datum

inp.heeftAlsEchtgenootPartner.geboortedatum

geboorte.datum.jaar

YEAR(inp.heeftAlsEchtgenootPartner.geboortedatum)

geboorte.datum.maand

MONTH(inp.heeftAlsEchtgenootPartner.geboortedatum)

geboorte.land.code

COUNTRY_CODE(inp.heeftAlsEchtgenootPartner.inp.geboorteLand)

geboorte.land.omschrijving

inp.heeftAlsEchtgenootPartner.inp.geboorteLand

geboorte.plaats.code

CITY_CODE(inp.heeftAlsEchtgenootPartner.inp.geboorteplaats)

geboorte.plaats.omschrijving

inp.heeftAlsEchtgenootPartner.inp.geboorteplaats

geboorte.inOnderzoek.datum

(inp.heeftAlsEchtgenootPartner.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

geboorte.inOnderzoek.land

(inp.heeftAlsEchtgenootPartner.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

geboorte.inOnderzoek.plaats

(inp.heeftAlsEchtgenootPartner.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

geboorte.inOnderzoek.datumIngangOnderzoek.dag

1

Fixed value since not in StUF-BG and cannot be null.

geboorte.inOnderzoek.datumIngangOnderzoek.datum

null

geboorte.inOnderzoek.datumIngangOnderzoek.jaar

1900

Fixed value since not in StUF-BG and cannot be null.

geboorte.inOnderzoek.datumIngangOnderzoek.maand

1

Fixed value since not in StUF-BG and cannot be null.

inOnderzoek.burgerservicenummer

(inp.heeftAlsEchtgenootPartner.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

inOnderzoek.geslachtsaanduiding

(inp.heeftAlsEchtgenootPartner.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

inOnderzoek.datumIngangOnderzoek.dag

1

Fixed value since not in StUF-BG and cannot be null.

inOnderzoek.datumIngangOnderzoek.datum

null

inOnderzoek.datumIngangOnderzoek.jaar

1900

Fixed value since not in StUF-BG and cannot be null.

inOnderzoek.datumIngangOnderzoek.maand

1

Fixed value since not in StUF-BG and cannot be null.

aangaanHuwelijkPartnerschap.datum.dag

DAY(inp.heeftAlsEchtgenootPartner.datumSluiting)

aangaanHuwelijkPartnerschap.datum.datum

inp.heeftAlsEchtgenootPartner.datumSluiting

aangaanHuwelijkPartnerschap.datum.jaar

YEAR(inp.heeftAlsEchtgenootPartner.datumSluiting)

aangaanHuwelijkPartnerschap.datum.maand

MONTH(inp.heeftAlsEchtgenootPartner.datumSluiting)

aangaanHuwelijkPartnerschap.land.code

COUNTRY_CODE(inp.heeftAlsEchtgenootPartner.landSluiting)

aangaanHuwelijkPartnerschap.land.omschrijving

inp.heeftAlsEchtgenootPartner.landSluiting

aangaanHuwelijkPartnerschap.plaats.code

CITY_CODE(inp.heeftAlsEchtgenootPartner.plaatsSluiting)

aangaanHuwelijkPartnerschap.plaats.omschrijving

inp.heeftAlsEchtgenootPartner.plaatsSluiting

aangaanHuwelijkPartnerschap.inOnderzoek.datum

(inp.heeftAlsEchtgenootPartner.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

aangaanHuwelijkPartnerschap.inOnderzoek.land

(inp.heeftAlsEchtgenootPartner.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

aangaanHuwelijkPartnerschap.inOnderzoek.plaats

(inp.heeftAlsEchtgenootPartner.inOnderzoek.groepsnaam == Persoonsgegevens)

One of the multiple inOnderzoek occurrances matches

aangaanHuwelijkPartnerschap.inOnderzoek.datumIngangOnderzoek.dag

1

Fixed value since not in StUF-BG and cannot be null.

aangaanHuwelijkPartnerschap.inOnderzoek.datumIngangOnderzoek.datum

null

aangaanHuwelijkPartnerschap.inOnderzoek.datumIngangOnderzoek.jaar

1900

Fixed value since not in StUF-BG and cannot be null.

aangaanHuwelijkPartnerschap.inOnderzoek.datumIngangOnderzoek.maand

1

Fixed value since not in StUF-BG and cannot be null.

geheimhoudingPersoonsgegevens

inp.heeftAlsEchtgenootPartner.inp.indicatieGeheim

Conversion service

The conversion service allows converting BRP API requests to StUF-BG requests and StUF-BG responses to BRP API responses. The conversion service does not make any external requests or manipulate any stored data but just converts given information between different formats.

Supported APIs

The following API’s are available in the conversion service:

API

Specification version(s)

Conversion Service APIs

1.0.0 ( Redoc, Swagger )