# North Data Scraper - German Company Financials & Officers (`kamerozkan/northdata-german-company-financials`) Actor

North Data scraper for German company financials and register data: search companies by name or keyword, get register court and ID, legal form, address, founding date, officers with roles, register events and yearly financial KPIs. Monitor mode returns only new register events. No login.

- **URL**: https://apify.com/kamerozkan/northdata-german-company-financials.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 $2.40 / 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

## North Data Scraper - German Company Financials & Officers

Export **German company financials and register data from North Data** (northdata.com) as JSON, CSV or Excel: register court and ID, legal form, status, address, founding date, corporate purpose, LEI and EUID, current officers with their roles, the full register event history and yearly financial KPIs (revenue, earnings, equity, employees, public funding, patents). Search by **company name or keyword**, paste North Data company URLs, or run it as a **register event monitor** that returns only companies with new events. No login, no North Data API key, no proxy setup.

### What does North Data Scraper do?

North Data collects the official company registers of Germany (Handelsregister), Austria, Switzerland, the United Kingdom, France, the Netherlands, Belgium, Scandinavia and 40 more countries into one European company search. This actor reads the public company pages and turns each one into a structured record: the register entry, the address with former addresses, identifiers from every register that lists the company, the officers in their business roles, dated register events (registration, name and capital changes, moves, statute changes, mergers, insolvency, liquidation) with links to the official publication, and the financial KPIs North Data shows for free, year by year.

Searches work like the site: a company name with city (`Siemens AG München`) usually resolves to one company, a keyword (`Solar Berlin`) returns 15 companies per result page and the actor pages on until **Max companies per search** is reached. Use **Only these countries** to keep German (`DE`), Austrian (`AT`) or Swiss (`CH`) companies only; skipped results are not charged.

For compliance and sales monitoring, turn on **Monitor mode**: the actor remembers the register events it has seen for every company in a named watchlist and later runs return and charge only companies with new events, listed in `newEvents`.

Officers are returned by name and role only (managing director, board member, authorized signatory), as the registers publish them. No private addresses, birth dates or residence data are collected.

### Who is it for?

- **KYB, credit and compliance teams**: verify register ID, court, status, legal form, address and officers of German and European counterparties in bulk.
- **B2B sales and lead generation**: company lists by keyword with revenue, earnings and headcount signals, founding date and officers to address.
- **M\&A, private equity and market research**: yearly revenue and earnings series, public funding, patents, merger history and corporate purpose for whole peer groups.
- **Law firms, tax advisors and insolvency monitoring**: new register events (capital changes, mergers, insolvency, liquidation, new officers) for client and counterparty watchlists.
- **Data teams**: enrich a CRM or data warehouse with LEI, EUID, register IDs and financial KPIs.

### What data can you get?

| Field | Example |
|---|---|
| `name`, `legalForm`, `status` | Siemens AG, AG, active (terminated companies are marked) |
| `registerId`, `registerCourt`, `registerText` | HRB 6684, District Court of Munich, District Court of Munich HRB 6684 |
| `euid`, `lei`, `stockTickers` | DED2601V.HRB6684, W38RGI023J3WT1HWRP32, \["SIE.DE", ...] |
| `identifiers`, `formerIdentifiers` | every register entry with its source (German trade register, Danish CVR, Belgian KBO ...) |
| `street`, `postalCode`, `city`, `country`, `countryCode`, `formerAddresses` | Werner-von-Siemens-Str. 1, 80333, München, Germany, DE, \["Berlin, Germany"] |
| `foundingDate`, `purpose`, `alternateNames` | 1996-08-28, corporate purpose text, former names |
| `officers` | \[{"name": "Busch, Roland", "role": "CEO"}, ...] current officers with roles |
| `officerEvents` | dated appointments and departures with role and person |
| `registerEvents` | \[{"date": "2026-03-20", "category": "capital", "text": "Capital: €2.35B", "source": "Hrcdd", "sourceUrl": ...}] |
| `events` | all timeline events: register history, officers, M\&A, public funding and trademarks, with `section` |
| `financials` | {"Revenue": {"series": \[{"year": 2025, "value": 78914000000, "formattedValue": "€78.9B", "source": ...}]}, "Earnings": ..., "BalanceTotal": ..., "FundingAmount": ..., "Patents": ...} |
| `latestKpis` | {"Revenue": {"year": 2025, "value": 78914000000, "formattedValue": "€78.9B"}, ...} latest year of every KPI |
| `latestRevenue`, `latestRevenueYear`, `latestEarnings`, `latestEarningsYear`, `latestBalanceSheetTotal`, `latestBalanceSheetTotalYear` | 78914000000, 2025, 9620000000, 2025, null, null |
| `financialYears`, `lastEventDate` | \[2017, ..., 2026], 2026-10-01 |
| `northdataUrl`, `query`, `scrapedAt` | link to the North Data page, the input that produced the row, timestamp |
| Monitor mode: `newEvents`, `isFirstObservation` | events not seen in an earlier run of the watchlist |

