# UK Company Data API - Financials, Credit Scores, Officers (`nabeelbaghoor/uk-company-financials-api`) Actor

Search United Kingdom registered companies and pull filed financials, credit checks, officers, shareholders, people with significant control, group structure and filing history. Registry-sourced data, pay per result, bring your own API key.

- **URL**: https://apify.com/nabeelbaghoor/uk-company-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

$15.00 / 1,000 company 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

## UK Company Data API - Financials, Credit Scores, Officers

Search United Kingdom registered companies and export the matches as clean rows, with the registry profile, ten years of filed financials, credit checks, officers, shareholders, people with significant control, group structure and filing history all reachable from one run. You pay only for the companies you actually receive.

This actor is built for credit and risk screening, supplier due diligence, know-your-business checks, building UK account lists, and enriching a CRM with registry-sourced company data.

### What you can do with it

- Search UK companies by name or by registration number and export the results as a clean table.
- Take a list of company numbers you already hold and enrich every one of them in a single run.
- Pull filed financial history rather than a single snapshot, so you can see the trend rather than one year.
- Screen a supplier list for dissolved, liquidated or in-dispute companies before you onboard them.
- Map ownership: shareholders, people with significant control, and the group structure above and below a company.
- Test a whole run against the provider's sandbox first, so you know the shape of the output before you spend a credit.
- Export everything as JSON, CSV or Excel, or push it into a CRM or warehouse.

### Features

- Two ways in: a free-text search, or a list of company numbers for straight enrichment. The list wins when both are given.
- Company numbers are normalised the way the registry files them. A bare `1234567` is padded to `01234567`, and prefixed numbers such as `SC123456` or `NI012345` keep their prefix and pad the digits, so a spreadsheet that dropped the leading zeros still resolves.
- Premium data sets are opt-in, one input field, and nothing extra is fetched unless you ask for it, because the provider charges each data set separately.
- Asking for everything at once uses the provider's single combined endpoint and skips the individual calls, so the same data is never paid for twice.
- The combined response is unwrapped whether the provider nests the profile under its own key or returns it flat, so the output shape does not change between plans.
- Sandbox mode is a first-class switch: same response shape, sample values, no credits spent.
- The registered office address is flattened into street, town, county, postcode and country columns, while the raw address block is kept intact.
- A company number the provider does not recognise comes back as a row marked `matched: false` rather than vanishing, and it is never charged for. Turn on skip-unmatched if you would rather drop them.
- Request pacing is built for the provider's published limit of 300 requests per five minutes, with retry-after aware backoff on top.
- Duplicate companies are removed within a run before anything is charged.
- The untouched provider payloads are kept under `raw`, split by which call they came from, so nothing is lost.
- Pay-per-result pricing with a hard result cap so a run can never surprise you.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `query` | string | Free-text company search by name or number. |
| `companyNumbers` | array | Registration numbers to enrich directly. Takes precedence over the search term. |
| `include` | array | Which data sets to attach: profile, financials, officers, people with significant control, shareholders, credit checks, group structure, filing history, or everything at once. |
| `subItemsPerPage` | integer | How many rows to pull for the paged data sets such as officers and filing history. |
| `sandbox` | boolean | Call the provider's sandbox: same shape, sample values, no credits spent. |
| `skipUnmatched` | boolean | Drop unresolvable company numbers instead of returning them marked unmatched. |
| `maxResults` | integer | Stop after this many companies (1 to 10,000). |
| `pageSize` | integer | Companies per search call (1 to 100). |
| `apiKey` | string | Your application key. Required, stored securely. |
| `appId` | string | Your application id. Required. |

Either a search term or a list of company numbers is required.

### Example output

Each dataset item is one company. Fields are populated where the provider has data, and the untouched payloads are kept under `raw`:

