NL Official Documents

📄 NL Official Documents API

Purpose of the API

The NL Official Documents API allows you to order, track, and download official documents from the Dutch Chamber of Commerce (KVK).

Instead of manually navigating the KVK website, you can programmatically discover available documents, place orders, monitor their processing status, and download the resulting files in multiple formats.
You can use this API to:

  • Discover which official documents are available for a given organization or branch
  • Order business register extracts (standard extracts)
  • Track the asynchronous processing status of your orders
  • Download completed documents in PDF, HTML, or JSON format
  • Reuse previously ordered documents from cache without placing a new order

The API is ideal for KYC/KYB onboarding, compliance workflows, legal due diligence, financial audits, and any process that requires official Dutch trade register documents.


How to use?

📌 Overview of the Flow

  1. Discover Supported Documents
    Start by calling
    GET /nl/organizations/official-documents/v1/
    to check which documents are available for a specific organization. The response includes document types, prices, expected delivery times, and available formats.

  2. Place an Order
    Once you have identified the document you want, call:
    POST /nl/organizations/official-documents/v1/orders
    providing the documentType and organizationID (and optionally branchID).

  3. Track Order Status
    Orders are processed asynchronously. Poll the order status by calling:
    GET /nl/organizations/official-documents/v1/orders/{order_id}
    until the status changes from pending to done.

  4. Download the Document
    When the status is done, download the document by calling:
    GET /nl/organizations/official-documents/v1/orders/{order_id}/document
    Specify the desired format via the Accept header.

  5. Reuse Existing Documents (Cache)
    Before placing a new order, you can check if a document is already available in the cache:
    GET /nl/organizations/official-documents/v1/documents
    If found, download it directly via:
    GET /nl/organizations/official-documents/v1/documents/{document_id}

🌀 Flow Behavior

  • Orders are processed asynchronously. The POST call returns immediately with a pending status — you must poll until the order completes.
  • If an order fails during processing, you can retry specific activities using
    POST /nl/organizations/official-documents/v1/orders/{order_id}.
  • The cache endpoint (/v1/documents) returns documents previously ordered by any customer. Each document includes an upToDate flag indicating whether it reflects the latest KVK data.
  • All list endpoints support pagination via page[number] and page[size].
  • All responses follow JSON:API conventions for consistency.

🔢 Versioning

Current version prefix:
/nl/organizations/official-documents/v1/

Future versions will follow /v2/, /v3/, etc.


Base URL

https://api.company.info


🔑 Authentication

All requests must be authenticated using one of the following methods:

MethodHeaderDescription
API KeyX-API-KEY: <your-api-key>Your unique API key. Validated against the Organization Management API.
Bearer TokenAuthorization: Bearer <your-token>A valid bearer token issued by the authentication service.
💡

You only need to provide one of these headers per request. If both are present, the bearer token takes precedence.


🧩 Core Concepts

Before diving into the endpoints it helps to understand the domain model:

ConceptDescription
OrderA request to retrieve an official document from the KVK. Orders are processed asynchronously and transition through statuses: pending, done, failed, cancelled.
DocumentA completed, cached document that has been previously ordered. Documents can be reused without placing a new order.
HistoryA processing history record associated with an order, tracking the steps and status of the order fulfillment workflow.

All Endpoints

Below is a complete list of API endpoints.

#MethodEndpointDescription
1GET/v1/Discover supported documents for an organization
2POST/v1/ordersPlace a new document order
3GET/v1/ordersList previously placed orders
4GET/v1/orders/{order_id}Get a specific order
5POST/v1/orders/{order_id}Retry a failed order activity
6GET/v1/orders/{order_id}/documentDownload a document from an order
7GET/v1/documentsList available cached documents
8GET/v1/documents/{document_id}Download a cached document

All endpoint paths are relative to /nl/organizations/official-documents.

❗ These endpoints incur usage-based charges.


1. Discover Supported Documents

GET /nl/organizations/official-documents/v1/

Check which official documents are available for a specific organization.

Description

Returns the list of document types available for the given Organization ID (and optionally branch ID), including pricing, expected delivery time, available formats, and availability status.


Request Parameters

Headers

