# North Data Company, Officers & Financials Scraper (`automation-lab/northdata-company-officers-financials`) Actor

Search North Data and export European company registry identity, public officer changes, ownership and relationship context, timelines, and available capital, revenue, employee, and financial-filing fields.

- **URL**: https://apify.com/automation-lab/northdata-company-officers-financials.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 1,000 item extracteds

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?

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 Company, Officers & Financials Scraper

Search North Data and export source-linked European company profiles for corporate due diligence, KYB enrichment, and recurring company research. The Actor turns company names, registry numbers, or direct North Data URLs into structured JSON/CSV records with registry identity, public officer changes, ownership and relationship context, timeline events, and available capital, revenue, employee, and financial-filing fields.

The Actor uses anonymous public pages on `northdata.com`. It does not require a North Data account and does not bypass Premium-only representative names or ownership graphs.

### What does this North Data scraper extract?

Each result is one company profile in the default Apify dataset. Search results are opened automatically so the output contains profile details rather than shallow search cards.

The Actor extracts:

- company name and canonical North Data profile URL;
- register court or authority and register number;
- North Data ID, EUID, LEI, and other public identifiers when available;
- city, country, public address, previous names, and corporate purpose;
- public current legal-representative counts by role;
- dated officer, director, executive-board, and signatory change events;
- public ownership-count context and relationship events;
- mergers, shareholdings, parent, partner, control, and profit-transfer context when published;
- latest public capital, revenue, employee, and financial-report context when exposed;
- a source-linked event timeline, newest first;
- UTC extraction timestamp.

Optional fields are omitted when North Data does not publish them for a company.

### Who is it for?

**Corporate due diligence teams** can assemble repeatable source-linked company evidence before deeper manual review.

**KYB and compliance operations** can enrich a company list with registry identity, officer-change context, and relationship signals.

**M\&A and market-research analysts** can review corporate-purpose text, capital events, known shareholding context, and dated structural changes.

**Sales and data teams** can turn company-name lists into normalized European registry records for internal enrichment.

**Developers and AI agents** can consume stable JSON instead of parsing changing profile markup in every workflow.

This Actor is not a substitute for an official certified registry extract, legal advice, or North Data Premium.

### Why use this Actor?

1. **Search and direct URLs** — start with company names, registry numbers, profile URLs, or North Data search URLs.
2. **Profile enrichment by default** — every accepted search match is opened and normalized.
3. **Due-diligence context** — officer changes, relationships, financial context, and timeline evidence stay attached to the company record.
4. **Source attribution** — events include dates, North Data source codes, event URLs, and related-company URLs when published.
5. **Public-surface boundary** — Premium-only fields are not guessed or mislabeled as public data.
6. **Low-overhead HTTP extraction** — no browser or automatic residential proxy mode is enabled.
7. **Apify-native output** — export as JSON, JSONL, CSV, Excel, XML, or RSS and connect runs to schedules and integrations.

### Input parameters

| Field | Type | Default | Description |
| --- | --- | ---: | --- |
| `queries` | string array | optional | Company names, registry numbers, or other North Data search phrases. |
| `startUrls` | URL array | optional | Direct `northdata.com` profile or search URLs. Other hosts are rejected. |
| `maxItems` | integer | `25` | Maximum distinct company records across all inputs; range 1–500. |
| `maxEventsPerCompany` | integer | `25` | Maximum timeline, officer-change, and relationship events retained per company; range 0–200. |
| `requestDelayMillis` | integer | `200` | Delay between profile requests; range 0–5,000 ms. |

Provide at least one non-empty query or North Data URL. You can combine both input routes in one run. Duplicate profile URLs are emitted once.

### Get started in 4 steps

1. Open the Actor input page in Apify Console.
2. Enter one or more company names under **Company searches**, or add direct North Data URLs.
3. Choose a company and event limit. Start with a small run while evaluating output.
4. Click **Start** and open the **Company profiles** or **Officers and relationships** dataset view.

Example search input:

```json
{
  "queries": ["Siemens AG", "Zalando SE"],
  "maxItems": 4,
  "maxEventsPerCompany": 50,
  "requestDelayMillis": 250
}
```

Example direct-profile input:

```json
{
  "startUrls": [
    { "url": "https://www.northdata.com/Siemens%20AG,%20M%C3%BCnchen/HRB%206684" }
  ],
  "maxItems": 1,
  "maxEventsPerCompany": 75
}
```

