# Germany Handelsregister Scraper (`automation-lab/germany-handelsregister-scraper`) Actor

Search the official German Handelsregister and export company names, court, HRB/HRA number, seat, status, history, and document metadata.

- **URL**: https://apify.com/automation-lab/germany-handelsregister-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 2 total users, 2 monthly users, 83.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Germany Handelsregister Scraper

Extract structured company-search results from the official German Handelsregister portal.

### What does Germany Handelsregister Scraper do?

Germany Handelsregister Scraper searches the public Registerportal der Länder at `handelsregister.de` and turns visible result rows into clean dataset records.

It supports company-name keyword searches and exact register-number lookups for HRB, HRA, VR, GnR, PR, and GsR entries.

### Who is it for?

- 🧾 KYB and AML teams checking German counterparties.
- 🏦 Credit-risk analysts screening company identifiers.
- 🕵️ Corporate-intelligence teams mapping register courts and historical names.
- 🤝 B2B sales operations teams validating legal company names.
- ⚖️ Legal and compliance researchers collecting repeatable public-register evidence.

### Why use this scraper?

The Handelsregister web UI is built around JSF forms, sessions, and paginated result tables. This actor automates that flow and exports a dataset that can be filtered, joined, and imported into due-diligence systems.

### What data can it extract?

| Field | Description |
| --- | --- |
| query | Company name, keyword, or register-number label searched |
| queryType | `companyName` or `registerNumber` |
| resultRank | Rank within the query |
| companyName | Company or register entry name |
| federalState | German federal state shown by the portal |
| registerCourt | Amtsgericht / register court |
| registerType | HRB, HRA, VR, GnR, PR, or GsR |
| registerNumber | Register number |
| formerCourtOrLocalCode | Additional legacy/local code when visible |
| seat | Company seat/location |
| status | Current/deleted status shown by the portal |
| historyNames | Historical names visible in the result row |
| historySeats | Historical seats visible in the result row |
| availableDocumentTypes | Public action codes such as AD, CD, HD, DK, UT, VÖ, SI |
| sourceUrl | Result page URL |
| retrievedAt | ISO timestamp |

### How much does it cost to scrape Germany Handelsregister company data?

This actor uses pay-per-event pricing: a **$0.005** start fee plus one charge for each saved company result.

| Apify plan tier | Price per saved company result |
| --- | ---: |
| FREE | $0.00017519 |
| BRONZE | $0.00015234 |
| SILVER | $0.00011883 |
| GOLD | $0.000091404 |
| PLATINUM | $0.000060936 |
| DIAMOND | $0.000042655 |

The total actor charge is the start event plus the saved-result events at your plan's rate. Set a clear `maxResults` limit and review the authoritative pricing panel in Apify Console before a larger due-diligence batch.

### Input: company names

Use `companyNames` when you have names or keywords:

```json
{
  "companyNames": ["Siemens", "Bosch"],
  "maxResults": 50
}
```

### Input: register numbers

Use `registerNumbers` when you know the register identifier:

```json
{
  "registerNumbers": [
    {
      "registerType": "HRB",
      "registerNumber": "174601",
      "registerCourt": "München",
      "queryLabel": "HRB 174601 München"
    }
  ],
  "maxResults": 5
}
```

### Input options

- `companyNames` — German company names or keywords.
- `registerNumbers` — exact register-number lookup objects.
- `maxResults` — maximum dataset records across all searches.
- `exactCompanyName` — use the portal's exact-name mode.
- `searchSeat` — optional seat/location filter.
- `registerCourt` — optional default register court.
- `includeDeleted` — include closed/deleted register sheets.
- `resultsPerPage` — requested portal page size.
- `navigationDelayMs` — advanced delay for slow JSF navigation.

### Output example

