# North Data Scraper - EU Company Register & Officers (`crawloop/northdata-scraper`) Actor

Scrape North Data for European company register records: court and number (HRB, Companies House, Siren, KVK), EUID, LEI, address, officers, published financials and events. Search by legal name or paste a profile URL. Fast HTTP crawl on Apify, no login.

- **URL**: https://apify.com/crawloop/northdata-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 company profiles

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 - EU Company Register & Officers

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by North Data GmbH. Data is read from publicly accessible pages only. No login and no official API key. You are responsible for complying with applicable law (including GDPR where officer names appear) and the site’s terms. North Data’s terms prohibit using the data for credit assessments. No warranty on accuracy or completeness. Provided for informational and research use.

> **Register officers:** Officer names and roles come from public commercial-register pages. Keep `includeOfficers` on only when you have a lawful basis to process that personal data.

| North Data (EU registers) | Europages (EU directory) | WLW (DACH directory) |
| :--- | :--- | :--- |
| **North Data Scraper** ◄── you are here | [Europages Scraper](https://apify.com/crawloop/europages-scraper) | [WLW Scraper](https://apify.com/crawloop/wlw-scraper) |
| Handelsregister, Companies House, Siren, KvK, officers, published financials | Europe-wide B2B suppliers, VAT, contacts | DE / AT / CH suppliers, phone, email, VAT |

**North Data scraper** for Apify — turn a **legal name** or **company profile URL** into structured **European commercial-register data**. Collect **register court and number** (HRB / HRA, Companies House, Siren, KVK, KBO), **EUID**, **LEI**, **registered address**, **company officers** with roles, **published financial time series** when accounts exist, and **register events** (capital changes, mergers, insolvency flags).

Use it as a **North Data API alternative** for KYB / counterparty checks, CRM enrichment, and supplier vetting — without wrapping the paid Data Services API. Fast HTTP crawl (`curl_cffi`) — no headless browser. Export **JSON**, **CSV**, or **Excel**. Works from **Python**, **Node.js**, or an **MCP** / AI assistant via Apify.

### Use cases

| Use case | What you get |
| :--- | :--- |
| **KYB / counterparty check** | Court + number, EUID, LEI, status, recent register events |
| **CRM enrichment** | Resolve a legal name to a canonical register identity and address |
| **Officer mapping** | Managing directors / board members with roles and person URLs |
| **Supplier risk** | Insolvency / liquidation flags from the public event feed |
| **Listed-company financials** | Yearly revenue and earnings when North Data publishes figures |
| **Register ID harvest** | Search-only rows (name, city, HRB/Siren label, URL) without opening profiles |

### When to use this Actor

- You need **North Data company profiles** as one dataset row per company
- You have **legal names**, **keywords**, or **North Data profile URLs**
- You want **officers, EUID/LEI, and published financials** without an official API key
- You prefer a **browser-free** HTTP scrape on Apify (Python or Node.js client, or MCP)

### When not to use this Actor

- **Paywalled North Data fields** (full shareholders, some charts, printing) — public HTML only
- **Guaranteed revenue on every SME** — most small companies never publish accounts
- **More than ~45 hits per anonymous search** — that ceiling is the website, not this Actor
- **Credit scoring** — forbidden by North Data’s terms; this Actor is for research / KYB identity
- **Official bulk API / quarterly exports** — that is North Data’s paid Data Services product
- **B2B directory contacts** (phone, email, VAT on supplier listings) — use Europages or WLW instead

### Key features

- **Name search** — `searchQueries` paginates public results (15 per page, 45 anonymous cap)
- **Profile URLs** — paste a company page and skip search
- **Search-only mode** — `fetchProfiles: false` returns identity rows without opening each page
- **Officers** — name, role, city, person URL from structured data
- **Financial series** — year, value, filing title and date when North Data publishes figures
- **Register events** — registration, capital, management, mergers; `insolvency` boolean
- **English or German** labels (`northdata.com` / `northdata.de`)
- **HTTP only** — Chrome TLS fingerprint, 256 MB default, datacenter proxy is enough
- **Deduped push** — unique by profile URL within a run

### Input parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `searchQueries` | Array | `["Bayerische Motoren Werke"]` | Company names or keywords. Legal names rank better than short tokens like BMW. |
| `startUrls` | Array | `[]` | Profile and/or search URLs. Person pages are skipped. |
| `language` | String | `"en"` | `en` (northdata.com) or `de` (northdata.de). |
| `fetchProfiles` | Boolean | `true` | Open each company page for officers, financials, EUID/LEI, events. |
| `includeOfficers` | Boolean | `true` | Officers array. |
| `includeFinancials` | Boolean | `true` | Yearly series when published. |
| `includeEvents` | Boolean | `true` | Register / officer event timeline. |
| `includePublications` | Boolean | `false` | Up to 25 patent / bulletin feed items. |
| `maxItems` | Integer | `20` | Cap across all queries and URLs. |
| `requestDelaySecs` | Number | `0.4` | Pause between HTTP requests. |
| `proxyConfiguration` | Object | Apify Proxy on | Datacenter is sufficient. |

#### Example — legal name + one profile URL

```json
{
  "searchQueries": ["Bayerische Motoren Werke"],
  "startUrls": [
    {"url": "https://www.northdata.com/Zalando%20SE,%20Berlin/HRB%20158855%20B"}
  ],
  "fetchProfiles": true,
  "includeOfficers": true,
  "includeFinancials": true,
  "maxItems": 5,
  "language": "en"
}
```

#### Example — cheap identity list (no profile fetch)

```json
{
  "searchQueries": ["Siemens Energy"],
  "fetchProfiles": false,
  "maxItems": 15
}
```

### Output fields

| Field | Description |
| :--- | :--- |
| `recordType` | `search` or `profile` |
| `name` / `alternateName` | Legal name and former / trading name when published |
| `url` | North Data profile URL |
| `registerCourt` / `registerKind` / `registerNumber` / `registerLabel` | Registrar identity (HRB, Companies House, Siren, …) |
| `euid` / `leiCode` | European Unique Identifier and LEI when published |
| `street` / `postalCode` / `city` / `country` | Registered address |
| `foundingDate` / `corporatePurpose` / `industry` | Dates, purpose, industry breadcrumb |
| `officers[]` | `name`, `role`, `city`, `url` |
| `officerCount` | Number of officers on the profile |
| `financials[]` | `{ metric, values[{ year, value, formattedValue, publicationDate }] }` |
| `revenue` / `earnings` | Latest numeric figures when a series exists |
| `events[]` | Dated register / officer events |
| `insolvency` | True if events mention insolvency or liquidation |
| `status` | `active`, `terminated`, or `liquidation` when detectable |
| `publications[]` | Optional patent / bulletin feed (max 25) |

#### Example profile row

```json
{
  "recordType": "profile",
  "name": "Bayerische Motoren Werke AG",
  "city": "München",
  "country": "DE",
  "registerKind": "HRB",
  "registerNumber": "42243",
  "registerCourt": "Munich",
  "euid": "DED2601V.HRB42243",
  "leiCode": "YEH5ZCD6E441RHVHD759",
  "officerCount": 123,
  "insolvency": false,
  "status": "active",
  "url": "https://www.northdata.com/BMW+AG,+M%C3%BCnchen/HRB+42243"
}
```

### Typical workflow

1. Start with **legal names** (`searchQueries`) or paste **profile URLs** (`startUrls`).
2. Leave **`fetchProfiles: true`** for officers, EUID/LEI, financials and events. Set it **`false`** for a cheap identity list.
3. Cap the run with **`maxItems`**. Export the dataset as JSON, CSV, or Excel.
4. For commercial contacts (phone, email, VAT on public listings), continue with [Europages Scraper](https://apify.com/crawloop/europages-scraper) or [WLW Scraper](https://apify.com/crawloop/wlw-scraper).

### Practical tips

- Prefer **legal names** over ticker-style tokens (`Bayerische Motoren Werke`, not `BMW`)
- Paste a **profile URL** when you already have the North Data page — skips search and the 45-hit cap
- Use **`language: "de"`** when you need German labels (Geschäftsführer, Handelsregister)
- Keep **`requestDelaySecs` at 0.4+** on longer crawls
- Datacenter proxy is enough; residential is not required for public HTML
- Need **DACH supplier contacts** after register IDs? Run [WLW Scraper](https://apify.com/crawloop/wlw-scraper)

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/northdata-scraper').call({
  searchQueries: ['Bayerische Motoren Werke'],
  fetchProfiles: true,
  maxItems: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 3));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token)