### Output fields

| Field | Meaning |
| --- | --- |
| `query` | Search phrase that discovered the company; absent for direct URLs. |
| `name` | Public company name. |
| `profileUrl`, `sourceUrl` | Canonical/final North Data profile source. |
| `northDataId` | Stable page identifier when exposed. |
| `city`, `country`, `address` | Public location fields. |
| `registerCourt`, `registerNumber` | Registry identity parsed from public identifiers. |
| `identifiers`, `lei`, `euid` | Available register and entity identifiers. |
| `previousNames` | Prior names shown in the profile identity section. |
| `corporatePurpose` | Published corporate-purpose text. |
| `currentOfficerCounts` | Current representative counts by public role; not hidden names. |
| `officerChanges` | Dated public role-change summaries, parsed names/roles, and event sources. |
| `ownershipSummary` | Public active-shareholding count or equivalent context. |
| `relationshipEvents` | Shareholding, merger, parent, partner, control, and related events. |
| `financials` | Latest available capital/revenue/employees plus filing dates/topics. |
| `timeline` | Deduplicated public history and publication events. |
| `fetchedAt` | UTC extraction timestamp. |

The default dataset contains one result type: a company record. Nested event arrays remain attached to that company so CSV and JSON exports preserve the due-diligence unit.

### Example company record

This abbreviated example reflects the current output shape. Event arrays are shortened for readability.

```json
{
  "query": "Siemens AG",
  "name": "Siemens AG",
  "profileUrl": "https://www.northdata.com/Siemens%20AG,%20M%C3%BCnchen/HRB%206684",
  "city": "Munich",
  "country": "Germany",
  "address": "Werner-von-Siemens-Str. 1, 80333 München, Germany",
  "registerCourt": "District Court of Munich",
  "registerNumber": "HRB 6684",
  "lei": "W38RGI023J3WT1HWRP32",
  "euid": "DED2601V.HRB6684",
  "currentOfficerCounts": [
    { "count": 1, "role": "CEO" },
    { "count": 5, "role": "Member of the Executive Board" }
  ],
  "ownershipSummary": "39 known active shareholdings",
  "financials": {
    "latestCapital": "€2.35B",
    "latestCapitalDate": "2026-04-24",
    "availableTopics": ["Capital", "AnnualFinancialReport", "Balance", "Earnings"]
  },
  "fetchedAt": "2026-08-25T07:45:00.000Z"
}
```

Dates and values change as the source publishes new records. Always use `fetchedAt` and the event source URL when retaining evidence.

### How much does it cost to extract North Data company records?

The Actor uses pay-per-event pricing: one small `start` event after input validation and one `item` event for each company record produced. Nested officers, relationships, financial context, and timeline events inside a company record have no separate charge.

The one-time start event is **$0.00005**. Active per-company prices are:

| Apify tier | Price per company |
| --- | ---: |
| FREE | $0.0045908 |
| BRONZE | $0.003992 |
| SILVER | $0.0031138 |
| GOLD | $0.0023952 |
| PLATINUM | $0.0015968 |
| DIAMOND | $0.0011178 |

Search misses and failed profile requests do not create `item` charges. Nested events inside a company result are included.

Illustrative BRONZE totals:

| Accepted companies | Total |
| ---: | ---: |
| 1 | $0.004042 |
| 10 | $0.03997 |
| 100 | $0.39925 |

```text
run cost = $0.00005 start + accepted company records × your active item tier
```

Set `maxItems` to a small value when evaluating a new query.

### Search, limits, and event behavior

A company-name query returns the public result cards currently present in North Data SSR HTML. The Actor follows those cards until `maxItems` is reached. It does not claim exhaustive pagination beyond the public result page.

`maxItems` is a global cap across all queries and URLs. `maxEventsPerCompany` independently caps each of the three nested event collections. Setting it to `0` omits those arrays while retaining identity, current role-count summaries, ownership context, and the latest available financial snapshot.

The Actor retries transient HTTP 408, 425, 429, and 5xx responses up to three times with backoff. Deterministic access or input errors fail explicitly instead of returning fabricated records.

### Due diligence and recurring workflows

#### Company-list enrichment

Feed company names from a CRM or spreadsheet, schedule the Actor, and join results back on `query`, `registerNumber`, or `profileUrl`.

#### Officer-change review