NameTypeDescription
X-API-KEYstringYour API key. Required if Authorization is not provided.
AuthorizationstringBearer token (Bearer <token>). Required if X-API-KEY is not provided.

Query Parameters

ParameterTypeRequiredDescription
filter[organizationID]stringYesThe 8-digit KVK number.
filter[branchID]stringNoThe 12-digit branch ID.

Example Request

curl -X GET "https://api.company.info/nl/organizations/official-documents/v1/?filter[organizationID]=33302047" \
  -H "X-API-KEY: YOUR_API_KEY"

Example Response

{
  "data": {
    "type": "33302047",
    "attributes": {
      "organizationID": "33302047",
      "date": "2024-03-15T11:19:39+01:00",
      "documents": [
        {
          "documentType": "standardExtract",
          "mimeType": "text/html",
          "price": 2.95,
          "available": true,
          "expectedTime": 60,
          "description": "Business Register Extract"
        }
      ]
    }
  },
  "links": {
    "self": "https://api.company.info/nl/organizations/official-documents/v1/?filter[organizationID]=33302047"
  }
}

Response Fields — data.attributes

FieldTypeDescription
organizationIDstringThe KVK number of the organization.
branchIDstringThe branch ID (if requested).
datestringISO 8601 timestamp of when the availability was checked.
documentsarrayArray of available document types.

Response Fields — documents[]

FieldTypeDescription
documentTypestringThe type of document (see Document Types below).
mimeTypestringThe available MIME type for this document.
pricenumberThe price of the document (in EUR).
availablebooleanWhether the document is currently available for ordering.
expectedTimeintegerExpected delivery time in seconds.
descriptionstringHuman-readable description of the document.

2. 📝 Place an Order

POST /nl/organizations/official-documents/v1/orders

Place a new order for an official document.

Description

Creates a new document order. The order is processed asynchronously — the response will include an order ID and a pending status. You must poll the order status until it changes to done before downloading.


⁉️ Request Parameters

Headers

NameTypeDescription
X-API-KEYstringYour API key. Required if Authorization is not provided.
AuthorizationstringBearer token (Bearer <token>). Required if X-API-KEY is not provided.
Content-TypestringRequired. application/json

Request Body

The body must contain a data object with the following fields:

FieldTypeRequiredDescription
data.typestringYesMust be "orders".
data.attributes.documentTypestringYesMust be "standardExtract".
data.attributes.organizationIDstringYesThe 8-digit KVK number.
data.attributes.branchIDstringNoThe 12-digit branch ID (when targeting a specific branch).
data.attributes.privateAddressesbooleanNoInclude private addresses.

Example Request

curl -X POST "https://api.company.info/nl/organizations/official-documents/v1/orders" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "data": {
          "type": "orders",
          "attributes": {
            "documentType": "standardExtract",
            "organizationID": "33302047"
          }
        }
      }'

Example Response

{
  "data": {
    "id": "01HS0SZQECSKQ8NV20391MZ0R1",
    "type": "orders",
    "attributes": {
      "documentType": "standardExtract",
      "status": "pending",
      "organizationID": "33302047",
      "mimeTypes": [
        "text/html",
        "application/pdf",
        "application/json"
      ],
      "createdAt": "2024-03-15T11:19:39+01:00"
    },
    "relationships": {
      "histories": {
        "data": {
          "type": "histories",
          "id": "01HS0SZQFHRW8TCGRYW8536Z0X"
        }
      }
    },
    "links": {
      "self": "https://api.company.info/nl/organizations/official-documents/v1/orders/01HS0SZQECSKQ8NV20391MZ0R1"
    }
  },
  "included": [
    {
      "type": "histories",
      "id": "01HS0SZQFHRW8TCGRYW8536Z0X",
      "attributes": {
        "status": "pending",
        "title": "orderIsProcessing",
        "detail": "",
        "createdAt": "2024-03-15T11:19:39+01:00"
      }
    }
  ],
  "links": {
    "self": "https://api.company.info/nl/organizations/official-documents/v1/orders/01HS0SZQECSKQ8NV20391MZ0R1"
  }
}

Response Fields — data