```json
{
  "companyNumber": "01234567",
  "companyName": "EXAMPLE HOLDINGS LIMITED",
  "companyStatus": "active",
  "companyStatusDetail": null,
  "companyType": "ltd",
  "companySize": "small",
  "companySizeDescription": "Small company",
  "dateOfCreation": "1998-04-21",
  "dateOfCessation": null,
  "jurisdiction": "england-wales",
  "sicCodes": ["62012"],
  "addressLine1": "88 Example Street",
  "addressLine2": null,
  "locality": "Manchester",
  "region": "Greater Manchester",
  "postalCode": "M1 2AB",
  "country": "United Kingdom",
  "registeredOfficeInDispute": false,
  "hasBeenLiquidated": false,
  "previousCompanyNames": [{ "name": "EXAMPLE SOFTWARE LIMITED", "ceased_on": "2011-06-30" }],
  "accounts": { "next_due": "2026-12-31", "last_accounts": { "made_up_to": "2025-03-31" } },
  "financials": [
    { "year_end": "2025-03-31", "turnover": 4200000, "net_assets": 1350000, "employees": 34 },
    { "year_end": "2024-03-31", "turnover": 3810000, "net_assets": 1120000, "employees": 29 }
  ],
  "officers": [{ "name": "EXAMPLE, Alex", "officer_role": "director", "appointed_on": "2014-02-01" }],
  "personsWithSignificantControl": [{ "name": "Alex Example", "natures_of_control": ["ownership-of-shares-75-to-100-percent"] }],
  "shareholders": [{ "name": "Alex Example", "shares": 750, "share_class": "ORDINARY" }],
  "creditChecks": { "credit_score": 72, "credit_limit": 145000, "risk_band": "Low risk" },
  "groupStructures": { "parent": null, "subsidiaries": [] },
  "profileUrl": "https://www.endole.co.uk/company/01234567",
  "raw": { "profile": { "company_number": "01234567" } }
}
```

### Pricing and the credit model

This actor uses pay-per-result pricing. You are charged a fixed price for each company delivered to the dataset. Duplicates and unmatched lookups are not charged, and a search that matches nothing costs nothing. Set `maxResults` to cap how many rows a run can collect, and set a run spending limit as a second safety net.

Your own provider plan meters separately, and this matters more here than with most data APIs: basic registry data is on the free tier, while financials, credit checks and shareholder data are premium endpoints charged per call. A run over 500 companies asking for four premium data sets is 2,000 charged provider calls, not 500. Ask only for the data sets you need, and use sandbox mode to shake the run out first.

### Bring your own API key

This actor connects to a third-party United Kingdom company data provider (Endole) on your behalf and requires your own provider credentials. Create a free account, open the API dashboard, make a new application, and paste its application id and application key into the `appId` and `apiKey` inputs. They are stored securely and never logged, and the actor never ships with or shares credentials.

### Frequently asked questions

#### What data does this actor return?

The registry profile is always there: company number, name, status and status detail, company type, size band, incorporation and cessation dates, jurisdiction, SIC codes, the registered office address split into street, town, county, postcode and country, whether the office is in dispute, whether the company has been liquidated, previous names, and the accounts and confirmation statement schedules. On top of that, whichever premium data sets you ask for: filed financials across ten years, officers, people with significant control, shareholders, credit checks, group structure and filing history. Every record also carries the untouched provider payloads.

#### Where does the data come from?

Companies House and other authoritative United Kingdom sources, enriched by the provider with credit scores, filed financial history, shareholder data and group structures. That enrichment is the reason to use this rather than the public registry API directly: credit scores and shareholder data are not in the free registry feed.

#### How is this different from the public registry API?

The public registry gives you the filings. This gives you the filings plus the analysis layer on top: a credit score and limit, a risk band, financial history already parsed into comparable years rather than left inside a filed document, shareholder lists, and the group structure above and below a company.

#### Which data sets cost extra?

Basic registry data is on the provider's free tier. Financials, credit checks, shareholders, group structure and filing history are premium and are charged per call on your provider plan. The `include` field is where you control that, and asking for everything at once is one call rather than seven, which is the cheaper route when you genuinely want the lot.

