Introduction

API for accessing Dutch business and address data: BAG addresses, KVK companies, and LEI entities.

This API provides access to official Dutch data sources through a unified API:

  • BAG API - Dutch Address and Building Registry (Kadaster)
  • KVK API - Dutch Chamber of Commerce company data
  • LEI API - Legal Entity Identifier information

Authentication

All API endpoints require authentication using an API key. Include your API key in the request header:

X-API-Key: your-api-key-here

API Key Permissions

Different endpoints require different permissions:

  • bag:read - Access BAG address list and details
  • bag:search - Search BAG addresses via external API
  • kvk:read - Access KVK company list and details
  • kvk:search - Search KVK companies via external API
  • lei:read - Access LEI entity list and details

Rate Limiting

API requests are subject to rate limiting to ensure fair usage. If you exceed the rate limit, you'll receive a 429 Too Many Requests response.

Response Format

All responses are returned in JSON format with the following structure:

  • Success responses (2xx): Include a data key with the requested resource(s)
  • Error responses (4xx/5xx): Include a message key with error details
  • Paginated responses: Include links and meta keys with pagination information

Authenticating requests

To authenticate requests, include a X-API-Key header with the value "{YOUR_API_KEY}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

You can get your API key from your account dashboard. Different endpoints may require different API key permissions (kvk:read, kvk:search, lei:read).

Basisregistratie Adressen en Gebouwen (BAG)

APIs for querying Dutch address data from the Kadaster BAG (Basisregistratie Adressen en Gebouwen). All endpoints require authentication via API key with specific permissions.

List BAG addresses

GET
https://openchamber.nl
/api/bag

Retrieve a paginated list of BAG addresses from the local database with filtering and sorting options.

Headers

Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

postal_code
string

Filter by postal code (with or without space).

Example:
1012AB
house_number
integer

Filter by house number.

Example:
123
street_name
string

Search by street name (partial match).

Example:
Keizersgracht
city
string

Filter by city (partial match).

Example:
Amsterdam
municipality
string

Filter by municipality.

Example:
Amsterdam
province
string

Filter by province.

Example:
Noord-Holland
in_use
boolean

Filter by in-use status.

Example:
true
sort
string

Sort field. Available: street_name, city, postal_code, house_number.

Example:
street_name
order
string

Sort order (asc or desc).

Example:
asc
per_page
integer

Number of results per page (default: 15, max: 100).

Example:
25
Example request:
curl --request GET \
    --get "https://openchamber.nl/api/bag?postal_code=1012AB&house_number=123&street_name=Keizersgracht&city=Amsterdam&municipality=Amsterdam&province=Noord-Holland&in_use=1&sort=street_name&order=asc&per_page=25" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": [
        {
            "id": "01J9X...",
            "bag_id": "0363200000000001",
            "postal_code": "1012AB",
            "house_number": "1",
            "house_letter": null,
            "house_number_addition": null,
            "street_name": "Keizersgracht",
            "city": "Amsterdam",
            "municipality": "Amsterdam",
            "province": "Noord-Holland",
            "full_address": "Keizersgracht 1 1012AB Amsterdam",
            "coordinates": {
                "latitude": 52.370216,
                "longitude": 4.895168
            },
            "last_synced_at": "2023-11-20T10:30:00Z"
        }
    ],
    "links": {
        "first": "http://example.com/api/bag?page=1",
        "last": "http://example.com/api/bag?page=5",
        "prev": null,
        "next": "http://example.com/api/bag?page=2"
    },
    "meta": {
        "current_page": 1,
        "per_page": 15,
        "total": 73
    }
}
{
    "message": "Invalid API key"
}
GET
https://openchamber.nl
/api/bag/search

Search for addresses using postal code, house number, street name, or city. Results are cached locally for faster subsequent queries.

Headers

Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

postal_code
string

Postal code (required if not using street search).

Example:
1012AB
house_number
integer

House number (optional, refines postal code search).

Example:
1
house_letter
string

House letter (optional).

Example:
A
house_number_addition
string

House number addition (optional).

Example:
bis
street_name
string

Street name (required if not using postal code).

Example:
Keizersgracht
city
string

City name (required if using street search).

Example:
Amsterdam

Body Parameters