Use `officerChanges[].date`, `names`, `roles`, and `eventUrl` to triage public management changes. A change event is historical evidence, not a claim that every named person is currently active.

#### Relationship mapping

Transform `relationshipEvents` into graph edges. Preserve `relationshipType`, `relatedCompany`, `relatedCompanyUrl`, event date, and source before drawing ownership conclusions.

#### Financial filing triage

Use `financials.latestFinancialReportDate` and `availableTopics` to identify companies with public annual-report, balance, or earnings context. Values are included only when they are publicly exposed.

#### Scheduled snapshots

Run the same input on an Apify schedule and compare datasets in your own storage or automation. The Actor emits current source snapshots; it does not maintain an internal change database or send alerts by itself.

### Integrations and exports

Use Apify integrations to send completed datasets to Google Sheets, webhooks, Make, Zapier, Slack, or your own endpoint. Dataset exports support JSON, JSONL, CSV, Excel, XML, and RSS.

Recommended stable keys:

- `profileUrl` for source-level deduplication;
- `registerNumber` plus `registerCourt` for registry matching;
- `euid` or `lei` when present for cross-system entity matching;
- event `date` + `summary` + `source` for event-level comparison.

Because nested arrays are easiest to preserve in JSON, prefer JSON/JSONL for officer and relationship workflows. CSV is convenient for profile-level identity fields.

### Run with the Apify API

Replace `YOUR_APIFY_TOKEN` with a token stored securely outside source control.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~northdata-company-officers-financials/runs?token=YOUR_APIFY_TOKEN&waitForFinish=300" \
  -H "Content-Type: application/json" \
  -d '{"queries":["Siemens AG"],"maxItems":2,"maxEventsPerCompany":25}'
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/northdata-company-officers-financials').call({
  queries: ['Siemens AG', 'Zalando SE'],
  maxItems: 4,
  maxEventsPerCompany: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/northdata-company-officers-financials').call(
    run_input={
        'queries': ['Siemens AG', 'Zalando SE'],
        'maxItems': 4,
        'maxEventsPerCompany': 50,
    }
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use it through MCP and AI agents

#### Claude Code

Add the Actor tool to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/northdata-company-officers-financials"
```

#### Claude Desktop

Add this MCP server in Claude Desktop's MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/northdata-company-officers-financials"
    }
  }
}
```

#### Cursor

In Cursor, open **Settings → Tools & MCP → New MCP Server** and use the same Apify MCP URL shown above.

#### VS Code

In VS Code with MCP support enabled, add an HTTP MCP server named `apify` and set its URL to the same Actor-specific endpoint.

Example prompts using MCP:

- “Search North Data for Siemens AG and return the best two registry profiles.”
- “Extract this North Data URL and summarize public officer changes with source dates.”
- “Research these four European companies and return register IDs, ownership context, and latest available financial filing dates.”

AI-generated conclusions should retain the source URLs and distinguish public role-change history from current representative status.

### Responsible and legal use

North Data aggregates information from public company registers and other sources. You are responsible for ensuring that your collection and use comply with North Data terms, source-register rules, privacy and data-protection law, contractual obligations, and the laws that apply to your organization.

Use company and officer information for legitimate purposes such as compliance, due diligence, research, or authorized enrichment. Apply data minimization, retention limits, access controls, and a lawful basis where personal data is involved. Do not use the Actor for harassment, discriminatory profiling, identity theft, or decisions that legally require verified official records.

For certified or legally authoritative evidence, consult the relevant official register and qualified counsel.

### Limitations

- Anonymous pages may omit fields that North Data reserves for Premium plans.
- Current officer names and full ownership graphs are not bypassed; public counts and public change events are returned instead.
- Revenue and employee values are optional and absent when not exposed in public events.
- Search coverage is limited to result cards returned by the public SSR search page.
- North Data can change HTML, topics, translations, availability, or rate limits.
- A successful no-result search produces no company records and logs a warning.
- The Actor does not download paid dossiers, official documents, or premium exports.
- The Actor does not provide certified registry status, legal conclusions, sanctions screening, monitoring alerts, or an internal historical database.
- No browser, login, or automatic proxy fallback is enabled.

### Troubleshooting

#### No records were returned

Check spelling, include the legal form or city, try a registry number, or provide a direct North Data profile URL. Confirm the same anonymous public search currently returns a company card.

#### The run failed with “Only northdata.com URLs are accepted”