#### What does sandbox mode do?

It sends `sandbox=true` on every request. The provider answers with sample data in exactly the same shape, and the calls do not spend credits. Use it to check that your filters, your `include` selection and your downstream mapping all work before running the real thing.

#### My company numbers lost their leading zeros in a spreadsheet. Will they still work?

Yes. UK company numbers are eight characters and spreadsheets routinely strip the leading zeros, turning `01234567` into `1234567`. The actor pads bare numeric values back to eight characters, and handles prefixed numbers such as `SC` for Scotland and `NI` for Northern Ireland by padding the digits after the prefix. The number is normalised before any call is made.

#### What happens to a company number the provider does not recognise?

It comes back as a row with `matched: false` so you can see exactly which inputs failed, and it is not charged. If you would rather they disappeared, turn on `skipUnmatched`.

#### How does the actor handle rate limits?

The provider allows 300 requests per five minutes. The actor paces its own requests to stay under that by design, honours the retry-after signal on a rate-limited response, and backs off exponentially. A response saying the account is out of credits stops the run early and keeps everything already collected.

#### How am I charged?

You pay a fixed price per company returned to the dataset. Duplicates and unmatched lookups are not charged and empty runs cost nothing. Use `maxResults` and the run spending limit to control cost.

#### What output formats are available?

The dataset can be exported as JSON, CSV, Excel, HTML or RSS, or read through the API for pushing into a CRM or warehouse.

### Keyword map

uk company data api, companies house api alternative, company financials api, uk credit check api, company credit score api, uk company search api, company officers api, persons with significant control api, shareholder data api, company filing history api, uk business data api, kyb api uk, due diligence data api, supplier screening api, company registration number lookup, uk limited company data, group structure api, dissolved company check, sic code company search uk, b2b data enrichment uk.

# Actor input Schema

## `query` (type: `string`):

Free-text company search, by name or by registration number. Leave empty when you are supplying a list of company numbers instead.

## `companyNumbers` (type: `array`):

Registration numbers to look up directly. A bare numeric number is padded to eight characters for you, and prefixed numbers such as SC or NI are handled.

## `include` (type: `array`):

Which premium data sets to attach to each company. Each one is a separate charged call on your provider plan, so pick only what you need. Everything at once is the fastest route but also the most expensive per company.

## `subItemsPerPage` (type: `integer`):

How many rows to pull for the paged data sets such as officers and filing history. Higher values return more history per company.

## `sandbox` (type: `boolean`):

Call the provider's sandbox instead of live data. Responses come back in the same shape with sample values and do not spend your credits. Use this to test a run before paying for it.

## `skipUnmatched` (type: `boolean`):

Drop a company number the provider does not recognise instead of returning a row marked as unmatched. Unmatched rows are never charged either way.

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

Stop after this many company records (1 to 10,000). You are charged per result returned.

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

How many companies to request per search call (1 to 100). Only applies when searching rather than looking up company numbers.

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

Your own application key for the data provider. Required. Stored securely and never logged.

## `appId` (type: `string`):

Your own application id for the data provider. Required, and shown next to the key in the provider's API dashboard.

## Actor input object example

```json
{
  "include": [
    "profile"
  ],
  "subItemsPerPage": 100,
  "sandbox": false,
  "skipUnmatched": false,
  "maxResults": 50,
  "pageSize": 50
}
```

# 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 = {
    "subItemsPerPage": 100,
    "maxResults": 50,
    "pageSize": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("nabeelbaghoor/uk-company-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 = {
    "subItemsPerPage": 100,
    "maxResults": 50,
    "pageSize": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("nabeelbaghoor/uk-company-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 '{
  "subItemsPerPage": 100,
  "maxResults": 50,
  "pageSize": 50
}' |
apify call nabeelbaghoor/uk-company-financials-api --silent --output-dataset

```

## MCP server setup

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