Which KPIs exist depends on what the company publishes: stock-listed companies and large GmbHs show revenue and earnings, small companies often only a balance sheet total. Empty values are `null` or `[]`.

### How much does it cost?

You pay per company record: **$3.00 per 1,000 companies** ($0.003 per company) on the Free plan, with Store discounts on paid Apify plans: Bronze $2.70, Silver $2.55, Gold and above $2.40 per 1,000 companies. Platform usage is included. Officers, events and financials are part of the record and cost nothing extra.

Worked examples:

- A peer group of 40 companies with financials, officers and register history: 40 x $0.003 = **$0.12**.
- A keyword search returning 300 German companies: **$0.90**.
- A weekly monitor of 200 client companies where 6 have new register events: 6 x $0.003 = $0.018 per week, about **$0.08 a month**. Unchanged companies are not charged.

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

### How to use it

1. Click **Try for free**.
2. Enter company names, keywords or North Data company URLs, one per line. Add **Only these countries** (`DE`) to stay in Germany.
3. Set **Max companies per search** and **Max companies in total**.
4. Click **Start** and download results as JSON, CSV or Excel, or read them through the API.
5. For monitoring, save the input as a task, turn on **Monitor mode**, give the watchlist a name and add a weekly schedule.

### Input example

```json
{
  "queries": ["Siemens AG München", "https://www.northdata.com/Siemens%20AG,%20M%C3%BCnchen/HRB%206684"],
  "countryCodes": ["DE"],
  "maxResultsPerQuery": 5,
  "maxItems": 10,
  "includeFinancials": true,
  "includeOfficers": true,
  "includeEvents": true,
  "onlyNewEvents": false
}
```

### Output example

One company record (run z5gZluSI3upsPm9aX, 2026-10-19, shortened: 139 officers, 36 events and 4 KPI series in the full row):

