# North Data Scraper - European Company Registry (`dami_studio/northdata-scraper`) Actor

Revenue is on a North Data page only where the company publishes accounts. The register fields are always there: registered name, legal form, register court and HRB number, EUID, LEI, address, status, industry, officers with roles. 26 countries, no account. $2.55 per 1,000.

- **URL**: https://apify.com/dami\_studio/northdata-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/actors/running/actors-in-store.md#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

## North Data Scraper API - European company registry data

Revenue is the one field North Data cannot always have: a company's accounts are on its page only
where that company is required to publish them, and most small companies publish nothing. Read the
coverage table before you count on it.

Everything that comes from the register itself is there for every company on
[North Data](https://www.northdata.com): registered name, legal form, register court and HRB
number, EUID, LEI, address, status, industry, corporate purpose, and the registered legal
representatives with their roles.

Coverage is whatever North Data itself indexes: 26 national registers, 25 of them European plus
Israel. The German Handelsregister, Austria's Firmenbuch, UK Companies House, France's Sirene/Siren,
the Dutch KvK, Sweden's Bolagsverket, Spain's Registro Mercantil and the Greek GEMI are all in
there.

### What you get

Give it a company name, or paste North Data URLs. Example row (real, from a live run):

```json
{
  "name": "Zalando SE",
  "legalForm": "SE",
  "status": "Active",
  "registryLine": "District Court of Charlottenburg (Berlin) HRB 158855 B",
  "register": "District Court of Charlottenburg (Berlin)",
  "registerNumber": "HRB 158855 B",
  "euid": "DEF1103R.HRB158855B",
  "lei": "529900YRFFGH5AXU4S86",
  "address": "Valeska-Gert-Str. 5, 10243 Berlin, Germany",
  "street": "Valeska-Gert-Str. 5",
  "postalCode": "10243",
  "city": "Berlin",
  "country": "Germany",
  "countryCode": "DE",
  "industry": "Computing infrastructure, data processing, hosting and related activities",
  "corporatePurpose": "The development, marketing and provision of internet services (e-commerce) ...",
  "officerCount": 16,
  "officers": [
    { "name": "Gentz, Robert Friedrich", "role": "CEO" },
    { "name": "Schröder, David Immanuel", "role": "Member of the Executive Board" }
  ],
  "revenue": 12321000000,
  "revenueFormatted": "€12.3B",
  "revenueYear": 2025,
  "employees": 6157,
  "latestPublicationDate": "2026-07-17",
  "url": "https://www.northdata.com/Zalando%20SE,%20Berlin/HRB%20158855%20B"
}
```

Full field list: `name`, `formerNames`, `legalForm`, `status`, `registryId`, `registryLine`,
`register`, `registerNumber`, `euid`, `lei`, `otherIdentifiers`, `address`, `formerAddresses`,
`street`, `postalCode`, `city`, `country`, `countryCode`, `industry`, `foundingDate`,
`corporatePurpose`, `officers`, `officerCount`, `revenue`, `revenueYear`, `revenueFormatted`,
`earnings`, `earningsYear`, `employees`, `patentsLatestYear`, `patentsLatestCount`,
`publicationCount`, `latestPublicationDate`, `url`, `scrapedAt`.

Two optional extras, off by default because they make rows much bigger:
`includePublications` adds up to 25 register announcements per company (appointments, capital
changes, annual reports, mergers, insolvency notices), and `includeFinancialHistory` adds the full
year-by-year revenue and earnings series instead of only the latest year.

### Input

```json
{
  "searchQueries": ["Zalando SE", "Red Bull GmbH"],
  "countries": ["DE", "AT"],
  "maxItems": 50,
  "includeDetails": true
}
```

- `searchQueries` — company names or keywords. One per line.
- `startUrls` — North Data company pages or `?query=` search pages, pasted directly.
- `countries` — restrict to any of the 26 countries North Data indexes.
- `maxItems` — hard cap on rows. You are charged per company returned.
- `includeDetails` — on by default. Turn it off for a fast name/city/register-id sweep that skips
  opening each company page.

### Billing

**$2.55 per 1,000 companies**, plus a $0.002 start fee per run. Failed runs, blocked pages and empty
searches come back as uncharged diagnostic rows, so you never pay for a row you didn't get.

### Speed and completeness

All of the numbers below come from real runs.

**North Data rate-limits per exit address, at roughly one request per second each.** That's its
limit, not a choice made here. The actor spreads work across several addresses, paces each one, and
steps a throttled address aside instead of retrying into the same wall.

- 5 companies, full detail: 5.9 seconds.
- 260 companies across 8 search terms and 18 countries: 8 minutes, 260 of 260, **zero failures**.
- So expect about **30 companies a minute**, which is roughly half an hour for 1,000.
- A search itself is fast: 24 companies found in 2 seconds. With `includeDetails` off you get name,
  city, country, register id and URL for a whole search in a few seconds, because there are no
  per-company page loads at all.
- An average detail row is about 1.6 KB of JSON.

How often each field is actually filled, over those 260 companies (mostly small special-purpose
GmbHs and sp. z o.o.s, which is the hardest case):

| Field | Filled |
|---|---|
| name, status, register, registerNumber, address, city, country, industry | 100% |
| foundingDate | 98% |
| latestPublicationDate | 97% |
| legalForm | 95% |
| euid | 89% |
| corporatePurpose | 77% |
| officers | 67% |
| lei | 7% |
| revenue | 2% |
| employees | 1% |

Revenue and employees are rare because most small European companies simply do not publish them.
Large filers and listed companies do. Zalando SE came back with €12.3B revenue for 2025 and 6,157
employees, Red Bull GmbH with €6.99B. A later 383-row sample put revenue at 7% and officers at 65%,
so treat those two as sparse whatever you search.

### What this does not do

Be aware of these limits before you buy.

- **North Data serves anonymous callers about 59 results per search term.** Past that it asks you to
  subscribe. The actor collects everything up to that ceiling and tells you in the log when it hits
  it. If you need thousands of companies, split the search into narrower terms (by city, by keyword,
  by legal form suffix) rather than expecting one broad term to return them all.
- **Country, legal-form and status filters are not applied by North Data's own full-text search for
  anonymous callers.** Those are its paid Power Search. The `countries` option here is applied
  server-side on the autocomplete surface and client-side on the full-text results, which works, but
  it narrows a fixed pool rather than searching deeper.
- **No paywalled data.** Balance sheets, profit-and-loss statements, shareholders, ownership graphs,
  risk reports and dossiers all sit behind a North Data subscription and are not collected. Revenue
  and earnings are returned only for the companies whose figures North Data publishes openly. For
  most small private companies there are none, and the fields come back `null`.
- **No personal contact details.** Officers are returned as the register publishes them: name and
  role. No emails, no phone numbers, no home addresses. Person pages are rejected as input.
- **Employee counts are sparse.** North Data only prints a headcount inside an annual-report
  announcement, so most companies have no figure.
- `legalForm` is derived from the registered name using North Data's own legal-form vocabulary,
  because North Data does not print a legal-form field on the company page. It is `null` rather than
  a guess when the name has no recognised suffix.
- With `includeDetails` off, `status` only distinguishes terminated companies; the difference between
  active and in-liquidation needs the company page.

### FAQ

**What is North Data?**
A search engine for European company registers. It aggregates the German Handelsregister and
Bundesanzeiger plus 25 other national registers into one site, with company profiles, officers and
published financials.

**Can I scrape North Data without an account?**
Yes, for the public part. Company profiles, officers, register numbers and the published revenue
charts are served to anyone. Balance sheets, shareholders and Power Search need a paid North Data
subscription, and this actor does not touch them.

**How do I get a German company's HRB number?**
Search the company name, and read `registerNumber` (for example `HRB 158855 B`) together with
`register` (`District Court of Charlottenburg (Berlin)`). `euid` gives the EU-wide identifier and
`lei` the Legal Entity Identifier when the company has one.

**Which countries are covered?**
Austria, Belgium, Croatia, Cyprus, Czech Republic, Denmark, Estonia, Finland, France, Germany,
Greece, Ireland, Israel, Lithuania, Luxembourg, Malta, Netherlands, Norway, Poland, Portugal,
Romania, Slovakia, Spain, Sweden, Switzerland and the United Kingdom.

**Can I get company financials?**
Only what North Data publishes openly: the revenue and earnings bar charts, year by year. Listed
companies and larger filers have them; small GmbHs and most partnerships do not. Full balance sheets
are paywalled and are not scraped.

**Can I look up a specific company page?**
Yes. Paste its URL into `startUrls`, for example
`https://www.northdata.com/Zalando%20SE,%20Berlin/HRB%20158855%20B`.

**Can I search for people?**
No. This is a company scraper. Person pages are rejected, and officer records carry names and roles
only.

**How many results can one search return?**
About 59 per search term, which is North Data's own anonymous ceiling. Use several narrower terms to
go past it.

**Is this legal?**
It reads pages North Data publishes to the open web without a login, and the underlying facts are
public commercial-register records. Officer names are published by the registers themselves. You are
responsible for how you use the data — GDPR still applies to the personal names in it.

### Support

If a lookup comes back wrong or empty, open an issue on the Actor page with the input you used and
the run ID, and it can be traced from there.

# Actor input Schema

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

Company names or keywords to look up on North Data. One per line. North Data serves anonymous callers roughly 59 results per search term, so use narrower terms if you need more.

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

Optional. Paste company pages (https://www.northdata.com/Zalando%20SE,%20Berlin/HRB%20158855%20B) or search pages (https://www.northdata.com/?query=Zalando). Works alongside the search terms above. Person pages are not supported.

## `countries` (type: `array`):

Optional. Restrict results to these countries. Leave empty to search all of North Data's coverage.

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

Hard cap on company records returned across all searches and URLs. You are charged per company returned.

## `includeDetails` (type: `boolean`):

On (default): opens every company page and returns the full record - register number, EUID, LEI, full address, industry, corporate purpose, officers and revenue. Off: returns only what the search listing shows (name, city, country, register id, status), which is much faster.

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

Include the company's registered legal representatives (name and role only, as published in the commercial register). No contact details are collected.

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

Include up to 25 register announcements per company (date, register, text): appointments, capital changes, annual reports, mergers, insolvency notices. Makes rows noticeably larger.

## `includeFinancialHistory` (type: `boolean`):

Include the full revenue and earnings series instead of just the latest year. Only companies that publish accounts have any figures at all.

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

Optional. The actor already uses its own egress; leave this alone unless you need to exit from a specific network.

## Actor input object example

```json
{
  "searchQueries": [
    "Zalando"
  ],
  "startUrls": [],
  "countries": [],
  "maxItems": 20,
  "includeDetails": true,
  "includeOfficers": true,
  "includePublications": false,
  "includeFinancialHistory": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per company in the default dataset: registered name, legal form, register court and HRB number, EUID, LEI, address, status, industry, officers with roles and published revenue figures. Empty or blocked runs return a single uncharged row instead.

# 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": [
        "Zalando"
    ],
    "startUrls": [],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/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": ["Zalando"],
    "startUrls": [],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/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": [
    "Zalando"
  ],
  "startUrls": [],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call dami_studio/northdata-scraper --silent --output-dataset

```

## MCP server setup

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