FieldTypeDescription
idstringUnique identifier (ULID) for the order.
typestringAlways "orders".
attributes.documentTypestringThe type of document ordered.
attributes.statusstringCurrent status: pending, done, failed, or cancelled.
attributes.organizationIDstringThe KVK number.
attributes.mimeTypesstring[]Available download formats.
attributes.createdAtstringISO 8601 timestamp of when the order was created.
relationships.histories.data.typestringAlways "histories".
relationships.histories.data.idstringThe ID of the processing history record.
links.selfstringCanonical URL to retrieve this order.

Response Fields — included[]

Processing history records are side-loaded in the included array.

FieldTypeDescription
typestringAlways "histories".
idstringUnique identifier for the history record.
attributes.statusstringStatus of this processing step.
attributes.titlestringMachine-readable title (e.g., orderIsProcessing, orderIsDone).
attributes.detailstringHuman-readable detail message (may be empty).
attributes.createdAtstringISO 8601 timestamp.

3. 📋 List Orders

GET /nl/organizations/official-documents/v1/orders

Retrieve a paginated list of previously placed orders.

Description

Returns all orders matching the specified filters. Useful for finding a previously placed order or auditing your order history.


⁉️ Request Parameters

Headers

NameTypeDescription
X-API-KEYstringYour API key. Required if Authorization is not provided.
AuthorizationstringBearer token (Bearer <token>). Required if X-API-KEY is not provided.

Query Parameters

ParameterTypeRequiredDescription
filter[organizationID]stringNoFilter by 8-digit KVK number.
filter[branchID]stringNoFilter by 12-digit branch ID.
filter[documentType]stringNoFilter by document type.
filter[status]stringNoFilter by status: pending, done, failed, or cancelled.
filter[date][from]stringNoFilter by order date from (YYYY-MM-DD).
filter[date][to]stringNoFilter by order date to (YYYY-MM-DD).
page[number]integerNoPage number (default: 1).
page[size]integerNoRecords per page (default: 10, maximum: 20).

Example Request

curl -X GET "https://api.company.info/nl/organizations/official-documents/v1/orders?filter[status]=done&filter[organizationID]=33302047" \
  -H "X-API-KEY: YOUR_API_KEY"

Example Response

{
  "data": [
    {
      "id": "01HS0SZQECSKQ8NV20391MZ0R1",
      "type": "orders",
      "attributes": {
        "documentType": "standardExtract",
        "status": "done",
        "organizationID": "33302047",
        "mimeTypes": [
          "text/html",
          "application/pdf",
          "application/json"
        ],
        "createdAt": "2024-03-15T11:19:39+01:00"
      },
      "relationships": {
        "histories": {
          "data": {
            "type": "histories",
            "id": "01HS0SZQFHRW8TCGRYW8536Z0X"
          }
        }
      },
      "links": {
        "self": "https://api.company.info/nl/organizations/official-documents/v1/orders/01HS0SZQECSKQ8NV20391MZ0R1"
      }
    }
  ],
  "included": [
    {
      "type": "histories",
      "id": "01HS0SZQFHRW8TCGRYW8536Z0X",
      "attributes": {
        "status": "done",
        "title": "orderIsDone",
        "detail": "",
        "createdAt": "2024-03-15T11:20:15+01:00"
      }
    }
  ],
  "links": {
    "first": "...?page[number]=1&page[size]=10",
    "last": "...?page[number]=1&page[size]=10",
    "self": "...?page[number]=1&page[size]=10"
  },
  "meta": {
    "totalResults": 1,
    "totalPages": 1
  }
}

4. 📄 Get a Single Order

GET /nl/organizations/official-documents/v1/orders/{order_id}

Retrieve a specific order by its ID.

Description

Returns the full details of the specified order, including its current status and processing history. Use this to poll order status until it reaches done.


⁉️ Request Parameters

Path

NameTypeRequiredDescription
order_idstringYesThe ID of the order.

Headers

NameTypeDescription
X-API-KEYstringYour API key. Required if Authorization is not provided.
AuthorizationstringBearer token (Bearer <token>). Required if X-API-KEY is not provided.

Example Request

curl -X GET "https://api.company.info/nl/organizations/official-documents/v1/orders/01HS0SZQECSKQ8NV20391MZ0R1" \
  -H "X-API-KEY: YOUR_API_KEY"

