# German Company Registry Scraper - Firms & Officers (`scrapesage/german-company-registry-scraper`) Actor

Scrape German and European commercial register data - company name, register court and number, address, founding date, LEI code and the full list of directors and officers.

- **URL**: https://apify.com/scrapesage/german-company-registry-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Lead generation, Jobs, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 company scrapeds

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

## German Company Registry Scraper - Firms & Officers

Scrape **German commercial-register data** — company name, register court and number, address, founding date, LEI code — plus the **full list of directors and officers** with their job titles. **No login, no API key.**

Also covers **15 other European registers** in the same run: Austria, Switzerland, Belgium, France, the Netherlands, the Nordics, the Baltics and more.

The European sibling to my **Companies House Scraper** (UK).

***

### What you get

One row per company:

| Field | What it is |
|---|---|
| `companyName` | Registered legal name |
| `registerCourt` | e.g. "Amtsgericht Charlottenburg (Berlin)" |
| `registerType`, `registerNumber` | e.g. `HRB` / `158855 B` |
| `registerId` | The full register identifier as published |
| `street`, `postalCode`, `city`, `countryCode`, `fullAddress` | Registered address |
| `foundingDate` | Incorporation date (ISO) |
| `leiCode` | Legal Entity Identifier, where the company holds one |
| `status` | `active` / `inactive` |
| **`officers`** | **Every director and officer: name, first/last name, job title, city, profile URL** |
| `officerCount` | How many |
| `northDataUrl` | Source record |

### Ways to search

- **By company name** — `["zalando", "delivery hero"]`
- **By country** — restrict to `DE`, `AT`, `CH`, `BE`, `FR`, `NL`…
- **By URL** — paste record URLs directly for companies you already know

***

### Example input

```json
{
  "queries": ["software gmbh"],
  "country": "DE",
  "onlyWithOfficers": true,
  "maxPerQuery": 20,
  "maxResults": 100,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### Example output

```json
{
  "type": "company",
  "companyName": "Zalando SE",
  "registerCourt": "Amtsgericht Charlottenburg (Berlin)",
  "registerType": "HRB",
  "registerNumber": "158855 B",
  "city": "Berlin",
  "countryCode": "DE",
  "leiCode": "529900YRFFGH5AXU4S86",
  "status": "active",
  "officerCount": 16,
  "officers": [
    { "name": "Schneider, Robert", "jobTitle": "Vorstand", "city": "Berlin" }
  ]
}
```

***

### Pricing

**$0.01 per company.** You are charged only for records actually delivered.

### You are not billed for the wrong companies

Search an unknown name and the source answers with a page of **unrelated companies** rather than an empty result. By default (`requireNameMatch`) this actor rejects results whose name doesn't match your search **before their page is even fetched** — no request, no charge — and the run tells you so. Turn it off to keep everything returned.

### Honest limits

- **`registerCourt` is German-only.** It's parsed out of the register identifier, and the other European registers this covers use a plain number with no court — Belgian KBO, French Siren, Bulgarian UIC, Lithuanian JAR. `registerType` and `registerNumber` are populated either way.
- **`leiCode` exists only for companies required to hold one** (typically those active in financial markets). Most SMEs have none; it's never fabricated.
- **`officers` are present on ~83% of records.** Branches, dormant and very new entities may list none — `officerCount` is then `0`, never null, so the two fields can't disagree.
- **No revenue or employee figures.** The source renders those behind its paid tier, so shipping the fields would mean shipping them permanently empty.

### Tips

- `onlyWithOfficers: true` gives a clean decision-maker list for B2B outreach.
- Search by legal-form keyword (`"ug haftungsbeschraenkt"`, `"software gmbh"`) plus `country` to build sector lead lists.
- Dedupe on `northDataUrl` when accumulating scheduled runs.

### Related actors

- **Companies House Scraper** — the same job for the UK: companies, directors and PSCs

# Actor input Schema

## `queries` (type: `array`):

Company names to search for. Full legal names work best, e.g. 'Zalando SE'.

## `startUrls` (type: `array`):

Paste northdata.de company URLs directly to scrape known companies without searching.

## `country` (type: `string`):

Restrict the search to one country, e.g. DE, AT, CH, BE, FR, NL. Leave empty to search all covered European registers.

## `onlyWithOfficers` (type: `boolean`):

Keep only companies that list at least one director or officer.

## `requireNameMatch` (type: `boolean`):

North Data answers an unknown company name with a page of unrelated companies rather than an empty result. With this on, results whose name does not match your search are rejected before their page is even fetched - nothing stored, nothing billed. Turn off to keep everything North Data returns.

## `maxPerQuery` (type: `integer`):

How many matching companies to open for each search term.

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

Total cap across every search. Set 0 for no limit (explicit opt-in).

## `concurrency` (type: `integer`):

Parallel company-page fetches.

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

A residential proxy is recommended.

## Actor input object example

```json
{
  "queries": [
    "zalando",
    "delivery hero"
  ],
  "country": "DE",
  "onlyWithOfficers": false,
  "requireNameMatch": true,
  "maxPerQuery": 10,
  "maxResults": 50,
  "concurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Every scraped company as a JSON item 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 = {
    "queries": [
        "zalando"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/german-company-registry-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 = { "queries": ["zalando"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/german-company-registry-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 '{
  "queries": [
    "zalando"
  ]
}' |
apify call scrapesage/german-company-registry-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapesage/german-company-registry-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/oaxaBawkenS4angha/builds/uWoBaD9Xz9alNwNSw/openapi.json