```json
{
  "query": "Siemens",
  "queryType": "companyName",
  "resultRank": 1,
  "companyName": "\"Siemens-Sportverein Wesel e. V.\"",
  "federalState": "Nordrhein-Westfalen",
  "registerCourt": "Amtsgericht Duisburg",
  "registerType": "VR",
  "registerNumber": "30227",
  "seat": "Wesel",
  "status": "aktuell",
  "availableDocumentTypes": ["AD", "CD", "HD", "UT", "VÖ", "SI"],
  "sourceUrl": "https://www.handelsregister.de/rp_web/sucheErgebnisse/welcome.xhtml?cid=1",
  "retrievedAt": "2026-07-08T05:14:56.562Z"
}
```

### How to run it

1. Add one or more company names or register-number objects.
2. Set `maxResults` to the number of rows you need.
3. Run the actor.
4. Export the dataset as JSON, CSV, Excel, XML, RSS, or HTML.

### Tips for better results

- Use exact register-number lookup when you already know the HRB/HRA number.
- Add `registerCourt` to reduce ambiguous results.
- Use `exactCompanyName` for legal-name checks.
- Keep `maxResults` conservative for first tests.
- Increase `navigationDelayMs` only if the portal is slow.

### What the document codes mean

The actor records public action-code availability as metadata:

- AD — Aktueller Abdruck
- CD — Chronologischer Abdruck
- HD — Historischer Abdruck
- DK — Dokumentenansicht
- UT — Unternehmensträger
- VÖ — Veröffentlichungen
- SI — Strukturierter Registerinhalt

### Current scope

The v1 actor extracts the public search/result row data visible without login. It does not download register documents or printouts. Document download support can be added later if the free/public path is validated safely.

### Integrations

Use the output dataset in:

- CRM enrichment pipelines.
- AML/KYB screening queues.
- Credit-risk research notebooks.
- Procurement due-diligence workflows.
- Data warehouses such as BigQuery, Snowflake, or PostgreSQL.