Remove third-party URLs. `startUrls` accepts only `northdata.com` profile or search pages.

#### Some officer names are missing

North Data may expose only representative counts on the anonymous profile. The Actor returns named public officer-change events where available but does not unlock Premium-only lists.

#### Financial fields are absent

The source does not publish the same metrics for every jurisdiction or company. Check `financials.availableTopics` and timeline events for the context that was actually exposed.

#### The source throttled a run

Reduce `maxItems`, increase `requestDelayMillis`, and retry later. The Actor already retries transient responses three times and deliberately avoids an unmeasured automatic proxy fallback.

### Related Automation Lab Actors

- [Companies House UK Company Search Scraper](https://apify.com/automation-lab/companies-house-uk-company-search-scraper) — search the official UK register surface when North Data aggregation is not the right source.
- [Pappers French Company & Officer Scraper](https://apify.com/automation-lab/pappers-french-company-officer-scraper) — extract French company, officer, establishment, account, filing, and legal-document metadata from Pappers.

Choose a source-specific official or national Actor when you need a narrower jurisdiction or first-party register workflow. Use this North Data Actor when one consistent European company research shape is more valuable than a single-register integration.

### FAQ

#### Does the Actor need a North Data account?

No. It uses anonymous public search and profile pages.

#### Can I search by registry number?

Yes. Put the registry number in `queries`, or provide the matching North Data profile URL.

#### Does it return current directors?

It returns public current representative counts by role and public named officer/director change events. It does not claim access to representative names hidden behind North Data Premium.

#### Does it include ownership?

It returns public ownership-count context and public relationship events such as shareholdings, parent relationships, mergers, partners, control, and profit transfers when exposed. It does not unlock the Premium ownership graph.

#### Are capital, revenue, and employees always present?

No. `financials` is source-dependent. The Actor includes only values and filing topics visible in public profile events.

#### Can I run it on a schedule?

Yes. Use Apify schedules and compare datasets downstream. The Actor itself does not store prior snapshots or send change alerts.

#### What counts as one billable item?

One successfully normalized company record pushed to the default dataset. Nested officer, relationship, financial, and timeline fields do not create additional item events.

# Actor input Schema

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

Company names, registry numbers, or other phrases accepted by North Data search. Each match is opened and enriched from its public profile.

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

Direct northdata.com company profile or search-result URLs. Only North Data URLs are accepted.

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

Maximum distinct company records saved across all searches and URLs.

## `maxEventsPerCompany` (type: `integer`):

Maximum public timeline/publication events retained for each company. Use 0 to omit event arrays while keeping profile fields and summaries.

## `requestDelayMillis` (type: `integer`):

Polite delay between company profile requests. Increase this if the source throttles a large run.

## Actor input object example

```json
{
  "queries": [
    "Siemens AG",
    "Zalando SE"
  ],
  "startUrls": [
    {
      "url": "https://www.northdata.com/Siemens%20AG,%20M%C3%BCnchen/HRB%206684"
    }
  ],
  "maxItems": 10,
  "maxEventsPerCompany": 20,
  "requestDelayMillis": 200
}
```

# Actor output Schema

## `overview` (type: `string`):

Company identity, registry, location, ownership, and financial context.

## `dueDiligence` (type: `string`):

Public representative counts, named officer changes, relationship events, and timeline evidence.

# 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",
        "Zalando SE"
    ],
    "startUrls": [
        {
            "url": "https://www.northdata.com/Siemens%20AG,%20M%C3%BCnchen/HRB%206684"
        }
    ],
    "maxItems": 10,
    "maxEventsPerCompany": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/northdata-company-officers-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",
        "Zalando SE",
    ],
    "startUrls": [{ "url": "https://www.northdata.com/Siemens%20AG,%20M%C3%BCnchen/HRB%206684" }],
    "maxItems": 10,
    "maxEventsPerCompany": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/northdata-company-officers-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",
    "Zalando SE"
  ],
  "startUrls": [
    {
      "url": "https://www.northdata.com/Siemens%20AG,%20M%C3%BCnchen/HRB%206684"
    }
  ],
  "maxItems": 10,
  "maxEventsPerCompany": 20
}' |
apify call automation-lab/northdata-company-officers-financials --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/northdata-company-officers-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/Ic9OKOFXRA0rsdCXN/builds/LcKMbhdXIhdbWn2lf/openapi.json