Example request:
curl --request GET \
    --get "https://openchamber.nl/api/bag/search?postal_code=1012AB&house_number=1&house_letter=A&house_number_addition=bis&street_name=Keizersgracht&city=Amsterdam" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"postal_code\": \"bngzmiy\",
    \"house_number\": 16,
    \"house_letter\": \"d\",
    \"house_number_addition\": \"ljnikh\",
    \"street_name\": \"wayk\",
    \"city\": \"cmyu\"
}"
Example response:

Lookup address by postal code and house number

GET
https://openchamber.nl
/api/bag/{postalCode}/{houseNumber}/{addition?}

Convenient endpoint for direct address lookup. Automatically formats postal code and handles additions.

Headers

Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

postalCode
string
required

Postal code (with or without space).

Example:
1012AB
houseNumber
integer
required

House number.

Example:
1
addition
string

House letter or addition (optional).

Example:
A
Example request:
curl --request GET \
    --get "https://openchamber.nl/api/bag/1012AB/1/A" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "id": "01J9X...",
        "bag_id": "0363200000000001",
        "postal_code": "1012AB",
        "house_number": "1",
        "street_name": "Keizersgracht",
        "city": "Amsterdam",
        "full_address": "Keizersgracht 1 1012AB Amsterdam",
        "coordinates": {
            "latitude": 52.370216,
            "longitude": 4.895168
        }
    }
}
{
    "message": "Invalid API key"
}
{
    "message": "Address not found."
}
{
    "message": "BAG API not configured."
}

Get BAG address by ID

GET
https://openchamber.nl
/api/bag/{bagId}

Retrieve a specific BAG address by its BAG ID. Checks local cache first, fetches from BAG API if not found or data is stale (older than 30 days).

Headers

Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

bagId
string
required

The BAG address object ID.

Example:
0363200000000001
Example request:
curl --request GET \
    --get "https://openchamber.nl/api/bag/0363200000000001" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
  "data": {
    "id": "01J9X...",
    "bag_id": "0363200000000001",
    "postal_code": "1012AB",
    "house_number": "1",
    "house_letter": null,
    "house_number_addition": null,
    "street_name": "Keizersgracht",
    "official_street_name": "Keizersgracht",
    "city": "Amsterdam",
    "municipality": "Amsterdam",
    "province": "Noord-Holland",
    "object_type": "verblijfsobject",
    "status": "Naamgeving uitgegeven",
    "in_use": true,
    "full_address": "Keizersgracht 1 1012AB Amsterdam",
    "coordinates": {
      "latitude": 52.370216,
      "longitude": 4.895168
    },
    "full_data": {...},
    "last_synced_at": "2023-11-20T10:30:00Z"
  }
}
{
    "message": "Invalid API key"
}
{
    "message": "Address not found in BAG API."
}
{
    "message": "BAG API not configured and address not found in cache."
}

Kamer van Koophandel

APIs for managing and querying Dutch Chamber of Commerce (KVK) company data. All endpoints require authentication via API key with specific permissions.

List KVK companies

GET
https://openchamber.nl
/api/kvk

Retrieve a paginated list of KVK companies from the local database with filtering and sorting options.

Headers

Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

kvk_number
string

Filter by exact KVK number (8 digits).

Example:
12345678
name
string

Search by company name (partial match in naam or statutaire_naam).

Example:
ACME
city
string

Filter by city/place (partial match).

Example:
Amsterdam
postal_code
string

Filter by exact postal code.

Example:
1012AB
active
boolean

Filter by active status.

Example:
true
type
string

Filter by company type.

Example:
rechtspersoon
sort
string

Sort field. Available: name, kvk_number, city, postal_code, active, registration_date.

Example:
name
order
string

Sort order (asc or desc).

Example:
asc
per_page
integer

Number of results per page (default: 15, max: 100).

Example:
25
Example request:
curl --request GET \
    --get "https://openchamber.nl/api/kvk?kvk_number=12345678&name=ACME&city=Amsterdam&postal_code=1012AB&active=1&type=rechtspersoon&sort=name&order=asc&per_page=25" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": [
        {
            "kvk_nummer": "12345678",
            "naam": "Example Company B.V.",
            "statutaire_naam": "Example Company Besloten Vennootschap",
            "vestigingsnummer": "000012345678",
            "actief": true,
            "type": "rechtspersoon",
            "straatnaam": "Keizersgracht",
            "huisnummer": "123",
            "postcode": "1012AB",
            "plaats": "Amsterdam",
            "rechtsvorm": "Besloten Vennootschap",
            "rsin": "123456789",
            "formele_registratiedatum": "2020-01-15",
            "last_synced_at": "2023-11-20T10:30:00Z"
        }
    ],
    "links": {
        "first": "http://example.com/api/kvk?page=1",
        "last": "http://example.com/api/kvk?page=5",
        "prev": null,
        "next": "http://example.com/api/kvk?page=2"
    },
    "meta": {
        "current_page": 1,
        "per_page": 15,
        "total": 73
    }
}
{
    "message": "Invalid API key"
}
GET
https://openchamber.nl
/api/kvk/search

