# Handelsregister API - German Company Register Scraper (`kamerozkan/handelsregister-api`) Actor

Handelsregister API for German company register records from handelsregister.de: register court and number, legal form, seat, status, former names, address, share capital, purpose and officers from the structured register content. Search by name, city or register number.

- **URL**: https://apify.com/kamerozkan/handelsregister-api.md
- **Developed by:** [Kamer Ozkan](https://apify.com/kamerozkan) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 company records

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Handelsregister API - German Company Register Scraper

The **Handelsregister API** for German company data: look up companies on **handelsregister.de**, the official joint register portal of the German states, by name, by register number (HRB, HRA, GnR, PR, VR, GsR) or by court, city, legal form and state, and get clean JSON with register court and number, legal form, seat, status, former names and, from the official **structured register content (SI)**, business address, share capital, business purpose, founding date, representation rule, managing directors, board members, authorised signatories, branches and EUID. No login, no API key, no browser.

### What does Handelsregister API do?

The actor fills in the portal's advanced search the way a person would, reads every hit (register court, register type and number, company name, seat, state, current or deleted, former names and seats) and, if you keep **Structured register content** on, downloads the official SI document of each company, an XJustiz XML file the register courts publish, and turns it into flat fields.

Typical lookups:

- **By company name**: "Trade Republic Bank", "Siemens Energy", "Bäckerei" with city Leipzig.
- **By register number** (KYC and onboarding): "HRB 252581 München", "Berlin (Charlottenburg) HRB 244347 B".
- **By filters**: all GmbHs at one register court, all cooperatives in a state, companies with a postal code.
- **New companies monitor**: schedule a search daily and get (and pay for) only the companies that were not delivered before.

### Who is it for?

- **KYC, AML and compliance teams**: verify a German counterparty's register entry, legal form, address, capital and who may represent it.
- **B2B sales and lead generation**: lists of GmbHs, AGs or cooperatives by city or court with business address and managing directors.
- **M\&A, investors and credit analysts**: share capital, founding date, last register entry and former names in bulk.
- **CRM and data teams**: enrich company records with register court, register number and EUID.

### What data can you get?

| Field | Example |
|---|---|
| `name`, `officialName` | Trade Republic Bank GmbH |
| `registerCourt`, `registerType`, `registerNumber`, `registerId` | Amtsgericht Berlin (Charlottenburg), HRB, 244347 B |
| `euid` | DEF1103R.HRB244347B (European Unique Identifier) |
| `legalForm`, `legalFormCode`, `legalFormSource` | Gesellschaft mit beschränkter Haftung, 221110, register |
| `state`, `seat`, `status`, `statusRaw` | Berlin, Berlin, active, aktuell |
| `street`, `houseNumber`, `postalCode`, `city` | Brunnenstraße, 19-21, 10119, Berlin |
| `shareCapital`, `shareCapitalCurrency` | 101677200, EUR |
| `businessPurpose` | Das Betreiben von Bankgeschäften gemäß ... |
| `representationRule` | Ist ein Geschäftsführer bestellt, so vertritt er die Gesellschaft allein ... |
| `officers` | name and role: Geschäftsführer, Vorstand, Vorsitzender des Vorstands, Prokurist, Persönlich haftender Gesellschafter, Liquidator, Inhaber, Partner |
| `branches` | name, seat and EUID of each registered branch (10 EU branches for Trade Republic) |
| `foundingDate`, `statuteDate`, `lastStatuteChange` | 2016-08-03, 2026-05-20, 2026-05-20 |
| `lastRegisterEntry`, `numberOfRegisterEntries` | 2026-08-28, 18 |
| `formerNames` | earlier company names with their seat |
| `availableDocuments` | AD, CD, HD, DK, UT, VÖ, SI (documents the portal offers for the company) |
| `detailsError` | why the structured content is missing for a row, otherwise empty |

Officers are company officers as published in the public register: only **name and role** are returned. Birth dates and home towns that the register file also contains are dropped on purpose.

### How much does it cost?

You pay per company: **$5.00 per 1,000 companies** ($0.005 per company) on the Free plan, with Store discounts on paid Apify plans: Bronze $4.50, Silver $4.25, Gold and above $4.00 per 1,000 companies. Platform usage is included.

Worked examples:

- KYC check of 200 counterparties by register number: 200 x $0.005 = **$1.00**.
- 100 GmbHs in one city with address, capital and managing directors: 100 x $0.005 = **$0.50**.
- A daily new-companies monitor that finds about 15 new entries a day: 15 x $0.005 = **$0.075 per day**; companies already delivered are **not charged**.

Set **Max companies** or a maximum cost per run to cap spending.

### How to use it

1. Click **Try for free**.
2. Enter **Company names or keywords**, or **Register numbers** such as `HRB 252581 München`.
3. Optional filters: **Register court** (by its city), **Register type**, **Legal form**, **Federal states**, **City**, **Postal code**, **Include deleted companies**.
4. Keep **Structured register content** on for address, capital, purpose and officers (turn it off for a fast list of register numbers).
5. Choose **Max companies per search** (the portal stops at 100 hits per search) and **Max companies**.
6. Click **Start** and download the table as CSV, Excel, JSON or through the API.

### Input example

```json
{
  "registerNumbers": ["HRB 252581 München", "Berlin (Charlottenburg) HRB 244347 B"],
  "includeDetails": true,
  "maxItems": 10
}
```

### Output example

A row from a live run (business purpose shortened, 4 officers and 10 branches in the full row):

```json
{
  "searchQuery": "Trade Republic Bank",
  "name": "Trade Republic Bank GmbH",
  "registerCourt": "Amtsgericht Berlin (Charlottenburg)",
  "registerType": "HRB",
  "registerNumber": "244347",
  "registerId": "Amtsgericht Berlin (Charlottenburg) HRB 244347",
  "state": "Berlin",
  "seat": "Berlin",
  "status": "active",
  "formerNames": [],
  "availableDocuments": ["AD", "CD", "HD", "DK", "UT", "VÖ", "SI"],
  "legalForm": "Gesellschaft mit beschränkter Haftung",
  "legalFormSource": "register",
  "officialName": "Trade Republic Bank GmbH",
  "euid": "DEF1103R.HRB244347B",
  "legalFormCode": "221110",
  "street": "Brunnenstraße",
  "houseNumber": "19-21",
  "postalCode": "10119",
  "city": "Berlin",
  "shareCapital": 101677200.0,
  "shareCapitalCurrency": "EUR",
  "businessPurpose": "Das Betreiben von Bankgeschäften gemäß (a) § 1 Abs. 1 Satz 2 Nr. 1 Kreditwesengesetz (KWG) (Einlagengeschäft) ...",
  "representationRule": "Ist ein Geschäftsführer bestellt, so vertritt er die Gesellschaft allein. Sind mehrere Geschäftsführer bestellt, wird die Gesellschaft gemeinschaftlich durch zwei Geschäftsführer oder durch einen Geschäftsführer in Gemeinschaft mit einem Prokuristen vertreten.",
  "foundingDate": "2016-08-03",
  "statuteDate": "2026-05-20",
  "lastStatuteChange": "2026-05-20",
  "lastRegisterEntry": "2026-08-28",
  "numberOfRegisterEntries": 18,
  "officers": [{"name": "Gernot Mittendorfer", "role": "Geschäftsführer", "type": "person"}],
  "branches": [{"name": "Trade Republic Bank GmbH, Branch Austria", "seat": "Wien", "euid": "ATBRA.630983-001"}],
  "detailsError": null,
  "scrapedAt": "2026-10-22T16:45:10+00:00"
}
```

### Integrations and API

Run it from your code with the Apify API or the `apify-client` package, schedule it in Apify, or connect it to Make, n8n, Zapier, Google Sheets, Slack or a webhook.

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("kamerozkan/handelsregister-api").call(run_input={
    "registerNumbers": ["HRB 252581 München", "Berlin (Charlottenburg) HRB 244347 B"],
    "includeDetails": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["registerId"], item["name"], item["legalForm"], item["postalCode"], item["city"], item["shareCapital"])
```

### FAQ

**Where does the data come from?** From handelsregister.de, the official register portal run by the German states (the search hits and the "SI" structured register content the register courts publish there). The actor never logs in.

**Why at most 100 companies per search?** The portal itself stops at 100 hits and asks to narrow the search. Add a register court, city, postal code, legal form or state, or split one broad keyword into several searches. The run log says when a search hit the limit.

**How fast is it?** About 5 to 10 seconds per company with structured content, because the actor pauses between requests to keep the load on the public portal low; without structured content a search of up to 100 companies takes a few seconds.

**Why is detailsError filled for some rows?** Now and then a register court's system does not deliver the SI document ("Der Abruf für dieses Dokument ist zur Zeit nicht möglich"). The actor retries it once at the end of the search; if it still fails, the row keeps all search fields and `detailsError` says why. Keep **Apify Proxy** on: the portal often refuses documents to shared cloud IPs.

**Which register court name do I enter?** The court's city as the portal lists it, for example München, Hamburg, Frankfurt am Main, Köln, Düsseldorf or Berlin (Charlottenburg). Some courts keep the register for a whole region, so a company in Karlsruhe is registered in Mannheim.

**How does the new companies monitor work?** With **Only companies not seen before** on, the actor remembers every delivered register number in a named key-value store in your account and skips it in later runs. The first run delivers every match as the baseline. Use one **Monitor name** per search.

**Is it legal to collect this data?** The register is public by law and the actor reads it without logins. Officers are returned with name and role only. You are responsible for how you use the data, including data protection rules for the people named in it.

**Something is not working?** Open an issue on the Issues tab with your run link and we will fix it fast.

### Support

Questions, a field you need (for example shareholder lists, register announcements or the current printout as PDF) or a court that does not resolve? Open an issue on the **Issues** tab of this actor with your run link. Issues are read every working day and fixes ship within a few days; feature requests that other users share get built.

# Actor input Schema

## `searchTerms` (type: `array`):

Company names or keywords, one search each, e.g. 'Siemens Energy' or 'Trade Republic Bank'. The official portal returns at most 100 hits per search, so add a court, city or legal form to narrow broad words.

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

Look up companies by register type, number and court, e.g. 'HRB 252581 München' or 'Berlin (Charlottenburg) HRB 244347 B'. Register types: HRA, HRB, GnR, PR, VR, GsR.

## `keywordMatch` (type: `string`):

How the portal matches the words: all words, at least one word (needs a court, register type, legal form or state as well) or the exact company name.

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

Only companies of this register court, by its city, e.g. München, Hamburg, Frankfurt am Main, Berlin (Charlottenburg), Köln. Leave empty for all of Germany.

## `registerType` (type: `string`):

HRB = corporations (GmbH, AG, UG, SE), HRA = sole traders and partnerships (e.K., OHG, KG), GnR = cooperatives, PR = partnerships of professionals, VR = associations, GsR = civil-law partnerships.

## `legalForm` (type: `string`):

Only companies with this legal form.

## `states` (type: `array`):

Only companies registered in these German states. Leave empty for all.

## `city` (type: `string`):

Only companies with their seat in this city, e.g. Leipzig.

## `postalCode` (type: `string`):

Only companies with this postal code, e.g. 10119.

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

Also return closed register sheets (dissolved or merged companies).

## `similarSoundingNames` (type: `boolean`):

Let the portal also match similar-sounding words (phonetic search).

## `includeDetails` (type: `boolean`):

Download the official structured register content (SI) of every company: business address, share capital, business purpose, founding date, representation rule, managing directors, board members, authorised signatories (name and role only) and branches. Adds one portal request per company.

## `maxResultsPerSearch` (type: `integer`):

Companies taken from each search (the portal itself stops at 100 hits).

## `maxItems` (type: `integer`):

Stop after this many companies in total. You are charged per company, so this also caps the cost of the run.

## `onlyNewCompanies` (type: `boolean`):

Remember every company delivered under the monitor name and skip it in later runs, so a scheduled run returns (and charges) only newly registered or newly matching companies.

## `monitorName` (type: `string`):

Separate memory for each monitor, e.g. 'new-gmbh-leipzig'.

## `requestDelaySecs` (type: `integer`):

Pause between requests to the public portal. Minimum 2.

## `proxyConfiguration` (type: `object`):

Every search runs in its own portal session. Apify Proxy (datacenter) is recommended: the portal often refuses document downloads from shared cloud IPs.

## Actor input object example

```json
{
  "searchTerms": [
    "Siemens Energy",
    "Trade Republic Bank"
  ],
  "registerNumbers": [],
  "keywordMatch": "all",
  "includeDeleted": false,
  "similarSoundingNames": false,
  "includeDetails": true,
  "maxResultsPerSearch": 10,
  "maxItems": 20,
  "onlyNewCompanies": false,
  "monitorName": "default",
  "requestDelaySecs": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

One row per result in the default dataset.

# 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 = {
    "searchTerms": [
        "Siemens Energy",
        "Trade Republic Bank"
    ],
    "registerNumbers": [],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kamerozkan/handelsregister-api").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 = {
    "searchTerms": [
        "Siemens Energy",
        "Trade Republic Bank",
    ],
    "registerNumbers": [],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("kamerozkan/handelsregister-api").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "Siemens Energy",
    "Trade Republic Bank"
  ],
  "registerNumbers": [],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call kamerozkan/handelsregister-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kamerozkan/handelsregister-api"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/HIZ3DwWjg0qZBOxfq/builds/tfN4s8F2dc17KcA6K/openapi.json