### API usage: Node.js

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/germany-handelsregister-scraper').call({
  companyNames: ['Siemens'],
  maxResults: 25,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### API usage: Python

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('automation-lab/germany-handelsregister-scraper').call(run_input={
    'companyNames': ['Siemens'],
    'maxResults': 25,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### API usage: cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/automation-lab~germany-handelsregister-scraper/runs?token=YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"companyNames":["Siemens"],"maxResults":25}'
```

### MCP usage with Claude

Connect through Apify MCP using the actor-specific tools URL:

```text
https://mcp.apify.com/?tools=automation-lab/germany-handelsregister-scraper
```

Claude Code setup example:

```bash
claude mcp add --transport http apify-handelsregister "https://mcp.apify.com/?tools=automation-lab/germany-handelsregister-scraper"
```

Claude Desktop setup (JSON configuration):

```json
{
  "mcpServers": {
    "apify-handelsregister": {
      "url": "https://mcp.apify.com/?tools=automation-lab/germany-handelsregister-scraper"
    }
  }
}
```

Cursor setup: add the same `mcpServers` entry to your Cursor MCP configuration.

VS Code setup: add the same HTTP server URL to your VS Code MCP configuration, or use the MCP extension's **Add Server** command.

Example prompts showing MCP usage:

- "Use the Germany Handelsregister scraper to find entries for Siemens and return HRB/HRA identifiers."
- "Run the Apify MCP germany-handelsregister-scraper tool for Bosch and give me court, register number, seat, and status."
- "Check this German company name with the Apify MCP tool and summarize court, number, seat, and status."
- "Export Handelsregister result rows for these KYB targets, then flag entries with deleted status."

### Legality and ethical notes

This actor accesses publicly available Handelsregister pages. You are responsible for using the data lawfully, respecting applicable privacy and database rules, and avoiding abusive request volumes.

### Reliability notes

The official portal uses JSF/PrimeFaces state. The actor keeps concurrency conservative and uses one browser session to reduce ViewState failures.

### Troubleshooting: no results

Check spelling, try a broader keyword, remove the court filter, or disable `exactCompanyName`.

### Troubleshooting: slow runs

The Handelsregister portal can be slow. Lower `maxResults` or increase `navigationDelayMs` if navigation is unstable.

### Related scrapers

- https://apify.com/automation-lab/bundesanzeiger-filings-scraper

### Changelog

#### 0.1

Initial private build for Germany Handelsregister company result extraction.

### FAQ

#### Does it download official register PDFs?

No. v1 records which public document actions are available but does not download AD/CD/HD/DK/UT/VÖ/SI files.

#### Can I search by HRB number?

Yes. Use `registerNumbers` with `registerType`, `registerNumber`, and optionally `registerCourt`.

#### Can I include deleted companies?

Yes. Set `includeDeleted` to true.

#### Is a login required?

No login is required for the public search-result metadata extracted by this actor.

#### Why are results capped?

The `maxResults` cap keeps runs predictable and helps control cost.

### Support

If you need additional fields or document-download support, open an issue on the actor page with an example company and the fields you need.

# Actor input Schema

## `companyNames` (type: `array`):

German company names or keywords to search in the normal Handelsregister search form.

## `registerNumbers` (type: `array`):

Optional exact register-number lookups. Use when you already know an HRB/HRA/VR/GnR/PR/GsR number.

## `maxResults` (type: `integer`):

Maximum dataset rows to save across all searches.

## `exactCompanyName` (type: `boolean`):

Use the portal's exact company-name option instead of all-keywords search.

## `searchSeat` (type: `string`):

Optional Niederlassung / Sitz filter.

## `registerCourt` (type: `string`):

Optional court filter applied to company-name searches and register-number entries without their own court.

## `includeDeleted` (type: `boolean`):

Enable the portal option for closed register sheets or deleted branch offices.

## `resultsPerPage` (type: `integer`):

Requested page size on the Handelsregister result page. The portal may still paginate at its own limit.

## `navigationDelayMs` (type: `integer`):

Extra delay after JSF navigation. Increase only if the portal is slow.

## Actor input object example

```json
{
  "companyNames": [
    "Siemens",
    "Bosch"
  ],
  "registerNumbers": [
    {
      "registerType": "HRB",
      "registerNumber": "12300",
      "registerCourt": "Berlin (Charlottenburg)",
      "queryLabel": "HRB 12300 Berlin"
    }
  ],
  "maxResults": 20,
  "exactCompanyName": false,
  "includeDeleted": false,
  "resultsPerPage": 10,
  "navigationDelayMs": 750
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companyNames": [
        "Siemens",
        "Bosch"
    ],
    "registerNumbers": [
        {
            "registerType": "HRB",
            "registerNumber": "12300",
            "registerCourt": "Berlin (Charlottenburg)",
            "queryLabel": "HRB 12300 Berlin"
        }
    ],
    "maxResults": 20,
    "resultsPerPage": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/germany-handelsregister-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "companyNames": [
        "Siemens",
        "Bosch",
    ],
    "registerNumbers": [{
            "registerType": "HRB",
            "registerNumber": "12300",
            "registerCourt": "Berlin (Charlottenburg)",
            "queryLabel": "HRB 12300 Berlin",
        }],
    "maxResults": 20,
    "resultsPerPage": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/germany-handelsregister-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companyNames": [
    "Siemens",
    "Bosch"
  ],
  "registerNumbers": [
    {
      "registerType": "HRB",
      "registerNumber": "12300",
      "registerCourt": "Berlin (Charlottenburg)",
      "queryLabel": "HRB 12300 Berlin"
    }
  ],
  "maxResults": 20,
  "resultsPerPage": 10
}' |
apify call automation-lab/germany-handelsregister-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/germany-handelsregister-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/DhuO9BuzV6SlCBEcY/builds/hAP2AoNIvrHRsVdmk/openapi.json