Search for companies directly via the KVK API and cache the results locally. Requires KVK API to be configured.

Headers

Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

name
string

Company name to search for (minimum 2 characters).

Example:
ACME
kvk_number
string

KVK number to search for (exactly 8 digits).

Example:
12345678
city
string

City/place to filter by.

Example:
Amsterdam
postal_code
string

Postal code to filter by.

Example:
1012AB
house_number
integer

House number to filter by.

Example:
123
page
integer

Page number (1-100).

Example:
1
results_per_page
integer

Results per page (1-100).

Example:
10

Body Parameters

Example request:
curl --request GET \
    --get "https://openchamber.nl/api/kvk/search?name=ACME&kvk_number=12345678&city=Amsterdam&postal_code=1012AB&house_number=123&page=1&results_per_page=10" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"bngz\",
    \"kvk_number\": \"miyvdljn\",
    \"city\": \"architecto\",
    \"postal_code\": \"architecto\",
    \"house_number\": 16,
    \"page\": 22,
    \"results_per_page\": 7
}"
Example response:

Get KVK company by number

GET
https://openchamber.nl
/api/kvk/{kvkNummer}

Retrieve a specific KVK company by its KVK number. Checks local cache first, fetches from KVK API if not found or data is stale (older than 30 days).

Priority order: main_establishment > legal_entity > branch Returns related records (other types with the same KVK number) in the response.

Headers

Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

kvkNummer
string
required

The KVK number (8 digits).

Example:
12345678
Example request:
curl --request GET \
    --get "https://openchamber.nl/api/kvk/12345678" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "id": "01kasb2yqwwr7hn3k5b7d4bwyv",
        "kvk_number": "12345678",
        "rsin": "123456789",
        "establishment_number": "000012345678",
        "name": "Example Company B.V.",
        "statutory_name": "Example Company Besloten Vennootschap",
        "formal_registration_date": "2020-01-15T00:00:00+00:00",
        "material_registration_date": "2020-01-10T00:00:00+00:00",
        "address": {
            "street_name": "Keizersgracht",
            "house_number": "123",
            "postal_code": "1012AB",
            "city": "Amsterdam"
        },
        "type": "main_establishment",
        "active": true,
        "legal_form": "Besloten Vennootschap",
        "non_mailing": false,
        "is_main_establishment": true,
        "total_employees": 25,
        "cache": {
            "last_synced_at": "2023-11-20T10:30:00+00:00",
            "is_stale": false
        },
        "created_at": "2023-11-20T10:30:00+00:00",
        "updated_at": "2023-11-20T10:30:00+00:00",
        "related": [
            {
                "id": "01kasb2yqwwr7hn3k5b7d4bwyx",
                "kvk_number": "12345678",
                "establishment_number": null,
                "name": "Example Company B.V.",
                "type": "legal_entity",
                "active": true,
                "address": {
                    "street_name": null,
                    "house_number": null,
                    "postal_code": null,
                    "city": null
                },
                "is_main_establishment": false
            }
        ]
    }
}
{
    "message": "Invalid API key"
}
{
    "message": "Company not found in KVK API."
}
{
    "message": "KVK API not configured and company not found in cache."
}

List establishments for a company

GET
https://openchamber.nl
/api/kvk/{kvkNummer}/establishments

Retrieve all establishments (vestigingen) for a specific KVK number.

Headers

Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

kvkNummer
string
required

The KVK number (8 digits).

Example:
63314061
Example request:
curl --request GET \
    --get "https://openchamber.nl/api/kvk/63314061/establishments" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": [
        {
            "establishment_number": "000032242441",
            "name": "Webmethod",
            "type": "main_establishment",
            "is_main_establishment": true,
            "address": {
                "street_name": "Pleiadenlaan",
                "house_number": "1 145",
                "postal_code": "9742NE",
                "city": "Groningen"
            },
            "active": true
        }
    ]
}

