# Company Financials and Ownership Data API - Global (`nabeelbaghoor/company-ownership-financials-api`) Actor

Query a global company reference database by name, country, industry code, legal form, listing status, LEI, ISIN or entity ID. Returns firmographics, financial statements, shareholders, beneficial owners, ESG scores and sanctions flags as flat rows. Pay per result. Bring your own API key.

- **URL**: https://apify.com/nabeelbaghoor/company-ownership-financials-api.md
- **Developed by:** [Nabeel Hassan](https://apify.com/nabeelbaghoor) (community)
- **Categories:** Business, Developer tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$20.00 / 1,000 results

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

## Company Financials and Ownership Data API - Global

Query a global company reference database and pull the matches as flat rows: registered identity, address and industry codes, financial statement figures, the ownership chain from shareholders up to the global ultimate owner, beneficial owners, ESG scores and sanctions, watchlist, PEP and adverse media flags.

### What this actor does

- **Finds companies the way a reference database expects.** By registered name including former and also-known-as names, by country, region, NUTS area, city or street, by NACE, NAICS or US SIC industry classification, by legal form, entity type, status and listing status, or directly by entity ID, LEI, ISIN or ticker.
- **Resolves a domain list to registered entities** with a single filter matched across the website, domain and email fields.
- **Requests the fields you actually need** through six presets: identity, firmographics, financials, ownership, risk and ESG. Add any further field by name, or replace the list entirely with a raw field document for year-indexed financials.
- **Tells you what your own subscription supports.** Turn on `dumpFields` and the run fetches the provider's own filter and field dictionaries and writes them to the key-value store, collecting nothing and charging nothing. That beats guessing a field name and getting an opaque HTTP 400.
- **Stops the moment paging stalls.** An offset that is not honoured returns the same records again, so the run halts rather than re-collecting and re-charging for companies it already has.
- **Keeps the untouched API record** under `raw` alongside the flat promoted columns.

### Input

| Field | What it does |
| --- | --- |
| `companyName`, `includeBranches`, `includePreviousNames` | Name search, optionally widened to branches and former names. |
| `bvdIds`, `orbisIds`, `recordIds`, `leis`, `isins`, `tickers` | Direct lookups by identifier. |
| `countryRegions`, `cities`, `streetAddress`, `nutsCodes` | Geographic narrowing. |
| `status`, `listingStatus`, `standardisedLegalForms`, `entityTypeIds` | Legal and market classification. |
| `nace2`, `nace2CodeType`, `naics2017`, `usSic` | Industry classification, with control over which assignment NACE matches. |
| `websiteDomainEmail`, `phones` | Match a domain or contact list to registered entities. |
| `fieldPreset`, `extraFields`, `preferences` | Which fields to request, and which accounting statements to read them from. |
| `advancedWhere`, `advancedSelect` | Raw filter and field documents for boolean trees, financial screens and year-indexed figures. |
| `entity` | Companies, contacts or news, subject to your subscription. |
| `dumpFields` | List your subscription's own filters and fields instead of collecting records. |
| `useBearerToken` | Send the credential as a bearer header for OAuth or JWT accounts. |
| `pageSize`, `maxResults` | Page size and the hard cap on spend. |
| `apiKey` | Your own API token, sent in the `ApiToken` header. Stored as a secret. |

### Example output

```json
{
  "recordType": "company",
  "matched": true,
  "bvdId": "BE0435604729",
  "orbisId": "008326720",
  "name": "MELEXIS NV",
  "status": "Active",
  "legalForm": "Public limited company",
  "country": "Belgium",
  "countryCode": "BE",
  "city": "IEPER",
  "postcode": "8900",
  "addressLine1": "ROZENDAALSTRAAT 12",
  "website": "www.melexis.com",
  "phone": "+32 57 300 800",
  "vatNumber": "BE0435604729",
  "lei": "5493006W3QUS5LMH6R84",
  "nace2Code": "2611",
  "nace2Label": "Manufacture of electronic components",
  "employees": 2087,
  "operatingRevenue": 962400000,
  "profitBeforeTax": 187300000,
  "totalAssets": 812500000,
  "currency": "EUR",
  "closingDate": "2024-12-31",
  "guoName": "XTRION NV",
  "guoBvdId": "BE0475721554",
  "raw": { }
}
```

### Frequently asked questions

#### What data does this company data API return?

Depending on the field preset: registered name, entity ID, Orbis ID, status, legal form, VAT number, LEI, ISIN and trade register number; full address with country, region, city, postcode and coordinates; website, domain, email and phone; NACE, NAICS and US SIC industry codes with labels and a trade description; operating revenue, profit before tax, profit and loss, cash flow, total assets, shareholders' funds, headcount, currency, closing date and consolidation code; the global ultimate owner, shareholder list with direct percentages and beneficial owner list; environmental, social, governance and global ESG scores; and sanctions, watchlist, PEP, adverse media and legal event flags.

#### Do I need my own API key?

Yes. This actor does not include data access. You use your own API token for the Orbis API from Moody's, which is the provider whose API this actor calls; tokens are issued by their customer support rather than self-serve. Your own subscription, entitlement and terms apply. Paste the token into the `apiKey` field, where it is stored as an Apify secret and sent in the `ApiToken` request header rather than as a URL parameter, so it never appears in a log line or a redirect. If your account was provisioned with OAuth or JWT rather than a static token, turn on `useBearerToken`.

#### How do I find out which fields my subscription includes?

Run the actor once with `dumpFields` turned on. It fetches the provider's own filter and field dictionaries for the selected entity and writes them to the key-value store as `COMPANIES_METADATA_WHERE` and `COMPANIES_METADATA_SELECT`. No records are collected and nothing is charged. Those dictionaries are the authority on what your plan accepts.

#### How do I pull financial statements for specific years?

Use `advancedSelect` with a year-indexed field object, which is what the provider's own examples do. For example `["NAME", {"OPRE": {"IndexOrYear": "2023", "Currency": "USD", "Unit": 3}}]` returns operating revenue for the 2023 statement in thousands of US dollars. Set `preferences` to `AnnualReport` or `AllStatement` to control which statements those figures are read from.

#### Can I screen for sanctioned or high-risk entities?

Yes. Choose the `risk` field preset, which requests the sanctions, watchlist, PEP and adverse media match indicators, the OFAC and EU consolidated list flags, and legal event details. Combine it with a country or industry filter to screen a defined population rather than the whole database.

#### How do I find the owners of a company?

Choose the `ownership` preset and pass the company's entity ID in `bvdIds`. The row then carries the global ultimate owner's name and ID, the shareholder list with each holder's ID, country, entity type and direct percentage, and the beneficial owner list with names, countries and birthdates.

#### How do I write a filter this form does not offer?

Use `advancedWhere` with a raw JSON filter document. It accepts the provider's boolean operators, so `{"AND": [{"Status": "Active"}, {"NOT": [{"CountryRegion": {"Text": "Russia"}}]}]}` works, as do financial screens and update windows. A raw array is appended to the form criteria; a boolean object is combined with them.

#### How much does a run cost?

Pricing is pay per result: you are charged for each company record returned to the dataset, and duplicates are not charged. Dictionary dump runs collect nothing and are not charged at all. Apify platform usage is included in the per-result price. Your own provider entitlement is separate and billed by them.

### Keyword map

company data API, company financials API, ownership data API, beneficial ownership API, shareholder data API, global ultimate owner lookup, company reference data, LEI lookup, ISIN company lookup, NACE code search, KYC company screening API, sanctions screening data, PEP watchlist flags, ESG score API, private company financials, corporate structure API, entity resolution by domain

# Actor input Schema

## `companyName` (type: `string`):

Company name to search for, for example Melexis N.V.

## `includeBranches` (type: `boolean`):

Also match branch entities of the named company, not only the registered head entity.

## `includePreviousNames` (type: `boolean`):

Also match the company's previous names and its also-known-as names. Useful when your list predates a rebrand.

## `bvdIds` (type: `array`):

Provider entity IDs to fetch directly, one per line, for example BE0435604729. This is the fastest and cheapest way to re-pull companies you already identified.

## `orbisIds` (type: `array`):

Provider Orbis IDs, one per line.

## `recordIds` (type: `array`):

Full record IDs including the account type suffix, one per line, for example NL34179503\_C.

## `leis` (type: `array`):

Twenty character LEI codes, one per line.

## `isins` (type: `array`):

International Securities Identification Numbers, one per line.

## `tickers` (type: `array`):

Listed ticker symbols, one per line.

## `countryRegions` (type: `array`):

Country, world region or country region names, one per line, for example Denmark or Brussels. The provider resolves the name against its own geography list.

## `cities` (type: `array`):

City names, one per line.

## `streetAddress` (type: `string`):

A street address to match, for example AVENUE LOUISE 250.

## `nutsCodes` (type: `array`):

European statistical region codes or labels, one per line, for example BE310 - Nivelles.

## `status` (type: `string`):

Restrict to companies with this status. Active is the usual choice for a prospecting or supplier list.

## `listingStatus` (type: `string`):

Restrict to publicly listed, delisted or unlisted companies.

## `standardisedLegalForms` (type: `array`):

Standardised legal form codes, one per line, for example 050. Run once with Dump available fields to list the codes your subscription accepts.

## `entityTypeIds` (type: `array`):

Entity type IDs, one per line, for example 040.

## `nace2` (type: `array`):

European industry classification codes or their labels, one per line, for example 62.01 or Computer programming activities.

## `nace2CodeType` (type: `string`):

Which NACE assignment the filter should match: the core code only, the primary code, the secondary codes, or all of them.

## `naics2017` (type: `array`):

North American industry classification codes or labels, one per line.

## `usSic` (type: `array`):

US SIC industry codes or labels, one per line.

## `websiteDomainEmail` (type: `array`):

Values matched across the company's website, domain and email fields, one per line. This is how you resolve a domain list to registered entities.

## `phones` (type: `array`):

Phone numbers to match, one per line.

## `fieldPreset` (type: `string`):

Which set of fields to request. Each preset is a field list drawn from the provider's own published examples. Add more with the extra fields box below.

## `extraFields` (type: `array`):

Additional field names to add to the preset, one per line, for example GUO\_NAME. Your subscription's own dictionary is the authority on which exist: turn on Dump available fields to list them.

## `preferences` (type: `array`):

Values passed as GLOBALS.Preferences, one per line, for example AnnualReport or AllStatement. These control which accounting statements financial fields are read from.

## `advancedWhere` (type: `string`):

A raw WHERE document as JSON, for use when you need boolean trees, financial screens, update windows or a filter this form does not list. An array is appended to the criteria above; an object using AND, OR or NOT is combined with them. Example: {"AND":\[{"Status":"Active"},{"NOT":\[{"CountryRegion":{"Text":"Russia"}}]}]}

## `advancedSelect` (type: `string`):

A raw SELECT list as a JSON array, which replaces the preset entirely. Use this for nested field objects such as year-indexed financials. Example: \["NAME",{"OPRE":{"IndexOrYear":"2023","Currency":"USD"}}]

## `entity` (type: `string`):

Which entity endpoint to query. Companies is the default; the others need a subscription that includes them.

## `dumpFields` (type: `boolean`):

Instead of collecting records, fetch the provider's own filter and field dictionaries for the selected entity and write them to the key-value store. Nothing is collected and nothing is charged. Run this once first if you are unsure which fields your subscription carries.

## `useBearerToken` (type: `boolean`):

Send the credential as an Authorization bearer header instead of the ApiToken header. Turn this on if your account was set up with OAuth or JWT rather than a static API token.

## `pageSize` (type: `integer`):

Records per request. Large field lists make large responses, so lower this if requests time out.

## `maxResults` (type: `integer`):

Stop after this many companies. This is the cap on both spend and run time.

## `apiKey` (type: `string`):

Your own company reference data API token, sent in the ApiToken header. The actor never ships a token of its own: your subscription, entitlement and terms apply.

## Actor input object example

```json
{
  "includeBranches": false,
  "includePreviousNames": false,
  "nace2CodeType": "All",
  "fieldPreset": "firmographics",
  "entity": "Companies",
  "dumpFields": false,
  "useBearerToken": false,
  "pageSize": 50,
  "maxResults": 100
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/company-ownership-financials-api").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/company-ownership-financials-api").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 '{}' |
apify call nabeelbaghoor/company-ownership-financials-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nabeelbaghoor/company-ownership-financials-api"
        }
    }
}

```

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/AakNoMOgdIuB5cQbx/builds/JhJx8acJhGINVGDd6/openapi.json
