# German Company KYC 🇩🇪: Handelsregister, HRB, Officers (`tagadanar/german-company-kyc`) Actor

Verify any German company straight from the official Handelsregister: register number, court, status, address, capital and officers (Geschäftsführer, Prokura). Pay per company found.

- **URL**: https://apify.com/tagadanar/german-company-kyc.md
- **Developed by:** [Tagada Data](https://apify.com/tagadanar) (community)
- **Categories:** Lead generation, Automation, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $105.00 / 1,000 company extracteds

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

## German Company KYC: Handelsregister Extract with Officers

**Turn a German company name into its official register record: HRB/HRA number, register court, legal form, registered address, business purpose, share capital, representation rule and the current officers (Geschäftsführer, Vorstand, Prokura), straight from the Handelsregister.** One input line per company; the actor searches the official Registerportal der Länder, picks the right entity, downloads the free structured register content and delivers it as one flat record.

Built for **KYB/compliance teams onboarding German counterparties, credit and risk analysts, law firms, and B2B sellers who need to know who actually signs for a GmbH** before a deal. Commercial registry resellers charge 4 euros and more per document lookup; this actor reads the same public register directly.

### Why this actor

- Officers included: the structured register content lists the current Geschäftsführer, Vorstand and Prokuristen with their roles, and where the register publishes it, the representation rule (who may sign alone, who jointly).
- Precise input, precise answer: search by name, or pin the exact entity with a register number and court ("BioNTech SE, HRB 48720, Mainz"). Legal-form spellings are normalized, so "Volkswagen AG" finds "VOLKSWAGEN AKTIENGESELLSCHAFT".
- A wrong register number cannot silently deliver the wrong company: when the register entry found by number does not resemble the name you gave, the actor falls back to a name search, and any residual doubt ships flagged as `nameMismatch` instead of buried.
- Not-found is an answer: companies without a match come back as explicit uncharged `found: false` rows, so a batch reconciles line by line.
- Polite by design: one session per run, sequential rate-limited requests against the public portal, no bulk crawling. Per-query lookups only.
- Direct from the source: the Registerportal der Länder (handelsregister.de), free tier, no account, no reseller in between. Every record carries its source attribution and retrieval timestamp.

### Use cases

- **Counterparty onboarding (KYB)**: verify legal name, register number, status and signing officers before contracting.
- **Credit and supplier risk**: check status (active vs deleted), founding date, share capital and register history of a prospective partner.
- **Sales intelligence**: the Geschäftsführer of a GmbH is the decision maker; get the name from the register, not a stale database.
- **Legal and M\&A research**: batch-verify target lists with register numbers and courts.
- **AI agents**: plug it into Claude, Cursor or any MCP client and ask, *"who are the managing directors of this GmbH?"*

### Input

```json
{
    "companies": [
        "Zalando SE",
        "BioNTech SE, HRB 48720, Mainz",
        "Musterfirma GmbH, Berlin"
    ],
    "maxMatchesPerCompany": 1
}
```

Each entry is a name, optionally followed by a register number and a register court, comma-separated in any order. You can also pipe a dataset from another actor; entries that are objects are read through their usual keys (`name`, `company`, `companyName`, `firma`).

### Output

```json
{
    "query": "Zalando SE",
    "found": true,
    "legalName": "Zalando SE",
    "registerType": "HRB",
    "registerNumber": "HRB 158855 B",
    "registerCourt": "Amtsgericht Berlin (Charlottenburg)",
    "status": "active",
    "legalForm": "Europäische Aktiengesellschaft (SE)",
    "seat": "Berlin",
    "address": { "street": "Valeska-Gert-Straße", "houseNumber": "5", "postalCode": "10243", "city": "Berlin", "full": "Valeska-Gert-Straße 5, 10243 Berlin" },
    "businessPurpose": "...",
    "shareCapital": { "amount": 250249984, "currency": "EUR" },
    "representationRule": "...",
    "officers": [
        { "role": "Vorstand", "name": "Robert Gentz", "city": "Berlin", "birthDate": "..." }
    ],
    "source": "handelsregister.de (Registerportal der Länder, free structured register content)",
    "retrievedAt": "2026-07-17T10:00:00.000Z"
}
```

### Pricing

You pay per company record actually extracted, plus a small run start fee. Not-found rows are free. Registry document resellers charge 4 to 12 euros per extract; this actor delivers the free structured register content for a fraction of that.

### FAQ

**Is this the official register?** Yes. The data comes from the Registerportal der Länder at handelsregister.de, the joint public portal of the German federal states, which has been free to access since 2022. The actor reads the free structured register content ("SI" documents); it never buys paid documents (AD/CD/HD chronological or historical prints).

**What if the free tier does not expose something?** Then the record honestly omits it. Fields like share capital or representation rule appear when the register publishes them for that entity; officers are included for virtually all active companies.

**Why did a query come back with `nameMismatch: true`?** The register number you provided points at an entity whose name does not resemble the name you gave, and no better name match was found. Check the register number; two entities are never behind one number, so one of the two inputs is off.

**How fast is it?** Deliberately unhurried. The portal is a shared public service, so the actor paces its requests (about 1.5 seconds between calls) and processes companies sequentially. Plan roughly 8 to 15 seconds per company.

**Is this GDPR-compliant?** Officer names in the Handelsregister are published by law for legal certainty in commerce (§ 9 HGB). This actor only reads what the register makes public. As the user of the data you are responsible for your own lawful basis and for using it in line with GDPR, especially for direct marketing.

# Actor input Schema

## `companies` (type: `array`):

One entry per company. A plain name works (<code>Zalando SE</code>). For an exact lookup add the register number and court, separated by commas: <code>BioNTech SE, HRB 48709, Mainz</code> or just <code>HRB 48709, Mainz</code>. Bulk lists are fine.

## `maxMatchesPerCompany` (type: `integer`):

How many matching register entries to return per input entry. Keep 1 for KYB verification of a known company; raise it to explore a group's subsidiaries.

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

Also search closed register sheets (gelöschte Firmen). Useful to check whether a counterparty was struck off.

## `pushNotFoundRecords` (type: `boolean`):

When enabled, entries with no register match produce a record with <code>found: false</code> so bulk pipelines can track misses. Not-found records are never charged.

## Actor input object example

```json
{
  "companies": [
    "Zalando SE",
    "BioNTech SE, HRB 48720, Mainz"
  ],
  "maxMatchesPerCompany": 1,
  "includeDeleted": false,
  "pushNotFoundRecords": true
}
```

# Actor output Schema

## `companies` (type: `string`):

All extracted company records (one item per register entry) 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 = {
    "companies": [
        "Zalando SE",
        "BioNTech SE, HRB 48720, Mainz"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/german-company-kyc").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 = { "companies": [
        "Zalando SE",
        "BioNTech SE, HRB 48720, Mainz",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/german-company-kyc").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 '{
  "companies": [
    "Zalando SE",
    "BioNTech SE, HRB 48720, Mainz"
  ]
}' |
apify call tagadanar/german-company-kyc --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=tagadanar/german-company-kyc",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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