Handelsregister extract download: a workflow template
The common register portal answers the questions a KYC file needs, one search and one printout at a time. This template runs the normal search, picks the register entry you named, opens the current printout and reports the hits as JSON.
Who pulls register printouts, and why by hand
The portal is public and free to read since 2022. The work is in the repetition and in being sure you opened the right entry.
- Onboarding a counterparty
- Compliance needs the current printout (AD) to confirm managing directors, seat and share capital before a contract is signed. One search, one hit to choose, one document, filed with a date.
- Periodic re-verification
- Banks, payment providers and larger buyers refresh the register data of existing customers on a cycle. The list is long, the change rate is low, and the person doing it is checking whether anything moved.
- Legal and M&A
- A chronological printout (CD) and the list of documents (DK) show the history: previous names, mergers, changes of managing director. The same search, different document letters.
- What goes wrong
- Similar names in different courts, a printout filed against the wrong entity, and the portal's own limits on how many retrievals one visitor may make in a period. A run that stops at the limit should say so rather than return nothing.
What the portal's public pages say
| Cost | Retrieving register information has been free of charge since 1 August 2022; the portal's earlier per-document fees no longer apply Handelsregister portal |
|---|---|
| Registration | No user account is needed to search or to open printouts Handelsregister portal |
| Document letters | AD current printout, CD chronological printout, HD historical printout, DK documents, UT entity data, VÖ publications, SI structured register content Handelsregister portal |
| Retrieval limits and terms | The portal states conditions of use, including a limit on retrievals per period. Read them before scheduling anything; this page does not restate the figure |
| Registers covered | Commercial, cooperative, partnership and association registers of all federal states, plus company register data Handelsregister portal |
As of 2026-09-08
The clicks on handelsregister.de
As the portal's public pages describe the normal search. Where this page is unsure of a label it says so.
-
Choose the normal search
The portal offers a normal and an advanced search. The normal one takes a company name or keyword, optionally a register type and number and a federal state.
-
Read the hit list
Each hit shows the register court, the register type and number, the company name, its seat and the entry's status, followed by the document letters AD, CD, HD, DK, UT, VÖ and SI.
-
Open AD for the current printout
AD is the current printout; it opens as a PDF. Whether it downloads or displays inline depends on the browser; the template's validation accepts both.
-
Check the entity before filing
Compare seat and register number with what the counterparty told you. Two companies can share a name across courts, and the portal will not warn you.
-
Stay within the retrieval limit
The conditions of use limit retrievals per period. If the portal shows a notice to that effect, the printout was not delivered; the template's validation fails on that page rather than reporting success.
The template
The register number parameter is optional with an empty default, so the same template serves a first lookup and a precise re-check.
{
"title": "Handelsregister: retrieve the current register printout",
"parameters": [
{
"key": "company",
"description": "Company name or keyword for the normal search",
"required": true
},
{
"key": "register_number",
"description": "Register type and number to match, e.g. HRB 12345; empty means take the first hit",
"required": false,
"default": ""
},
{
"key": "kyc_webhook",
"description": "Endpoint that receives the hit list",
"required": true
}
],
"blocks": [
{
"blockType": "navigation",
"label": "Register_portal",
"url": "https://www.handelsregister.de/"
},
{
"blockType": "action",
"label": "Normal_search",
"instruction": "Open the normal search (Normale Suche), enter {{ company }} as company name or keyword, leave the other filters empty and run the search"
},
{
"blockType": "extraction",
"label": "Hits",
"instruction": "Every hit in the result list: company name, register court, register type and number, seat, status",
"schema": {
"type": "object",
"properties": {
"hits": {
"type": "array",
"items": {
"type": "object",
"properties": {
"company": {
"type": "string"
},
"court": {
"type": "string"
},
"register": {
"type": "string"
},
"seat": {
"type": "string"
},
"status": {
"type": "string"
}
},
"required": [
"company",
"register"
]
}
}
},
"required": [
"hits"
]
}
},
{
"blockType": "action",
"label": "Open_printout",
"instruction": "For the hit whose register entry matches {{ register_number }}, or the first hit when that is empty, open AD, the current printout (Aktueller Abdruck)"
},
{
"blockType": "validation",
"label": "Printout_present",
"criterion": "A current register printout for {{ company }} is displayed or has been downloaded as a PDF; no error message, fee notice or retrieval limit is shown"
},
{
"blockType": "http_request",
"label": "Notify_kyc",
"method": "POST",
"url": "{{ kyc_webhook }}",
"headers": {
"content-type": "application/json"
},
"body": "{{ Hits_output }}"
}
]
}
import { Browserberg } from '@browserberg/sdk';
import template from './handelsregister-extract.json' with { type: 'json' };
const bb = new Browserberg({
apiKey: process.env.BROWSERBERG_API_KEY,
baseUrl: 'https://browserberg.com',
});
const wf = await bb.workflows.publish(template);
await using session = await bb.sessions.create();
const run = await bb.workflows.run(wf.workflowId, {
sessionId: session.id,
inputs: {
company: 'Musterbau GmbH',
register_number: 'HRB 12345',
kyc_webhook: 'https://kyc.internal.example/hooks/register',
},
});
// The printout is an artifact of the run; the hit list went to the webhook.
for (const block of run.blocks) console.log(block.label, block.status, block.screenshotKey);
No login, a public portal, and the limits that still apply
Browserberg is not affiliated with the register portal, which is operated by the federal states under the lead of the Ministry of Justice of North Rhine-Westphalia.
Nothing to sign in to
The portal needs no account, so the template has no login block and no credential. There is nothing to vault and nothing to expire except the Browserberg session. A run is a fresh Chromium, a search and a document.
Read the conditions of use before you schedule
A public site is not a site without rules. The portal's conditions of use restrict how many retrievals a visitor may make in a period and say what systematic retrieval is permitted. This template is for the lookups your team already does by hand, one at a time, and the validation block is written so that a limit notice ends the run visibly. Browserberg does not rotate addresses or disguise the session; if the portal declines a request, the run reports it.
Effect gates on a read-only portal
The portal has no forms that pay or delete, so the gates mostly classify search buttons, which are the harmless submit effect. They still run on every click, and a control that offered a bulk export of register data would be classed bulk_export and refused under the default policy.
Which document
The template opens AD, the current printout. For history, change the instruction in Open_printout to CD or HD; for the documents folder, DK. Keep the validation criterion in step with the letter you choose, since it names what it expects to see.
Note · Based on the portal's public description
The search fields, the hit list columns and the document letters are taken from the register portal's public pages as of the date above. The template was not run against the live portal while this page was written; the first run will tell you whether the labels still match.
Questions from KYC and legal teams
Is the printout an official document?
It is what the portal delivers; the portal describes its status. This page does not make claims about legal effect. File it with the retrieval date, which the run records.
What if the register number does not match any hit?
The Open_printout block fails with that reason, the validation never runs and the run ends with the block named. The Hits output is still published, so you can see what the search returned.
Can I run it for a list every night?
Technically yes, with a schedule trigger and a loop. Read the portal's conditions of use first; a nightly re-check of a long list may exceed what they allow, and the run will stop at the limit notice rather than press on.
Does it return the printout as data?
The current printout arrives as a PDF artifact. The structured register content is a separate document letter, SI; change the instruction if you want that instead.
Will the portal see a bot?
It sees an ordinary Chromium session from EU hardware doing what a person does at a person's pace. No stealth layer is involved, which is deliberate.
Read next
- Bundesanzeiger annual accounts Financial figures to go with the register data
- Form destination checker See where a portal's forms actually submit before automating them
- Building workflows Optional parameters, defaults and the output namespace
- Audit reference The signed action log that records each retrieval
Start with one counterparty
Five browser hours, no card. One search, one printout, and a run record you can file beside it.