# UK Company Dossier - Companies House & Environmental Permits (`j0401/uk-company-dossier`) Actor

One UK company by Company Number, or a licensed-sponsor name resolved by exact normalised match: Companies House status, category, dates, address, SIC codes, previous names and mortgage counts, plus every Environment Agency permit tied to that company number. Facts only.

- **URL**: https://apify.com/j0401/uk-company-dossier.md
- **Developed by:** [Wenhao Yang](https://apify.com/j0401) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 uk company dossiers

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

## UK Company Dossier - Companies House & Environmental Permits

One UK company, one call. Give a Company Number and get the Companies House registration record plus every Environment Agency permit tied to that company - or give a Home Office licensed-sponsor name and it is resolved to the company by exact normalised match.

### Low cost

**From $0.002 per dossier, down to $0.0012 at Gold.** One dossier is one billed record.

### What you get

Each dossier restates the published facts for one company:

- **Companies House** - `companyNumber`, `companyName`, `companyStatus`, `companyCategory`, `countryOfOrigin`, `incorporationDate`, `dissolutionDate`, registered `registeredAddress` and `postcode` (all dates are normalised to ISO `YYYY-MM-DD`), `sicCodes`, `previousNames`, accounts and confirmation-statement due dates, outstanding and total mortgage charges, and the Companies House `chUri`.
- **Environment Agency** - `eaPermitCount`, `eaRegisters` and `eaPermits`: for every waste-carrier / broker registration whose Company Number is the company's, the permit id, holder name and type, registration type and tier, activity, registered address and postcode, issue and expiry dates, and the source URL. (Only the waste-carrier register publishes a Company Number, so the other EA registers never join on this key.)
- **Match provenance** - `matchType` (`exact-number` / `exact-normalized-sponsor` / `no-match` / `not-in-warmed-scope`), `needsReview`, `sponsorName`, `sponsorCandidates`, `sponsorCandidatesTruncated`, `registersMissing`, `asOf`, `companiesHouseAsOf`.

### Examples

Company by number:

```json
{ "companyNumber": "08355236" }
```

Company by licensed-sponsor name:

```json
{ "sponsorName": "Tetra Care Ltd" }
```

The default run returns company 08355236.

### How the join works

- **Company Number is the key.** Companies House and the Environment Agency both publish it, so the join is exact - there is no name guessing on this path.
- **Sponsor names are matched exactly after normalisation.** Case, punctuation, `&`/`AND` and legal suffixes (`Ltd`, `Limited`, `PLC`, `LLP`) are normalised on both sides, and a trailing `T/A ...` trading name is dropped. Only an **exact-normalised** match is returned. Fuzzy matching is deliberately not offered: a 1,000-name measurement put fuzzy candidate precision at about 50%, so a near-miss would be a false identity assertion.
- **Ambiguity is visible.** If a sponsor name normalises to more than one company, every match is returned with `needsReview=true`. If the name states a legal form (`Ltd`, `PLC`, `LLP`, `LP`) that differs from the matched company's, `needsReview=true` as well - an exact-normalised name is not an identity assertion. A sponsor name with no exact match returns one row with `matchType="no-match"` and `registersMissing="companies-house"` - never a best guess.

### Coverage and honest limits

- **Measured 2026-10-31:** 1,000 Environment Agency company numbers resolved to Companies House **963 / 1,000 (96.3%)**; 1,000 licensed-sponsor names resolved by exact normalisation **845 / 1,000 (84.5%)**. The unresolved sponsor names are largely non-company entities (charities, colleges, partnerships, unincorporated businesses).
- **Warmed scope.** The corpus covers companies that appear in an Environment Agency permit row or match a licensed-sponsor name. A Company Number outside that scope is reported as `matchType="not-in-warmed-scope"` with `registersMissing="companies-house"`; it is not evidence that the company does not exist. Use the full **UK Companies House** actor in this account for an arbitrary company lookup.
- **Facts only.** Nothing here is scored, rated, predicted or recommended. There is no officer, PSC or trustee data; company-level records only.
- **Company-level data only.** No individual is named or aggregated. Sponsor names are organisation names as published by the Home Office.
- `asOf` is the day the warmed corpus was built; `companiesHouseAsOf` is the date of the Companies House bulk file inside it (the bulk is published monthly, so it is normally a few weeks older than `asOf`). `registersMissing` means the company was not found in the warmed Companies House scope - it is not evidence that the company does not exist. The EA block has no separate missing state: a company with no EA registration simply has `eaPermitCount=0`.
- The corpus is a monthly Companies House bulk snapshot and a sponsor register refreshed whenever the owner warm runs; both are manual, not a live feed. `asOf` (also in `meta` on the actor's public store) is the build date and `companiesHouseAsOf` is the bulk-file date.
- **A no-match or out-of-scope lookup still costs one dossier charge** - the register lookup was performed and one record is delivered.

### Intended use & limits

**What this is.** A consolidated restatement of facts published by public registers, keyed by an exact identifier. Nothing here is scored, rated, predicted, or recommended.

**What this is not.** Not a consumer report under the Fair Credit Reporting Act (15 U.S.C. 1681 et seq.). Do not use it for credit, insurance, employment, housing or tenant-eligibility decisions about any person without independently verifying the underlying record and obtaining legal advice. Not legal, tax or investment advice.

**Accuracy.** Records may be incomplete, delayed, sealed, amended or removed by the issuing agency. Each register block carries its `asOf`; `registersMissing` lists registers that did not answer. Verify with the issuing agency before relying on any record.

**Matching.** Records are joined only by the exact Companies House number, or by a name that is identical after the documented normalisation. Names are never used to assert an identity beyond an exact-normalised match.

**Personal data.** Company-level only; no officers, PSC, trustees or individual names.

**Corrections and removal.** If a record is wrong, or you need a company suppressed, contact the publisher through the Apify actor's Issues tab; we forward verifiable correction and removal requests to the issuing agency and reply within 10 working days.

### Source and licence

Companies House *BasicCompanyDataAsOneFile* and the Environment Agency public register downloads. Contains public sector information licensed under the **Open Government Licence v3.0**. No login or API key is used.

### Related

Also in this account: **UK Companies House** (the full 5.7M-company register), **England Environmental Permits** (the eleven EA registers) and **UK Visa Sponsors** (the Home Office licensed-sponsor register).

# Actor input Schema

## `companyNumber` (type: `string`):

Companies House company number, e.g. "08355236" or "SC722287". Spaces and punctuation are ignored. Leave empty to use the default company.

## `sponsorName` (type: `string`):

A Home Office licensed-sponsor organisation name, e.g. "Tetra Care Ltd". Matched only after normalising case, punctuation and legal suffixes (Ltd/Limited/PLC/LLP), and exact-normalised only - no fuzzy matching. If the name matches more than one company, every match is returned with needsReview=true. Do not pass together with companyNumber.

## Actor input object example

```json
{
  "companyNumber": "",
  "sponsorName": ""
}
```

# Actor output Schema

## `recordsUrl` (type: `string`):

UK company dossiers - as JSON

## `datasetUrl` (type: `string`):

No description

## `runUrl` (type: `string`):

No description

# 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("j0401/uk-company-dossier").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("j0401/uk-company-dossier").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 j0401/uk-company-dossier --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,j0401/uk-company-dossier"
        }
    }
}
```

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/xZpI2xBTOsD5LymfE/builds/tvee1OXft60IedsYn/openapi.json
