# North Data Company & Register Extractor (`xtracto/northdata-companies-scraper`) Actor

Extract German/EU public-register (Handelsregister) data from northdata.com: company name, register number & court, address, officers, founding date, LEI, industry, and the full register/financial event feed with insolvency & liquidation events flagged. URL or company-name search.

- **URL**: https://apify.com/xtracto/northdata-companies-scraper.md
- **Developed by:** [Farhan Febrian Nauval](https://apify.com/xtracto) (community)
- **Categories:** Lead generation, Jobs, Integrations
- **Features:** Limited permissions
- **Stats:** 23 total users, 6 monthly users, 99.6% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 Company & Register Scraper

Extract German / EU **public commercial-register** data from [northdata.com](https://www.northdata.com): official company name, register number and court, registered address, officers, founding date, LEI, industry, and the full public-record event history — including publicly listed insolvency and liquidation events. Clean public-register data for KYC, B2B due diligence, and lead research.

This actor reads **public-record data only** — company-register entries exactly as they are published. See the note at the bottom.

### Why use this actor

- **No account, no login, no API key** — paste a company link or a company name and run.
- **Official register data**: legal name, register number and registering court, registered address, founding date, LEI code, business purpose, and industry.
- **People on the record**: the officers (managing directors, board members) as listed in the public register.
- **Full event history**: every published register and financial event over the company's life — capital changes, mergers, role changes, annual reports — with **insolvency and liquidation events flagged** for quick risk screening.
- **Two ways to work**: paste company-page links directly, or search by company name and let the actor find the matching companies.
- **Clean, structured output**, automatic retries, runs on a schedule, exports to JSON / CSV / Excel. No scrapers or browsers to babysit.

### How it works

1. Pick a **mode**: paste company-page links (*url*), or search by company name (*search*).
2. In search mode, the actor looks up each name and picks the top matching companies.
3. For each company it reads the public register page and pulls the official details, the officers, and the full event history.
4. Each company becomes one row in your dataset, with insolvency / liquidation events flagged.

You never manage scrapers, browsers, or blocks — just provide companies and read the results.

### Input

**Mode: Company URLs**

```json
{
  "mode": "url",
  "startUrls": [
    "https://www.northdata.com/Google+Germany+GmbH,+Hamburg/HRB+86891"
  ],
  "maxItems": 100,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "DE"
  }
}
```

**Mode: Company-name search**

```json
{
  "mode": "search",
  "queries": ["Wirecard AG"],
  "countries": "DE",
  "maxResultsPerQuery": 5,
  "maxItems": 100,
  "maxConcurrency": 3
}
```

| Field | Mode | Type | Description |
|-------|------|------|-------------|
| `mode` | — | string | `url` (paste company links) or `search` (search by name). Default `url`. |
| `startUrls` | url | array of strings | North Data company-page links, e.g. `https://www.northdata.com/Google+Germany+GmbH,+Hamburg/HRB+86891`. |
| `queries` | search | array of strings | Company-name searches, e.g. `Wirecard AG`. |
| `countries` | search | string | Optional country codes to focus the search (`DE`, or `DE AT CH`). Blank = all countries. |
| `maxResultsPerQuery` | search | integer | How many top matches to scrape per search (default 5). |
| `maxItems` | — | integer | Overall cap on rows. `0` = no cap. |
| `maxConcurrency` | — | integer | How many companies to process in parallel. Default 3. |
| `proxyConfiguration` | — | object | German residential proxy support, set by default. |

### Output

One row per company (real sample, Google Germany GmbH — event list truncated):

```json
{
  "_input": "https://www.northdata.com/Google+Germany+GmbH,+Hamburg/HRB+86891",
  "_source": "S1-ldjson",
  "_scrapedAt": "2026-07-09T11:09:46Z",
  "url": "https://www.northdata.com/Google+Germany+GmbH,+Hamburg/HRB+86891",
  "name": "Google Germany GmbH",
  "headerLine": "Google Germany GmbH, Hamburg, Germany",
  "isDefunct": false,
  "statusFlags": null,
  "registerType": "HRB",
  "registerNumber": "86891",
  "register": "HRB 86891",
  "court": "District Court of Hamburg",
  "courtEnglish": "District Court of Hamburg",
  "foundingDate": "2001-04-06",
  "leiCode": "529900H4SBHKV7XQXK22",
  "purpose": "arranging the sale of online advertising and other products and services; in addition, all commercial, industrial or financial transactions relating to movable or immovable property that directly or indirectly serve the foregoing purpose.",
  "industry": "Computing infrastructure, data processing, hosting and related activities",
  "address": {
    "streetAddress": "ABC-Str. 19",
    "postalCode": "20354",
    "city": "Hamburg",
    "region": null,
    "country": "DE"
  },
  "officers": [
    { "name": "Manicle, Paul Terrence", "givenName": "Paul Terrence", "familyName": "Manicle", "role": "Managing Director", "url": "https://www.northdata.com/Manicle,%20Paul%20Terrence,%20Baudour/zxd" },
    { "name": "Sebastian, Liana Yvonne", "givenName": "Liana Yvonne", "familyName": "Sebastian", "role": "Managing Director", "url": "https://www.northdata.com/Sebastian,%20Liana%20Yvonne,%20Cupertino/15da" }
  ],
  "officerCount": 4,
  "events": [
    { "date": "2025-11-10", "source": "Eb", "topicTypes": ["AnnualFinancialReport", "Balance", "Earnings", "Relation"], "summary": "Annual report for the year ending 31/12/2024 · Balance sheet for 31/12/2024 · Earnings statement for 31/12/2024 …", "detailUrl": "/?id=5111838758666240", "isInsolvencyRelated": false },
    { "date": "2003-04-01", "source": "Hrcdd", "topicTypes": ["Entry", "Role", "Relation", "Capital", "Headquarters", "LegalForm", "Name"], "summary": "Registration · MD (1) · Capital: €25,000 · Seat: Hamburg · Legal form: GmbH · Name: Google Germany GmbH …", "detailUrl": "/?id=4736277570650112", "isInsolvencyRelated": false }
  ],
  "eventCount": 61,
  "insolvencyEvents": [],
  "hasInsolvencyEvents": false,
  "pageTitle": "Google Germany GmbH, Hamburg, Germany, District Court of Hamburg HRB 86891: Network, Financial information"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `name` | string | Official company name. |
| `headerLine` | string | Name, city, and country as shown on the page. |
| `isDefunct` / `statusFlags` | boolean / array | Whether the company is closed / liquidated, and any status markers. |
| `registerType` / `registerNumber` / `register` | string | Register category, number, and the combined register string. |
| `court` / `courtEnglish` | string | Registering court (native and English). |
| `foundingDate` | string | Founding date (ISO). |
| `leiCode` | string | Legal Entity Identifier, when present. |
| `purpose` | string | Stated business purpose. |
| `industry` | string | Industry / activity classification. |
| `address` | object | Registered address (street, postal code, city, region, country). |
| `officers` | array | People on the register: name, given/family name, role, and their North Data link. |
| `officerCount` | integer | Number of officers listed. |
| `events` | array | Full published event history: date, source, topics, summary, detail link, and an insolvency flag. |
| `eventCount` | integer | Number of events. |
| `insolvencyEvents` | array | The subset of events flagged as insolvency / liquidation related. |
| `hasInsolvencyEvents` | boolean | Quick risk signal — whether any insolvency / liquidation event exists. |
| `pageTitle` | string | The page title (name, city, court, register number). |

In search mode each company row also carries a `searchMatchTitle` field with the matched name as shown in search. On failure the actor writes a row with `_error` and `_errorDetail` rather than silently skipping.

### Notes & limits

- **German residential proxy support** is set by default and recommended for volume.
- The public page exposes the **public-register events themselves** (registrations, capital changes, mergers, role changes, liquidations, financial publications). Full-text insolvency-register announcements are a separate paid North Data feature and are **not** included; this actor flags the insolvency / liquidation events that appear in the public event feed.
- Officers and event history vary in length by company; large companies can have dozens of events.

### Legality note

This actor collects **public commercial-register data** (Handelsregister and equivalent EU registers) exactly **as published** on northdata.com. Officers appear because they are recorded in the public register, and are passed through with no enrichment beyond the page. This is legitimate public-record / KYC / B2B due-diligence data, not private-data harvesting. Respect North Data's terms and applicable data-protection law for your use case.

# Actor input Schema

## `mode` (type: `string`):

How to provide inputs. 'url' = paste northdata.com company-page URLs. 'search' = provide company-name queries that are resolved to company pages via North Data's search endpoint, then scraped.

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

Used when mode = 'url'. Paste northdata.com company-page URLs, e.g. https://www.northdata.com/Google+Germany+GmbH,+Hamburg/HRB+86891 . Each yields one full record.

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

Used when mode = 'search'. Company-name strings, e.g. 'Wirecard AG'. Each query is resolved via https://www.northdata.com/suggest.json and the matched company pages are scraped.

## `countries` (type: `string`):

Optional ISO-3166 country codes to focus the search, space- or comma-separated (e.g. 'DE' or 'DE AT CH'). Leave blank for all countries.

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

How many of the top search matches to scrape for each query.

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

Overall cap on records pushed for the whole run. 0 = no limit.

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

How many URLs / queries to process in parallel. Keep low to stay gentle on the site.

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

Datacenter proxy worked in recon (no WAF), but German residential is safer for volume. Default is residential (DE).

## Actor input object example

```json
{
  "mode": "url",
  "startUrls": [
    "https://www.northdata.com/Google+Germany+GmbH,+Hamburg/HRB+86891"
  ],
  "queries": [
    "Wirecard AG"
  ],
  "countries": "DE",
  "maxResultsPerQuery": 5,
  "maxItems": 100,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}
```

# Actor output Schema

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

North Data companies - one row per scraped record, stored in the run's 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 = {
    "startUrls": [
        "https://www.northdata.com/Google+Germany+GmbH,+Hamburg/HRB+86891"
    ],
    "queries": [
        "Wirecard AG"
    ],
    "countries": "DE"
};

// Run the Actor and wait for it to finish
const run = await client.actor("xtracto/northdata-companies-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 = {
    "startUrls": ["https://www.northdata.com/Google+Germany+GmbH,+Hamburg/HRB+86891"],
    "queries": ["Wirecard AG"],
    "countries": "DE",
}

# Run the Actor and wait for it to finish
run = client.actor("xtracto/northdata-companies-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 '{
  "startUrls": [
    "https://www.northdata.com/Google+Germany+GmbH,+Hamburg/HRB+86891"
  ],
  "queries": [
    "Wirecard AG"
  ],
  "countries": "DE"
}' |
apify call xtracto/northdata-companies-scraper --silent --output-dataset

```

## MCP server setup

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