Example Response

{
  "data": {
    "id": "01HS0SZQECSKQ8NV20391MZ0R1",
    "type": "orders",
    "attributes": {
      "documentType": "standardExtract",
      "status": "done",
      "organizationID": "33302047",
      "mimeTypes": [
        "text/html",
        "application/pdf",
        "application/json"
      ],
      "createdAt": "2024-03-15T11:19:39+01:00"
    },
    "relationships": {
      "histories": {
        "data": {
          "type": "histories",
          "id": "01HS0SZQFHRW8TCGRYW8536Z0X"
        }
      }
    },
    "links": {
      "self": "https://api.company.info/nl/organizations/official-documents/v1/orders/01HS0SZQECSKQ8NV20391MZ0R1"
    }
  },
  "included": [
    {
      "type": "histories",
      "id": "01HS0SZQFHRW8TCGRYW8536Z0X",
      "attributes": {
        "status": "done",
        "title": "orderIsDone",
        "detail": "",
        "createdAt": "2024-03-15T11:20:15+01:00"
      }
    }
  ],
  "links": {
    "self": "https://api.company.info/nl/organizations/official-documents/v1/orders/01HS0SZQECSKQ8NV20391MZ0R1"
  }
}

Order Statuses

StatusDescription
pendingThe document is still being retrieved from the KVK.
doneThe document is ready for download.
failedAn error occurred during processing.
cancelledThe order was cancelled.

5. 🔄 Retry a Failed Order Activity

POST /nl/organizations/official-documents/v1/orders/{order_id}

Retry a specific activity on a failed order.

Description

If an order fails during the ordering or conversion step, you can retry the failed activity without placing a new order. This is useful for transient failures.


⁉️ Request Parameters

Path

NameTypeRequiredDescription
order_idstringYesThe ID of the order.

Headers

NameTypeDescription
X-API-KEYstringYour API key. Required if Authorization is not provided.
AuthorizationstringBearer token (Bearer <token>). Required if X-API-KEY is not provided.
Content-TypestringRequired. application/json

Request Body

FieldTypeRequiredDescription
data.typestringYesMust be "orders".
data.attributes.activitystringYesThe activity to retry: "order" or "convert".

Example Request

curl -X POST "https://api.company.info/nl/organizations/official-documents/v1/orders/01HS0SZQECSKQ8NV20391MZ0R1" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "data": {
          "type": "orders",
          "attributes": {
            "activity": "convert"
          }
        }
      }'

Example Response

204 No Content — the activity has been retried successfully.


6. 📥 Download a Document (from Order)

GET /nl/organizations/official-documents/v1/orders/{order_id}/document

Download the document associated with a completed order.

Description

Returns the document content in the format specified by the Accept header. The order must have a status of done before the document can be downloaded.


⁉️ Request Parameters

Path

NameTypeRequiredDescription
order_idstringYesThe ID of the order.

Headers

NameTypeDescription
X-API-KEYstringYour API key. Required if Authorization is not provided.
AuthorizationstringBearer token (Bearer <token>). Required if X-API-KEY is not provided.
AcceptstringRequired. The desired content type: application/pdf, application/json, or text/html.

Example Request

curl -X GET "https://api.company.info/nl/organizations/official-documents/v1/orders/01HS0SZQECSKQ8NV20391MZ0R1/document" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/pdf" \
  --output document.pdf

Example Response

The response body contains the document content in the requested format.

Accept HeaderResponse Content
application/pdfBinary PDF file
application/jsonJSON representation of the document
text/htmlHTML representation of the document

7. 📋 List Cached Documents

GET /nl/organizations/official-documents/v1/documents

Retrieve a paginated list of previously ordered documents available in cache.

Description

Returns documents that have been previously ordered (by you or another customer) and are available for immediate download. This allows you to reuse existing documents without placing a new order and incurring additional charges. Each document includes an upToDate flag indicating whether it reflects the latest KVK data.


⁉️ Request Parameters

Headers

NameTypeDescription
X-API-KEYstringYour API key. Required if Authorization is not provided.
AuthorizationstringBearer token (Bearer <token>). Required if X-API-KEY is not provided.