```json
{
  "name": "Siemens AG",
  "legalForm": "AG",
  "status": "active",
  "city": "München",
  "postalCode": "80333",
  "street": "Werner-von-Siemens-Str. 1",
  "country": "Germany",
  "countryCode": "DE",
  "northdataUrl": "https://www.northdata.com/Siemens%20AG,%20M%C3%BCnchen/HRB%206684",
  "foundingDate": "1996-08-28",
  "purpose": "Development, manufacture, supply, operation and distribution of as well as trade in products, systems, plants and solutions ...",
  "alternateNames": ["Siemens Setr"],
  "lei": "W38RGI023J3WT1HWRP32",
  "identifiers": [
    {"source": "Ut", "sourceName": "German Trade Register Company Profile", "value": "District Court of Munich HRB 6684"},
    {"source": "Stockp", "sourceName": "Stock exchange listed companies - Profiles", "value": "SIA.BR SIE.DE SIEGY SMAWF SMNS.TO"},
    {"source": "EUID", "sourceName": null, "value": "DED2601V.HRB6684"}
  ],
  "formerIdentifiers": [{"source": "Cvrcom", "sourceName": "Danish Central Business Register", "value": "CVR 17887750"}],
  "registerText": "District Court of Munich HRB 6684",
  "registerCourt": "District Court of Munich",
  "registerId": "HRB 6684",
  "euid": "DED2601V.HRB6684",
  "stockTickers": ["SIA.BR", "SIE.DE", "SIEGY", "SMAWF", "SMNS.TO"],
  "formerAddresses": ["Berlin, Germany"],
  "officers": [
    {"name": "Busch, Roland", "role": "CEO", "type": "Person"},
    {"name": "Bienert, Veronika", "role": "Member of the Executive Board", "type": "Person"}
  ],
  "registerEvents": [
    {"section": "History", "date": "2026-03-20", "until": null, "category": "capital", "text": "Capital: €2.35B", "current": true, "source": "Hrcdd", "sourceUrl": null, "eventId": "4598647455088640"},
    {"section": "History", "date": "1996-08-28", "until": null, "category": "registration", "text": "Registration", "current": true, "source": "Ut", "sourceUrl": "https://www.handelsregister.de/rp_web/search.do?registergericht=D2601&registerArt=HRB&registerNummer=6684", "eventId": "4320788860"}
  ],
  "officerEvents": [
    {"section": "Persons", "date": "2021-03-15", "until": null, "category": "officer", "text": "CEO Roland Busch", "current": true, "source": "Hrb", "role": "CEO", "person": "Roland Busch", "eventId": "6491175889"},
    {"section": "Persons", "date": "2011-05-20", "until": "2021-03-15", "category": "officer", "text": "Member of the Executive Board Roland Busch", "current": false, "source": "Hrb", "role": "Member of the Executive Board", "person": "Roland Busch", "eventId": "10402209"}
  ],
  "financials": {
    "Revenue": {"title": "Revenue", "series": [{"year": 2024, "value": 75930000000, "formattedValue": "€75.9B", "consolidated": false, "estimate": false, "source": "Stock exchange listed companies - Financial Data", "publicationDate": "2024-09-30"}, {"year": 2025, "value": 78914000000, "formattedValue": "€78.9B", "consolidated": false, "estimate": false, "source": "Stock exchange listed companies - Financial Data", "publicationDate": "2025-09-30"}]},
    "Earnings": {"title": "Earnings", "series": [{"year": 2025, "value": 9620000000, "formattedValue": "€9.62B", "consolidated": false, "estimate": false, "source": "Stock exchange listed companies - Financial Data", "publicationDate": "2025-09-30"}]}
  },
  "latestKpis": {"Revenue": {"year": 2025, "value": 78914000000, "formattedValue": "€78.9B"}, "Earnings": {"year": 2025, "value": 9620000000, "formattedValue": "€9.62B"}, "FundingAmount": {"year": 2026, "value": 17370662.73, "formattedValue": "€17.4M"}, "Patents": {"year": 2026, "value": 314, "formattedValue": "314"}},
  "latestRevenue": 78914000000,
  "latestRevenueYear": 2025,
  "latestEarnings": 9620000000,
  "latestEarningsYear": 2025,
  "latestBalanceSheetTotal": null,
  "latestBalanceSheetTotalYear": null,
  "financialYears": [2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026],
  "lastEventDate": "2026-10-01",
  "query": "https://www.northdata.com/Siemens%20AG,%20M%C3%BCnchen/HRB%206684",
  "scrapedAt": "2026-10-19T08:41:12+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 or a webhook.

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("kamerozkan/northdata-german-company-financials").call(run_input={
    "queries": ["Siemens AG München"],
    "countryCodes": ["DE"],
    "maxItems": 5,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["name"], item["registerId"], item["latestRevenue"], len(item["officers"]))
```

### FAQ

**Which countries are covered?** Every register North Data lists: Germany, Austria, Switzerland, Liechtenstein, the United Kingdom, France, Belgium, the Netherlands, Luxembourg, Denmark, Norway, Sweden, Finland, Poland, Czechia and more. German companies carry `registerId` (HRB, HRA, GnR, VR, PR) and `registerCourt`; other countries carry their national identifier (Siren, CVR, KBO, Companies House number) in `registerId` and `identifiers`.

**Does it return the premium financial history?** No. It reads what North Data shows without a subscription: the yearly KPI charts, the register events, the officers and the identifiers. Detailed balance sheets behind the premium banner are not collected.