Get specific establishment

GET
https://openchamber.nl
/api/kvk/{kvkNummer}/establishments/{establishmentNumber}

Retrieve a specific establishment by its establishment number.

Headers

Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

kvkNummer
string
required

The KVK number (8 digits).

Example:
63314061
establishmentNumber
string
required

The establishment number (12 digits).

Example:
000032242441
Example request:
curl --request GET \
    --get "https://openchamber.nl/api/kvk/63314061/establishments/000032242441" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "establishment_number": "000032242441",
        "name": "Webmethod",
        "type": "main_establishment",
        "address": {
            "street_name": "Pleiadenlaan",
            "house_number": "1 145",
            "postal_code": "9742NE",
            "city": "Groningen"
        },
        "company": {
            "kvk_number": "63314061",
            "name": "Webmethod",
            "legal_form": "Eenmanszaak"
        }
    }
}
{
    "message": "Establishment not found"
}

Legal Entity Identifier (LEI)

APIs for managing and querying Legal Entity Identifier (LEI) entities. All endpoints require authentication via API key.

GET
https://openchamber.nl
/api/lei

Retrieve a paginated list of LEI entities with optional search and filtering capabilities.

Headers

Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

search
string

Search in legal name, LEI code, city, or registration authority entity ID.

Example:
ACME
country
string

Filter by country code (ISO 3166-1 alpha-2).

Example:
NL
status
string

Filter by legal entity status.

Example:
ACTIVE
legal_form
string

Filter by legal form (partial match).

Example:
BV
postal_code
string

Filter by postal code.

Example:
1012AB
registration_authority_entity_id
string

Filter by registration authority entity ID.

Example:
12345678
city
string

Filter by city name (partial match).

Example:
Amsterdam
per_page
integer

Number of results per page (default: 15, max: 100).

Example:
25
sort
string

Field to sort by. Available: legal_name, lei, legal_entity_status, entity_creation_date, last_public_update_date, legal_address_country, legal_address_city.

Example:
legal_name
order
string

Sort order (asc or desc).

Example:
asc
Example request:
curl --request GET \
    --get "https://openchamber.nl/api/lei?search=ACME&country=NL&status=ACTIVE&legal_form=BV&postal_code=1012AB&registration_authority_entity_id=12345678&city=Amsterdam&per_page=25&sort=legal_name&order=asc" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": [
        {
            "lei": "724500VKKSH9QOLTFR81",
            "legal_name": "Example Company B.V.",
            "legal_entity_status": "ACTIVE",
            "legal_form": "Besloten Vennootschap",
            "legal_address_country": "NL",
            "legal_address_city": "Amsterdam",
            "legal_address_postal_code": "1012AB",
            "registration_authority_entity_id": "12345678",
            "entity_creation_date": "2020-01-15",
            "last_public_update_date": "2023-11-20T10:30:00Z"
        }
    ],
    "links": {
        "first": "http://example.com/api/lei?page=1",
        "last": "http://example.com/api/lei?page=5",
        "prev": null,
        "next": "http://example.com/api/lei?page=2"
    },
    "meta": {
        "current_page": 1,
        "per_page": 15,
        "total": 73
    }
}
{
    "message": "Invalid API key"
}
GET
https://openchamber.nl
/api/lei/{id}

Retrieve a specific LEI entity using its LEI code.

Headers

Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
string
required

The ID of the lei.

Example:
architecto
lei
string
required

The LEI code (20 alphanumeric characters).

Example:
724500VKKSH9QOLTFR81
Example request:
curl --request GET \
    --get "https://openchamber.nl/api/lei/architecto" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "lei": "724500VKKSH9QOLTFR81",
        "legal_name": "Example Company B.V.",
        "legal_entity_status": "ACTIVE",
        "legal_form": "Besloten Vennootschap",
        "legal_address_country": "NL",
        "legal_address_city": "Amsterdam",
        "legal_address_postal_code": "1012AB",
        "registration_authority_entity_id": "12345678",
        "entity_creation_date": "2020-01-15",
        "last_public_update_date": "2023-11-20T10:30:00Z"
    }
}
{
    "message": "Invalid API key"
}
{
    "message": "No query results for model [App\\Models\\LeiEntity]."
}