Query Parameters

ParameterTypeRequiredDescription
filter[organizationID]stringNoFilter by 8-digit KVK number.
filter[branchID]stringNoFilter by 12-digit branch ID.
filter[documentType]stringNoFilter by document type.
filter[date][from]stringNoFilter by document date from (YYYY-MM-DD).
filter[date][to]stringNoFilter by document date to (YYYY-MM-DD).
page[number]integerNoPage number (default: 1).
page[size]integerNoRecords per page (default: 10, maximum: 20).

Example Request

curl -X GET "https://api.company.info/nl/organizations/official-documents/v1/documents?filter[organizationID]=33302047" \
  -H "X-API-KEY: YOUR_API_KEY"

Example Response

{
  "data": [
    {
      "id": "MDFLRVI5TldFMkdHN0I1Nkc1MENSQ1hRV0s...",
      "type": "documents",
      "attributes": {
        "documentType": "standardExtract",
        "organizationID": "33302047",
        "mimeTypes": [
          "text/html",
          "application/pdf",
          "application/json"
        ],
        "createdAt": "2024-03-15T11:20:15+01:00",
        "upToDate": true
      },
      "links": {
        "self": "https://api.company.info/nl/organizations/official-documents/v1/documents/MDFLRVI5TldFMkdHN0I1Nkc1MENSQ1hRV0s..."
      }
    }
  ],
  "links": {
    "first": "...?page[number]=1&page[size]=10",
    "last": "...?page[number]=1&page[size]=10",
    "self": "...?page[number]=1&page[size]=10"
  },
  "meta": {
    "totalResults": 1,
    "totalPages": 1
  }
}

Response Fields — data[]

FieldTypeDescription
idstringUnique identifier for the cached document.
typestringAlways "documents".
attributes.documentTypestringThe type of document.
attributes.organizationIDstringThe KVK number.
attributes.mimeTypesstring[]Available download formats.
attributes.createdAtstringISO 8601 timestamp of when the document was created.
attributes.upToDatebooleanWhether the document reflects the latest KVK data.
links.selfstringCanonical URL to download this document.

8. 📥 Download a Cached Document

GET /nl/organizations/official-documents/v1/documents/{document_id}

Download a document directly from cache.

Description

Returns the document content in the format specified by the Accept header. This allows downloading without placing a new order.


⁉️ Request Parameters

Path

NameTypeRequiredDescription
document_idstringYesThe ID of the document.

Headers

NameTypeDescription
X-API-KEYstringYour API key. Required if Authorization is not provided.
AuthorizationstringBearer token (Bearer <token>). Required if X-API-KEY is not provided.
AcceptstringRequired. The desired content type: application/pdf, application/json, or text/html.

Example Request

curl -X GET "https://api.company.info/nl/organizations/official-documents/v1/documents/MDFLRVI5TldFMkdHN0I1Nkc1MENSQ1hRV0s.../document" \
  -H "X-API-KEY: YOUR_API_KEY" \
  -H "Accept: application/pdf" \
  --output cached_document.pdf

Example Response

The response body contains the document content in the requested format (same as Endpoint 6).


📑 Document Types

Document TypeDescriptionRequired Attributes
standardExtractBusiness Register ExtractorganizationID

Document-Specific Attributes

Some attributes are optional when placing an order:

AttributeDescription
branchIDThe 12-digit branch ID.
privateAddressesWhether to include private addresses.

📤 Supported Formats

Documents can be downloaded in the following formats via the Accept header:

MIME TypeFormatDescription
application/pdfPDFPortable Document Format (binary)
application/jsonJSONJSON representation of the document
text/htmlHTMLHTML representation of the document
⚠️

Not all formats may be available for every document type. Check

the mimeTypes field in the order or document response to see which formats are supported.


🔢 Pagination

The API uses JSON:API-style pagination with meta and links objects on list endpoints (GET /v1/orders and GET /v1/documents).

Request Parameters

ParameterTypeDescription
page[number]integerThe page number you want to retrieve (1-based, default: 1).
page[size]integerHow many records per page (default: 10, maximum: 20).

Response Fields