**How does monitor mode decide what is new?** Every register, officer, M\&A and funding event has a North Data publication ID. The actor stores the IDs seen per company in the key-value store `northdata-company-monitor` under your watchlist name. A later run compares and returns only companies with unknown IDs. The first run of a watchlist returns every company once.

**Can I search by register ID?** Yes. Type the register text as North Data shows it (`HRB 6684 München`) or paste the company URL from northdata.com; URLs are read directly without a search.

**Is it legal to collect this data?** The data comes from official company registers that publish it by law and from North Data's public pages. Officers appear in their business role only. You are responsible for how you use the data, including privacy laws like GDPR.

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

### Support

Questions, missing fields or a register that is parsed wrongly: open an issue on the **Issues** tab of this actor with the run link. Issues are answered within one business day.

# Actor input Schema

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

One entry per line: a company name (Siemens AG München), a keyword (Solar Berlin) or a North Data company page URL (https://www.northdata.com/Siemens+AG,+München/HRB+6684). Names and keywords run a North Data search; URLs are read directly.

## `maxResultsPerQuery` (type: `integer`):

Search results to read per name or keyword (15 per result page). Direct URLs ignore this.

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

Stop after this many company records. You are charged per company record, so this also caps the cost of the run.

## `countryCodes` (type: `array`):

ISO country codes (DE, AT, CH, GB, FR, NL ...). Search results from other countries are skipped and not charged. Empty means all countries. Pasted company URLs are always read.

## `includeFinancials` (type: `boolean`):

Yearly revenue, earnings, equity, employees, public funding and patents as North Data shows them for free (financials object plus latestRevenue, latestEarnings fields).

## `includeOfficers` (type: `boolean`):

Current officers with their role (managing director, board member, authorized signatory) and the officer appointment history. Business role only, no private data.

## `includeEvents` (type: `boolean`):

Register history (registration, name, capital, address, statute, merger, insolvency), M\&A and public funding events with dates and source links.

## `onlyNewEvents` (type: `boolean`):

Remembers the register events seen for each company in the named key-value store northdata-company-monitor. Later runs return and charge only companies that have new events (field newEvents). The first run of a watchlist returns every company.

## `watchlistName` (type: `string`):

Separates independent monitor watchlists (for example one per client). Used only in monitor mode.

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

Apify Proxy is recommended. Datacenter proxies are used first; if North Data blocks them the run switches to residential proxies automatically.

## Actor input object example

```json
{
  "queries": [
    "Siemens AG München",
    "https://www.northdata.com/Siemens%20AG,%20M%C3%BCnchen/HRB%206684"
  ],
  "maxResultsPerQuery": 5,
  "maxItems": 10,
  "countryCodes": [
    "DE"
  ],
  "includeFinancials": true,
  "includeOfficers": true,
  "includeEvents": true,
  "onlyNewEvents": false,
  "watchlistName": "default",
  "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 = {
    "queries": [
        "Siemens AG München",
        "https://www.northdata.com/Siemens%20AG,%20M%C3%BCnchen/HRB%206684"
    ],
    "maxResultsPerQuery": 5,
    "maxItems": 10,
    "countryCodes": [
        "DE"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kamerozkan/northdata-german-company-financials").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": [
        "Siemens AG München",
        "https://www.northdata.com/Siemens%20AG,%20M%C3%BCnchen/HRB%206684",
    ],
    "maxResultsPerQuery": 5,
    "maxItems": 10,
    "countryCodes": ["DE"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("kamerozkan/northdata-german-company-financials").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": [
    "Siemens AG München",
    "https://www.northdata.com/Siemens%20AG,%20M%C3%BCnchen/HRB%206684"
  ],
  "maxResultsPerQuery": 5,
  "maxItems": 10,
  "countryCodes": [
    "DE"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call kamerozkan/northdata-german-company-financials --silent --output-dataset

```

## MCP server setup

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

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/VB2h1jcjFxcFKkxfK/builds/p7C2CR7UkWmDVzbtB/openapi.json