run = client.actor("crawloop/northdata-scraper").call(
    run_input={
        "searchQueries": ["Bayerische Motoren Werke"],
        "fetchProfiles": True,
        "maxItems": 5,
    }
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("name"), item.get("euid"), item.get("leiCode"))
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~northdata-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["Bayerische Motoren Werke"],"fetchProfiles":true,"maxItems":5}'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call `crawloop/northdata-scraper`.

Example prompts:

- "Run North Data Scraper for Bayerische Motoren Werke, max 5, return name, euid, leiCode, officers"
- "Look up Zalando SE on North Data and summarize register events and latest revenue"
- "Chain Europages Scraper then North Data Scraper to add HRB / EUID to supplier leads"

### Suite next step

North Data is **register identity** (court, number, officers, published accounts). For Europe-wide B2B directory contacts (phone, email, VAT on public listings), run [Europages Scraper](https://apify.com/crawloop/europages-scraper) next. For DACH-only Wer liefert was coverage, use [WLW Scraper](https://apify.com/crawloop/wlw-scraper). For Dutch Chamber of Commerce cards, use [KvK Handelsregister Scraper](https://apify.com/crawloop/kvk-handelsregister-scraper).

### FAQ

**Does every company have revenue?** No. Public accounts are common for listed groups and some GmbHs; most SMEs leave `revenue` / `financials` empty. Register identity is the reliable part.

**Why did “BMW” not return BMW AG first?** North Data matches the token in names. Use the legal name (`Bayerische Motoren Werke`) or a direct profile URL.

**Can I page past 45 results?** Not while anonymous. The website stops after offset 30 (45 rows). Use more specific queries or paste known profile URLs.

**Do you wrap the official North Data API?** No. This Actor reads public HTML and JSON-LD only. You do not need an API key.

**Is this a Handelsregister.de scraper?** No. It reads **North Data’s** public company pages, which aggregate Handelsregister, Companies House, Siren, KvK, KBO and other European registers. For the official German register portal itself, use a dedicated Handelsregister Actor.

**Which countries are covered?** Whatever North Data publishes on the public profile — commonly Germany, UK, France, Netherlands, Belgium and other EU registers. Coverage follows the source page, not a separate country filter.

**Are person pages supported?** No. Person URLs are skipped. Search hits that point at people are dropped; company profiles remain.

**Can I use northdata.de?** Yes. Set `language` to `de` for German labels. Register numbers (HRB, EUID, LEI) are the same.

**May I use this for credit scoring?** No. North Data’s terms forbid credit assessments. Use the dataset for research, KYB identity, and enrichment only.

### Related Actors

| Actor | Use for |
| :--- | :--- |
| **North Data Scraper** ◄── you are here | EU commercial-register identity, officers, published financials |
| [Europages Scraper](https://apify.com/crawloop/europages-scraper) | Europe-wide B2B directory, VAT & contacts |
| [WLW Scraper](https://apify.com/crawloop/wlw-scraper) | DACH B2B suppliers from Wer liefert was |
| [KvK Handelsregister Scraper](https://apify.com/crawloop/kvk-handelsregister-scraper) | Dutch Chamber of Commerce public search + KvK lookup |

# Actor input Schema

## `searchQueries` (type: `array`):

Legal names work best (e.g. Bayerische Motoren Werke). A short keyword such as BMW also matches clubs and similarly named firms. Anonymous search returns at most 45 companies per query (15 per page).

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

Company profile URLs and/or search URLs. Profile pages are scraped directly; search pages are paginated. Person pages are skipped.

## `language` (type: `string`):

North Data locale for labels (roles, event names, metric titles). Register numbers are the same in both.

## `fetchProfiles` (type: `boolean`):

On (default): fetch the profile and return officers, financial series, EUID/LEI, purpose and register events. Off: return only search-hit identity (name, city, register label, URL) — cheaper and faster.

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

Managing directors, board members and other registered officers with role, city and person URL.

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

Year-by-year revenue, earnings and similar series when North Data publishes figures. Many SMEs have none.

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

Dated register history: registration, capital changes, management changes, mergers.

## `includePublications` (type: `boolean`):

Up to 25 recent patent, trademark and bulletin items from the profile feed. Makes rows larger.

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

Hard cap across all queries and URLs. You are charged per dataset row.

## `requestDelaySecs` (type: `number`):

Polite pause between HTTP requests. Keep at 0.4 or higher for longer crawls.

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

Optional. Datacenter is enough for public North Data HTML. Leave Apify Proxy off for a local run.

## Actor input object example

```json
{
  "searchQueries": [
    "Bayerische Motoren Werke"
  ],
  "startUrls": [],
  "language": "en",
  "fetchProfiles": true,
  "includeOfficers": true,
  "includeFinancials": true,
  "includeEvents": true,
  "includePublications": false,
  "maxItems": 20,
  "requestDelaySecs": 0.4,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Default dataset items (company search hits or full profiles).

# 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 = {
    "searchQueries": [
        "Bayerische Motoren Werke"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/northdata-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 = {
    "searchQueries": ["Bayerische Motoren Werke"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/northdata-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 '{
  "searchQueries": [
    "Bayerische Motoren Werke"
  ],
  "maxItems": 20
}' |
apify call crawloop/northdata-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawloop/northdata-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/nUundXhXeSzekjPFw/builds/0SRqQTsFbMdbChweL/openapi.json