"meta": {
  "totalResults": 150,
  "totalPages": 15
},
"links": {
  "first": "...?page[number]=1&page[size]=10",
  "last": "...?page[number]=15&page[size]=10",
  "self": "...?page[number]=2&page[size]=10",
  "next": "...?page[number]=3&page[size]=10",
  "prev": "...?page[number]=1&page[size]=10"
}
  • Use links.next until it no longer appears or until you have all records.
  • Use totalResults and totalPages to build progress indicators or pagination controls in your UI.

🔄 Typical Order Workflow

Here is a recommended workflow for ordering and downloading documents:

  1. Discover available documents (Endpoint 1) — check what is available for the target organization.
  2. Check cache first (Endpoint 7) — see if the document you need has already been ordered and is available for immediate download.
  3. Download from cache (Endpoint 8) — if found and upToDate is true, download directly and skip ordering.
  4. Place an order (Endpoint 2) — if not cached or out of date, place a new order.
  5. Poll for completion (Endpoint 4) — periodically check the order status until it is done.
  6. Download the document (Endpoint 6) — download in your preferred format.

Example Polling Loop

# Poll every 10 seconds until status is "done"
curl -X GET "https://api.company.info/nl/organizations/official-documents/v1/orders/01HS0SZQECSKQ8NV20391MZ0R1" \
  -H "X-API-KEY: YOUR_API_KEY"

⚠️ Rate Limiting / Other Limitations

  • Some environments may enforce rate limits per API key.
  • Document ordering is subject to KVK processing times — the expectedTime field in the discovery response gives an estimate.
  • Wherever possible, check the cache before placing new orders to avoid unnecessary charges.

⚠️ Possible errors / unexpected behavior

Below is a table with the most common HTTP error responses.

StatusErrorDescriptionHow to solve
400Bad RequestValidation error (invalid KVK number, missing required attributes)Validate parameter names and formats. Check required attributes for the document type.
401UnauthorizedMissing or invalid credentialsEnsure X-API-KEY or Authorization: Bearer <token> is present, not expired, and has sufficient permissions.
403ForbiddenInsufficient permissions for the operationCheck that your API key is authorized for the Official Documents API.
404Not FoundOrder or document not foundConfirm the order_id / document_id exists.
406Not AcceptableRequested content type is not supportedCheck the Accept header — use one of: application/pdf, application/json, or text/html.
423LockedThe document is not ready yetThe order is still processing. Wait and retry the download later.
500Internal Server ErrorUnexpected server errorRetry the request after some time. If it persists, contact support with X-Correlation-Id.

Example Error Response

{
  "errors": [
    {
      "status": "423",
      "code": "423",
      "title": "failed on downloading document",
      "detail": "the requested document is not ready yet"
    }
  ]
}

🛠️ Try it yourself!

Ready to try it out? Head over to our API reference where you can easily test the API yourself.

From there, you can:

  • Explore endpoints
  • Play with example requests and responses
  • See schemas and parameter details
  • Use your own API key to test real responses

🔤 Glossary

TermDefinition
OrderA request to retrieve an official document from the KVK. Orders are processed asynchronously.
DocumentA completed, cached official document available for download without placing a new order.
HistoryA processing history record tracking the steps and status changes during order fulfillment.
Organization IDOfficial 8-digit identifier (KVK number) issued by the Dutch Chamber of Commerce (KvK).
Branch IDA 12-digit identifier for a specific branch of an organization.
Document TypeThe kind of official document: standardExtract.
ULIDUniversally Unique Lexicographically Sortable Identifier — used for order IDs.
JSON:APIA specification for building APIs in JSON with consistent structure for data, included, meta, links, and errors.
MIME TypeThe format of the document content: application/pdf, application/json, or text/html.
CachePreviously ordered documents stored for reuse. Check the upToDate flag to determine freshness.

Processing History Titles

TitleDescription
orderIsProcessingThe order is currently being processed.
orderIsDoneThe order has completed successfully.
conversionFailureThe document conversion step failed.
timeoutThe order timed out waiting for a response from KVK.
companyNotFoundThe specified company was not found in the KVK register.
documentTypeNotFoundThe requested document type is not available.
notAvailableThe document is not available for the specified organization.