# North Data Scraper - European Company Register Data (`pshivam/northdata-scraper`) Actor

Scrape European company data from North Data: register number and court, address, legal form, status, founding date, purpose, officers, yearly revenue, earnings and total assets, plus register events. Search by name or paste company URLs. Export to Excel, CSV, JSON or API.

- **URL**: https://apify.com/pshivam/northdata-scraper.md
- **Developed by:** [Shivam Prajapati](https://apify.com/pshivam) (community)
- **Categories:** Business, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 1,000 companies

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 - European Company Register Data

Get **European company data** from [North Data](https://www.northdata.com), the search engine that gathers the official business registers of Germany, the UK, France, the Netherlands, Switzerland, Austria and about 20 more countries: **register number and court, address, legal form, status, founding date, corporate purpose, officers, yearly revenue, earnings and total assets, and register events**. Search by company name or paste company URLs, and export to Excel, CSV, JSON or the API.

**Actively maintained.** Last update: 2026-11-06. Every release passes 240+ automated tests on saved North Data pages plus a check against the live site, and Apify test-runs it every day.

### What can you use it for?

- **Enrich a company list.** Turn a list of company names into register numbers, addresses, legal forms and founding dates, ready for your CRM.
- **Credit and risk checks.** Pull yearly revenue, earnings, equity and total assets, and see if a company is active, in liquidation or terminated.
- **KYC and due diligence.** Get the register entry, the officers and the latest register events (role changes, capital changes, annual reports) for every company on your list.
- **Market research and lead generation.** Search a name, a branch or a city, keep one country, and collect companies with their size figures.
- **Monitoring.** Schedule it with **Only new companies** on and get, and pay for, only the companies you haven't had yet.

### What data do you get?

Fields marked *details* are filled when **Open each company for full details** is on (the default). Without it you get what North Data's search list shows.

| Field | What it is |
|---|---|
| `url` | North Data page of the company |
| `name` | Company name as registered |
| `status` | `active`, `liquidation`, `terminated` (dissolved or deleted) or `insolvency` |
| `legalForm` | Legal form written at the end of the name (AG, GmbH, Ltd., SAS ...) |
| `country`, `countryCode`, `city` | Country name, two-letter code and city of the registered office |
| `street`, `postalCode`, `address` | Street, postal code and the full address (*details*) |
| `registerCourt` | Register or court, e.g. District Court of Munich |
| `registerNumber` | Register number, e.g. HRB 6684 |
| `registers` | Every identifier North Data holds: source, ID and whether it is a former one (*details*) |
| `lei`, `euid` | Legal Entity Identifier and European Unique Identifier (*details*) |
| `stockSymbols` | Stock exchange symbols of listed companies (*details*) |
| `formerNames`, `formerAddresses` | Former and alternative names, former registered offices |
| `foundingDate` | Date the company was founded (*details*) |
| `corporatePurpose` | Purpose of the company as stated in the register (*details*) |
| `industry` | Industry segment North Data files the company under (*details*) |
| `revenue`, `earnings`, `equity`, `totalAssets`, `employees` | The latest published figures as numbers (*details*) |
| `currency` | Currency of those figures, e.g. EUR |
| `latestFinancialYear` | Most recent year among the figures |
| `financials` | Every yearly series with its source publication (*details*) |
| `officers` | Managing directors and other officers with their role (*details*) |
| `events` | Latest publications and register events, newest first (*details*, when asked for) |
| `scrapedAt` | When the company was scraped (UTC) |

#### Example result

```json
{
  "url": "https://www.northdata.com/Aumann%20AG,%20Beelen/Amtsgericht%20M%C3%BCnster%20HRB%2016399",
  "name": "Aumann AG",
  "status": "active",
  "legalForm": "AG",
  "country": "Germany",
  "countryCode": "DE",
  "city": "Beelen",
  "street": "Dieselstr. 6",
  "postalCode": "48361",
  "registerCourt": "District Court of Münster",
  "registerNumber": "HRB 16399",
  "lei": "529900GLI93PGU71F690",
  "euid": "DER2713.HRB16399",
  "stockSymbols": ["AAG.DE", "AUUMF"],
  "foundingDate": "2012-01-31",
  "revenue": 203985000,
  "earnings": 15669000,
  "totalAssets": 292980000,
  "currency": "EUR",
  "latestFinancialYear": 2025,
  "officers": [{"name": "Sebastian Roll", "role": "CEO"}]
}
```

### How to use it

1. Type one or more **company names or keywords** (for example `Siemens` or `bakery Hamburg`), or paste North Data **company URLs**.
2. Optionally keep **only some countries** or **only active companies**.
3. Set **Maximum companies** and press Start. Download the result as Excel, CSV, JSON or XML, or read it through the API.

#### Input options

| Input | What it does |
|---|---|
| `searchQueries` | One search per entry. Each search returns up to 45 companies, the most North Data shows for one search |
| `startUrls` | North Data company pages (always scraped in full) or search pages |
| `countries` | Keep only companies from these countries (name or two-letter code) |
| `onlyActive` | Skip terminated, dissolved and liquidated companies |
| `includeDetails` | Open each company page for the full record. Off gives a fast, cheaper run |
| `includeFinancials` | Include the yearly figures (revenue, earnings, equity, total assets, employees) |
| `includeOfficers` | Include officers with their roles |
| `includeEvents` | Include the latest register events and publications |
| `onlyNew` | Skip companies that earlier runs of this same search already returned |
| `maxItems` | Stop after this many companies |
| `maxConcurrency` | Pages loaded at the same time, each through an address of its own (default 16; at most 4 without Apify Proxy) |
| `proxyConfiguration` | Apify Proxy settings. On by default (residential addresses): every page goes out through its own address, about 5 times faster. Off = one address, about 10 pages a minute |

#### Fast mode vs. full details

With **Open each company for full details** off, the scraper reads only North Data's search list: name, city, country, register number, status and former names, 15 companies per page. With it on (the default) it also opens every company page for the register IDs, address, founding date, purpose, officers, yearly figures and events.

### How much does it cost?

You pay per company returned, nothing else. The first Apify plan includes free monthly credit to try it.

| Plan | Price per 1,000 companies |
|---|---|
| Free | $4.00 |
| Bronze | $3.60 |
| Silver | $3.20 |
| Gold | $2.80 |

A run of 100 companies with full details takes about 2 minutes. With Apify Proxy switched off it takes about 10 minutes, because North Data lets one address load only about 10 pages a minute. A run without details (fast mode) reads 15 companies per page and finishes 100 companies in under a minute.

### Use it via API, on a schedule, or with your tools

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("pshivam/northdata-scraper").call(run_input={
    "searchQueries": ["Siemens", "Aumann AG"],
    "countries": ["Germany"],
    "onlyActive": True,
    "maxItems": 50,
})
for company in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(company["name"], company["registerNumber"], company["revenue"])
```

Schedule it in the Apify Console (Schedules) and turn on **Only new companies** to receive only the companies you have not had yet. Connect the result to Google Sheets, Make, Zapier, n8n or Clay with Apify's integrations.

### Good to know

- **45 companies per search.** North Data lists at most 45 results for one search. Use more specific queries (a branch, a city, a legal form) or paste company URLs to reach further.
- **Yearly figures depend on the company.** North Data shows revenue, earnings and total assets for free for many companies (for example listed companies and companies that file annual reports); for others it shows nothing. Then those fields are empty. The scraper never reads Premium-only data.
- **Officers are the ones North Data lists publicly** on a company page.
- **Status** is North Data's own marker: no marker means active.
- **Real browser, many addresses.** The scraper opens every page in a real browser (Chromium) and loads only the page itself. North Data limits how many requests it accepts from one address: about 18 pages at once, then about 10 a minute. So the scraper uses Apify Proxy (on by default): 16 pages at once, each through an address of its own, at 2 pages a second. That is 7.5 pages a minute for each address, under the limit. An address that North Data refuses is replaced at once.
- **One address (Apify Proxy off).** The scraper then keeps to the limit itself: its first 15 pages go quickly, then one page every 6.5 seconds, which is about 10 minutes per 100 companies. If North Data still answers "Too many requests", the scraper pauses all requests for 45 seconds or longer, slows down, and carries on.
- **A bare name can come back as one company.** For a name without a legal form (for example `Müller`) North Data sometimes answers with the page of one company instead of the list of matches. The scraper then asks again, up to 3 times, until it gets the list. A name with a legal form (`Müller GmbH`) or a city is taken as the one company it points to.
- **Big runs can stop early, and say so.** If North Data stays silent for ten minutes, or Apify's run time limit is near, the run stops and its status message says so. You keep every company already returned. Turn on **Only new companies** and run the same search again later to get the rest. A run in which North Data refused every request ends as failed, so you are never charged for nothing.

### FAQ

#### How many companies are on North Data?

North Data covers the registers of about 26 countries. A single search lists up to 45 companies, so use specific names or company URLs for more.

#### Does it work for companies outside Germany?

Yes. Search results include companies from the UK, France, the Netherlands, Belgium, Switzerland, Austria, Spain, Poland and others. Which fields are filled depends on what each national register publishes.

#### Where do the yearly figures come from?

From the "Financial performance" charts on a company's North Data page, which cite the publication behind each figure (annual report, stock exchange data and others). The `financials` field keeps that source for every value.

#### Can I get the revenue of every company?

Only where North Data shows it. Many small companies publish no figures. Those rows have empty revenue fields.

#### Is it legal to scrape North Data?

The scraper reads publicly visible pages at a low rate and does not log in. Company register data is public in the EU. You are responsible for using the data lawfully, for example under the GDPR when you store the names of officers.

#### How do I get only new companies every day?

Turn on **Only new companies** and schedule the Actor. It remembers what it returned in your key-value store.

# Actor input Schema

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

One entry per search, e.g. "Siemens", "Aumann AG" or "bakery Hamburg". Each search returns up to 45 companies (the most North Data shows for one search). Add a legal form or a city to narrow it down. Leave empty if you paste company URLs below.

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

North Data company pages (https://www.northdata.com/Siemens AG, München/HRB 6684) or search pages (https://www.northdata.com/siemens). A company page is always scraped in full.

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

Keep only companies from these countries. Pick from the list or type a name or a two-letter code (DE, GB). Leave empty for every country.

## `onlyActive` (type: `boolean`):

Skip companies that are terminated, dissolved or in liquidation.

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

On: register IDs, address, founding date, purpose, officers, yearly figures and events. Off: a much faster, cheaper run with what the search list shows (name, city, country, register number, status).

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

Revenue, earnings, equity, total assets and employees per year, where North Data shows them. Turn off for a smaller result.

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

Managing directors and other officers with their role, as listed on the company's North Data page. Large companies have over a hundred.

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

The company's latest publications and register events (annual reports, role changes, capital changes), newest first, up to 50.

## `onlyNew` (type: `boolean`):

Skip companies that earlier runs of this same search already returned, so you never get or pay for the same company twice. Turn it on for a scheduled run or a saved task. The first run works as usual and remembers what it returned, in your key-value store 'northdata-scraper-only-new'.

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

Stop after this many companies. You are charged per company.

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

North Data accepts only about 10 pages a minute from one address. With Apify Proxy (on by default) every page goes out through an address of its own, so 100 companies take about 2 minutes. Switch it off to run from one address: about 10 minutes per 100 companies.

## `maxConcurrency` (type: `integer`):

Pages loaded at the same time. With Apify Proxy each of them goes out through an address of its own (about 85 MB of memory each): 16 addresses at 2 pages a second stay under North Data's limit of about 10 pages a minute for one address. Without a proxy that limit rules and at most 4 are used.

## Actor input object example

```json
{
  "searchQueries": [
    "Siemens"
  ],
  "onlyActive": false,
  "includeDetails": true,
  "includeFinancials": true,
  "includeOfficers": true,
  "includeEvents": false,
  "onlyNew": false,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "maxConcurrency": 16
}
```

# Actor output Schema

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

One row per company, shown with the overview view.

## `financials` (type: `string`):

Latest revenue, earnings, equity, total assets and employees as numbers for sorting and filtering.

## `runStats` (type: `string`):

Requests made, time spent and number of companies for this run (RUN_STATS record).

# 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": [
        "Siemens"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

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

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

```

## MCP server setup

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