# Germany Handelsregister · Search, Profile & KYB (`corent1robert/germany-handelsregister-scraper`) Actor

Search by company name or paste court + HRB — legal form, capital, address and directors. No API key. Official German company register.

- **URL**: https://apify.com/corent1robert/germany-handelsregister-scraper.md
- **Developed by:** [Corentin Robert](https://apify.com/corent1robert) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 company retrieved — basics

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 — HRB, Address & Directors

Paste a **company name** (or **court + HRB / HRA number**) and get matching German companies as a clean dataset: court, register number, status, legal form, share capital, registered address — and on **KYB**, directors / legal representatives.

**No API key. No account. Public register only.** This Actor does **not** crawl company websites or collect emails.

Built for: German B2B suppliers · outbound / SDR · KYB & compliance · market research

***

### Who is this for?

| You are… | Typical goal | Suggested setup |
|-----------|--------------|-----------------|
| B2B supplier or SaaS vendor | Prospect list by name, state, or legal type | Company name · Profile |
| Outbound SDR / sales team | Legal name, court and address before outreach | Company name · Profile |
| Compliance or KYB analyst | Verify HRB, legal form, capital, seat and directors | Register ids · KYB |
| Market researcher | Map companies in a Land or register type | Company name + state · Basic |
| Legal or accounting firm | Confirm registration date and disclosed accounts | Register ids · Profile |
| Data / ops | Backfill CRM with official register fields | Register ids · Profile |

**By default (Profile)** you get court, HRB/HRA, name, city, status, legal form, capital, registration date and registered address. **Basic** is the search row only (faster). **KYB** adds directors (Vorstand / Geschäftsführer). Turn **All representatives** on if you also need Prokuristen.

The Handelsregister does **not** publish emails or a company website. Use the legal name + city in an enricher if you need inboxes.

***

### What it does

| Mode | How it works | Best for |
|------|--------------|----------|
| Company name | Keywords on the official extended search (all / at least one / exact). Optional federal state (max 2) and register type. | Discovery lists |
| Register ids | Paste `Mannheim HRB 719915` (court + number). | CRM backfill, KYB checks |

German companies are identified by **court + register type + number**, not by a national number like a UK company number or a French SIREN.

***

### What it extracts

#### Search row (all runs)

| Field | Description |
|-------|-------------|
| `registerNummer` | e.g. `HRB 719915` |
| `registerArt` | HRB, HRA, GnR, VR, PR, GsR |
| `name` | Registered name |
| `court` | Amtsgericht |
| `state` | Federal state |
| `city` | City from the result list |
| `status` | e.g. aktuell |
| `documents` | Document codes listed on the portal (AD, CD, UT, SI, …) |

#### Profile / KYB

| Field | Description |
|-------|-------------|
| `legalForm` | e.g. GmbH, SE |
| `capital` | Share capital as published |
| `registeredOn` / `deletedOn` | Entry / deletion date |
| `accountsFiledTo` | Last disclosed annual accounts (if shown) |
| `registeredAddress` | Address block (plus postcode / city / country when parsed) |
| `directorName` / `directorRole` / `directorDateOfBirth` | Primary legal representative (**KYB**) |
| `officers` | All parsed representatives (**KYB**) |
| `representation` | Representation rule when published (**KYB**) |

Missing fields are `null`. Unknown court names or numbers with no hit are **logged and not billed**.

***

### Quick start

1. Open this Actor in Apify Console
2. Keep **Mode = Company name**, leave the prefilled example or type a firm name
3. Pick **Profile** (or Basic / KYB)
4. Set **Max companies** to 10 for a preview → **Start**

To enrich ids you already have: Mode = **Register ids**, one `Court HRB nnnnn` per line.

***

### Input

| Field | Console | Notes |
|-------|---------|--------|
| `mode` | Mode | `keyword` or `registerIds` |
| `keywords` | Company name | Ignored in register-ids mode |
| `keywordMatch` | Keyword match | `all` / `min` / `exact` |
| `federalStates` | Federal states | Max **two**. Empty = nationwide |
| `registerArt` | Register type | Optional HRB/HRA/… filter |
| `registerIds` | Court + number | e.g. `München HRB 12345` |
| `enrichmentLevel` | Depth | `basic` / `profile` / `kyb` |
| `officersScope` | KYB officers | `directors` (default) or `all` (includes Prokuristen) |
| `maxResults` | Cap | `0` = no cap (free plan still capped at 100) |

***

### Output example

```json
{
  "registerNummer": "HRB 719915",
  "registerArt": "HRB",
  "name": "SAP SE",
  "court": "Mannheim",
  "state": "Baden-Württemberg",
  "city": "Walldorf",
  "status": "aktuell",
  "legalForm": "Europäische Aktiengesellschaft (SE)",
  "capital": "1.228.504.232,00 EUR",
  "registeredOn": "07.07.2014",
  "registeredAddress": "SAP SE, Dietmar-Hopp-Allee 16, 69190 Walldorf, Deutschland",
  "addressPostcode": "69190",
  "directorName": "Ada Beispiel",
  "directorRole": "Geschäftsführerin",
  "officers": [
    { "name": "Ada Beispiel", "firstName": "Ada", "lastName": "Beispiel", "role": "Geschäftsführerin", "bornOn": "1979-03-12" }
  ],
  "documents": ["AD", "CD", "HD", "DK", "UT", "VÖ", "SI"],
  "extractedAt": "2026-08-18T12:00:00.000Z"
}
```

Dataset views: **Overview**, **Outreach / CRM**, **KYB / Compliance**.

***

### How to use

1. Choose **Company name** or **Register ids**
2. Fill keywords **or** court + HRB lines
3. Choose enrichment depth
4. Start. Export CSV / Excel / JSON from the dataset

***

### Pricing

Pay per saved company (not-found ids are free):

| Event | What you get | Price |
|-------|----------------|-------|
| `company-basic` | Search row | $0.001 |
| `company-profile` | + legal form, capital, address | $0.003 |
| `company-kyb` | + directors / legal representatives | $0.004 |

***

### Limitations

- **No emails, no website harvest.** The public portal does not publish them.
- **Directors on KYB only.** Default is Vorstand / Geschäftsführer. Prokuristen are opt-in (`officersScope: all`).
- Identity is **court + HRB/HRA**, not a single national number. You must include the court when enriching a list.
- At most **two federal states** per name search (portal rule).
- **Targeted enricher, not a national dump.** Each name search returns at most **100 matches**. The Actor paces lookups to stay within the public register's usage rules — large KYB lists take longer; raise the run timeout.
- Register dates on the portal can include a system disclaimer; we store the date as shown.

***

### Same suite

Official-register scrapers in the same family:

- [France — recherche entreprises / SIREN](https://apify.com/corent1robert/recherche-entreprises-scraper)
- [Belgium — BCE / KBO](https://apify.com/corent1robert/belgium-bce-kbo-company-enrich)
- [UK — Companies House](https://apify.com/corent1robert/uk-companies-house-scraper)

***

### FAQ

**Do I need an API key?** No.

**Can I paste a handelsregister.de search URL?** The portal is session-based (no stable public search URL). Use keywords or court + number instead.

**Why is my court “not found”?** Use the Amtsgericht name as on the portal (e.g. `Mannheim`, `München`, `Charlottenburg`).

**Does Basic include the address?** No. Address, legal form and capital come from **Profile** / **KYB**.

***

### Local development

```bash
npm install
npm test
## edit input.json then:
npx apify run
```

***

### Support

Issues and feature requests via the Actor’s **Issues** tab on Apify, or the Store listing.

# Actor input Schema

## `mode` (type: `string`):

**Company name** — keywords as on handelsregister.de extended search.

**Register ids** — paste court + number (e.g. `Mannheim HRB 719915`).

## `keywords` (type: `string`):

Name as published in the register. **Ignored** in Register ids mode.

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

How keywords must match the company name. **Ignored** in Register ids mode.

## `federalStates` (type: `array`):

Leave empty for all of Germany. The portal allows **at most two** states. **Ignored** in Register ids mode.

## `registerArt` (type: `string`):

Limit to HRB (GmbH/AG), HRA, etc. **Ignored** in Register ids mode unless you also set it there via the pasted id.

## `registerIds` (type: `array`):

One company per line: `Mannheim HRB 719915` or `Amtsgericht München HRB 12345`. Duplicates are skipped. **Required** in Register ids mode; **ignored** in Company name mode.

## `enrichmentLevel` (type: `string`):

**Basic** — court, HRB/HRA, name, city, status.

**Profile** — adds legal form, capital, registration date and registered address.

**KYB** — also extracts directors / legal representatives (name, role, date of birth when published).

## `officersScope` (type: `string`):

**Directors only** — Vorstand / Geschäftsführer (CRM-ready). **All representatives** also includes Prokuristen. **Ignored** on Basic and Profile.

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

Cap how many companies to save. Default **25** = quick preview. Set **0** for every match (large lists take longer — raise the run timeout).

## Actor input object example

```json
{
  "mode": "keyword",
  "keywords": "SAP SE",
  "keywordMatch": "all",
  "registerArt": "all",
  "enrichmentLevel": "profile",
  "officersScope": "directors",
  "maxResults": 25
}
```

# Actor output Schema

## `dataset` (type: `string`):

One row per company — register number, name, court, legal form, capital, address.

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

Identity, court, legal form and address.

## `outreachCrm` (type: `string`):

Company name, legal form, city and address.

## `kybCompliance` (type: `string`):

Legal form, capital, directors and document types.

## `runLog` (type: `string`):

Plain-text log of the run phases and progress.

# 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 = {
    "keywords": "SAP SE"
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/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 = { "keywords": "SAP SE" }

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/germany-handelsregister-scraper").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 '{
  "keywords": "SAP SE"
}' |
apify call corent1robert/germany-handelsregister-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/QqgqWwC91zAlQcbhv/builds/YHwqFhs0S1rt8oelT/openapi.json
