UK Companies House Search
Pricing
from $2.00 / 1,000 company fetcheds
UK Companies House Search
Search the official UK Companies House registry for company profiles, directors, officers, filing history, and registered addresses.
Pricing
from $2.00 / 1,000 company fetcheds
Rating
0.0
(0)
Developer
Ryan Clinton
Maintained by CommunityActor stats
0
Bookmarked
23
Total users
4
Monthly active users
9 days ago
Last modified
Categories
Share
UK Companies House Intelligence & Monitoring

Turn Companies House into a deterministic UK company intelligence engine. Search, score, monitor, and investigate UK companies using official registry data. Get an auditable risk score, a compliance verdict, beneficial-ownership analysis, corporate-change monitoring, and relationship intelligence in a single structured JSON output.
Built for KYB, supplier onboarding, due diligence, and investigations.
- 5M+ active companies (plus millions of dissolved entities) across England, Wales, Scotland, and Northern Ireland
- Deterministic scoring -- same company, same score, every run; nothing is an LLM guess
- 20+ risk signals from official registry facts
- Relationship intelligence -- discover connected companies and export the graph
- Portfolio monitoring -- watch hundreds of counterparties and surface only what changed

Why not use Companies House directly?
| Companies House | This actor |
|---|---|
| Raw registry records | Decision-ready verdict + recommended action |
| No risk scoring | Deterministic 0-100 risk score with audit trail |
| No monitoring | Watchlists, typed change events, and alert severity |
| No relationship analysis | Connected-company discovery via shared directors |
| No prioritisation | Portfolio triage -- the few risky ones out of hundreds |
| No graph output | Neo4j / Gephi / NetworkX export |
The Companies House API key is free from the UK government; you bring your own, so each customer keeps the per-key rate limit. Run without a key and the actor returns step-by-step registration instructions -- zero barrier to getting started.
Choose your mode
Pick a mode and the actor fills sensible defaults for that job. Any field you set explicitly overrides the preset.
lookup— fast company lookup, decision fields only, no enrichment.{ "mode": "lookup", "query": "Tesco" }kyb— full onboarding KYB: beneficial ownership, charges, officers, filings, and the onboarding risk policy.{ "mode": "kyb", "query": "09446231" }monitor— counterparty monitoring: enrich and alert only on change.{ "mode": "monitor", "queries": ["09446231", "00445790"], "watchlistName": "suppliers" }investigate— full enrichment + connected companies via shared directors + a graph export, surfaced as red flags.{ "mode": "investigate", "query": "09446231" }discovery— advanced filtered company discovery with officer contacts.{ "mode": "discovery", "advancedSearch": { "companyNameIncludes": "construction", "companyStatus": "active", "incorporatedFrom": "2025-01-01" } }custom(default) — every input is used exactly as set.
Common workflows
Supplier onboarding -- { "mode": "kyb", "query": "09446231" } returns a recommendedAction (proceed / review / enhanced-due-diligence / archive) plus the beneficial ownership, charges, and filing facts behind it.
Vendor monitoring -- { "mode": "monitor", "queries": ["09446231", "00445790"], "watchlistName": "suppliers" } run on a schedule returns only the companies that changed, with typed events (ENTERED_INSOLVENCY, NEW_CHARGE_REGISTERED, DIRECTOR_RESIGNED) and an alertSeverity for your webhook.
Corporate investigation -- { "mode": "investigate", "query": "09446231" } returns connected companies via shared directors, red flags, and a graphNodes/graphEdges export ready for Neo4j or Gephi.
Portfolio triage -- pass a queries list of hundreds of companies; the run summary ranks the few critical/high-risk ones to look at first.
Ready-to-run examples
One-click tasks, each preset for a specific job (just add your free API key and run):
- UK Company KYB Check for Supplier Onboarding -- a verdict, risk score, and a proceed/review/EDD recommendation for one company. This is the KYB / supplier due diligence / vendor verification / corporate due diligence check: is this UK company safe to work with?
- Beneficial Ownership (PSC) Check -- who really controls a company: corporate vs individual persons with significant control (PSC), ownership bands, and an ownership-complexity score. Answers "who owns this UK company?".
- Find Companies Connected by Shared Directors -- the corporate network around a company via shared directors, with a graph export. For corporate network analysis, shared-director investigation, and finding related companies.
- Monitor UK Companies for Risk Changes -- a counterparty / supplier / insolvency monitoring watchlist that alerts only on real change: insolvency, a new charge, a director resignation, overdue accounts.
- Find UK Companies by Sector and Location -- company discovery by SIC code, status, incorporation date, and location -- for lead generation, new-company alerts, and sector research.
- Screen a List of UK Suppliers for Risk -- batch a supplier list and get a ranked critical/high/medium/low triage. For supplier screening, third-party / procurement risk, and portfolio monitoring.
See all on the examples page.
Questions this actor answers
How do I run a KYB check on a UK company? How do I verify a UK supplier before onboarding? Who are the beneficial owners (PSC) of a UK company? How do I find companies connected through shared directors? How do I monitor UK companies for insolvency or director changes? How do I check if a UK company is in liquidation or financial distress? How do I screen a list of suppliers for risk? Each is a one-click task above; all run on official Companies House data with a free key.
Key features
The differentiators first, the registry enrichment below them.
- Risk decision engine -- Every company is scored into a
verdict(active-good-standing, active-with-warnings, in-insolvency, dissolved), a 0-100riskScorewith A-F grade, and arecommendedAction(proceed, review, enhanced-due-diligence, archive). Deterministic — same company, same score. Every score ships an auditablescoreBreakdown(which factor contributed how many points) + ariskPolicyVersion; pick ariskPolicy(onboarding/supplier/credit/balanced/minimal) to reweight the same facts for your workflow. - Relationship intelligence -- Discover companies connected to this one via a shared director: a
connectedCompanies[]list (each with the director it came through) + arelationshipSummary. Turns a lookup into an investigation tool — most actors can fetch a company's officers; far fewer can show you the companies behind them. - Graph export --
graphNodes[]+graphEdges[](companies and directors as nodes, appointments as edges) ready to drop straight into Neo4j, Gephi, or NetworkX. - Counterparty monitoring & alerts -- Set a
watchlistNameand the actor diffs each run against the last, emitting a change flag, a risk delta, typed corporate events, and analertSeverity(critical/high/medium/low) so a webhook fires on insolvency but not on a routine confirmation statement.alertOnly,minimumRiskDelta, andeventFilterkeep only what matters. - Portfolio triage -- On a batch or watchlist run, the summary's
portfolioSummarygives the full risk distribution (critical/high/medium/low) plus a rankedtopRisks[]-- the few companies to look at first out of hundreds. - Company fingerprint -- A compact
companyFingerprint(stability, ownershipComplexity, managementStability, financialPressure, registryRisk, each 0-100) reads the whole company in five numbers. - Red flags + risk narrative -- A one-line
riskNarrativeyou can paste into a ticket, plus aredFlags[]list and deterministicearlyWarningSignals[]/anomalyFlags[]— the investigator's "is this weird?" answer, explainable. - Beneficial ownership (PSC) --
pscSummary(corporate vs individual PSCs, ownership bands, control flags) + anownershipComplexityscore + flags such asPSC_MISSING,FOREIGN_CORPORATE_PSC,MAJORITY_CONTROL. - Charges detail -- Classified registered charges (outstanding vs satisfied, latest charge/satisfied dates) with an
OUTSTANDING_CHARGESflag. - Filing intelligence + health timeline -- A chronological
timelineof registry events plus ahealthTrend(improving/stable/deteriorating) and flags likeRECENT_DIRECTOR_RESIGNATION,RECENT_NAME_CHANGE. - Officer network + director churn --
directorChurn(appointments/resignations in the last 12 months) flags management instability;officerNetworkSummaryflags sole directors, multiple directorships, and possible serial directors. - Sector age comparison -- An honest age-percentile against the company's own SIC code ("older than 86% of companies in this sector"), computed from real population counts.
- Batch + advanced search -- Pass a
querieslist for one decision row per company, orsearchMode: "advanced"to discover companies by name fragment, status, type, SIC code, incorporation date, and location. - Output profiles + match confidence --
outputProfile(minimalfor agents,standard, orfull) controls how much each record carries; every search result gets a 0-100matchConfidenceso you can tell the company you meant from the fuzzy hits. - Resilient + honest -- Automatic retry with backoff on rate limits and transient errors, a dry-run mode that returns key-registration instructions instead of failing, direct Companies House links on every record, and clean camelCase JSON ready for downstream processing.

Example output
Every company is a decision, not a data dump. Three companies, three answers:
Healthy:
{ "companyName": "TESCO PLC", "verdict": "active-good-standing", "riskScore": 4, "riskGrade": "A", "recommendedAction": "proceed" }
Needs review:
{ "companyName": "EXAMPLE TRADING LTD", "verdict": "active-with-warnings", "riskScore": 37, "riskGrade": "C", "recommendedAction": "review", "redFlags": ["accounts overdue", "new secured lending registered recently"] }
High risk:
{ "companyName": "DISTRESSED CO LTD", "verdict": "in-insolvency", "riskScore": 92, "riskGrade": "F", "recommendedAction": "enhanced-due-diligence", "alertSeverity": "critical" }

The company in five numbers. Every record carries a companyFingerprint — the whole company read at a glance:
{ "stability": 92, "managementStability": 88, "ownershipComplexity": 54, "financialPressure": 15, "registryRisk": 22 }

Why you can trust the score. The score is never a black box — every record ships the exact factors and points behind it:
{ "scoreBreakdown": [ { "factor": "ACCOUNTS_OVERDUE", "points": 30 }, { "factor": "HAS_CHARGES", "points": 10 } ] }

The full record adds beneficial ownership, charges, timeline, and (in investigate mode) connected companies and the graph export. See Output for the complete shape.
Counterparty monitoring
Set a watchlistName and schedule the run. Each run is compared against the last under that name, and you get back only what changed — with an alertSeverity your webhook branches on:
{"companyName": "SUPPLIER LTD","changeFlag": "ESCALATED","events": ["NEW_CHARGE_REGISTERED", "DIRECTOR_RESIGNED"],"riskDelta": 18,"alertSeverity": "high"}
Run it daily over your supplier list with mode: "monitor" and alertOnly: true: you receive meaningful changes (entered insolvency, new charge, new PSC, accounts overdue) and nothing else. minimumRiskDelta and eventFilter cut the noise further. The run summary carries a portfolioSummary so you see "3 critical, 11 high out of 500" at a glance.

Investigation mode
{ "mode": "investigate", "query": "09446231" } turns a lookup into an investigation. Discover:
- companies sharing a director with this one (
connectedCompanies[], each tagged with the director it came through) - serial directors and multiple-directorship signals
- ownership structure (PSC) and red flags
Then export the network directly to a graph tool:
{"graphNodes": [{ "id": "09446231", "label": "MONZO BANK LIMITED", "type": "company" },{ "id": "director:SMITH, John", "label": "SMITH, John", "type": "director" }],"graphEdges": [{ "source": "director:SMITH, John", "target": "09446231", "relationship": "APPOINTED_TO" }]}
The graphNodes/graphEdges shape drops straight into Neo4j, Gephi, or NetworkX — the read that journalists, AML teams, and corporate investigators actually want, built entirely on public registry data.

How to use
Using the Apify Console
- Navigate to the UK Companies House Search actor page on Apify.
- Click Try for free to open the actor in the Apify Console.
- Enter your search query -- a company name like "Tesco" or a company number like "00445790".
- Paste your Companies House API key into the API Key field. If you do not have one yet, run the actor without a key to receive registration instructions.
- Optionally enable Include Officers/Directors and/or Include Filing History to enrich results.
- Set the Company Status Filter if you want only active, dissolved, or other specific statuses.
- Adjust Max Results (default 25, maximum 100) to control how many companies are returned.
- Click Start and wait for the run to complete.
- View results in the Dataset tab, or export as JSON, CSV, Excel, or RSS.
Using the Apify API
cURL:
curl -X POST "https://api.apify.com/v2/acts/ryanclinton~uk-companies-house/runs?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"query": "Tesco","apiKey": "YOUR_COMPANIES_HOUSE_API_KEY","includeOfficers": true,"includeFilings": false,"companyStatus": "active","maxResults": 10}'
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('ryanclinton/uk-companies-house').call({query: 'Tesco',apiKey: 'YOUR_COMPANIES_HOUSE_API_KEY',includeOfficers: true,includeFilings: true,companyStatus: 'active',maxResults: 10,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("ryanclinton/uk-companies-house").call(run_input={"query": "Tesco","apiKey": "YOUR_COMPANIES_HOUSE_API_KEY","includeOfficers": True,"includeFilings": True,"companyStatus": "active","maxResults": 10,})items = client.dataset(run["defaultDatasetId"]).list_items().itemsfor item in items:print(item["companyName"], item["companyNumber"])
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
mode | string | No | custom | One-click preset: lookup, kyb, monitor, investigate, discovery, or custom. Fills sensible defaults; any field you set explicitly overrides the preset. |
query | string | No | -- | A single company name or number (e.g., "Tesco" or "00445790"). Leave blank if using queries or advanced search. |
queries | string[] | No | -- | Batch mode: a list of names and/or numbers. One decision row per company; unmatched entries return as unresolved records. |
searchMode | string | No | basic | basic uses query/queries; advanced uses advancedSearch filters for filtered discovery. |
advancedSearch | object | No | -- | Advanced-search filters (when searchMode: "advanced"): companyNameIncludes, companyStatus, companyType[], sicCodes[], incorporatedFrom, incorporatedTo, location. |
apiKey | string | No | -- | Companies House API key. Free at developer.company-information.service.gov.uk. If omitted, the actor returns registration instructions. |
includeOfficers | boolean | No | false | Fetch officer and director details (adds 1 API call per company). |
includeFilings | boolean | No | false | Fetch and classify recent filing history (adds 1 API call per company). |
includePsc | boolean | No | false | Fetch and summarise persons with significant control / beneficial ownership (adds 1 API call per company). |
includeCharges | boolean | No | false | Fetch and classify registered charges (adds 1 API call per company). |
includeOfficerAppointments | boolean | No | false | Fetch active directors' other appointments for officer-network flags (adds up to ~10 calls per company, capped). |
includeRelationshipAnalysis | boolean | No | false | Discover connected companies via shared directors (connectedCompanies[] + relationshipSummary). Adds up to ~10 calls per company, capped. Implies includeOfficers. |
includeGraphEdges | boolean | No | false | Emit graphNodes[] + graphEdges[] for Neo4j/Gephi. Requires includeRelationshipAnalysis; returned in the full profile. |
includeSectorComparison | boolean | No | false | Honest sector age-percentile (vs the company's SIC population by incorporation date). Adds 2 API calls per company. |
riskPolicy | string | No | balanced | Reweights the score for your workflow: balanced, onboarding, supplier, credit, or minimal. Facts are unchanged; the score is auditable via scoreBreakdown. |
companyStatus | string | No | All | Filter basic-search results by status: active, dissolved, liquidation, receivership, or converted-closed. |
maxResults | integer | No | 25 | Maximum number of company results to return (1--100). Ignored when the query is an exact company number. |
outputProfile | string | No | standard | Detail per company: minimal (decision fields only), standard (full record without officer/filing arrays), or full (everything). |
watchlistName | string | No | -- | Set a name to monitor these companies across runs (change flag, risk delta, typed corporate events). Leave blank for a one-off lookup. |
alertOnly | boolean | No | false | Monitoring: emit only companies that changed since the last run (counted in the summary, never silently dropped). |
minimumRiskDelta | integer | No | 0 | Monitoring: treat a risk-score move smaller than this (with no event) as UNCHANGED, cutting noise. |
eventFilter | string[] | No | -- | Monitoring: keep only companies whose corporate events intersect this list (e.g. ENTERED_INSOLVENCY, NEW_CHARGE_REGISTERED). |
Example input JSON:
{"query": "Barclays","apiKey": "YOUR_COMPANIES_HOUSE_API_KEY","includeOfficers": true,"includeFilings": true,"companyStatus": "active","maxResults": 5}
Tips for best input:
- Use specific company names rather than generic terms like "consulting" or "services" to get focused results.
- If you know the exact company number (e.g., "00445790"), use it as the query for a precise single-result match.
- Leave
includeOfficersandincludeFilingsdisabled when you only need basic profile data -- this significantly reduces run time and API calls. - Set
companyStatusto "active" to skip dissolved entities and speed up processing.
Output
Each company is returned as a structured JSON object carrying both the registry facts and a deterministic compliance assessment: a verdict, a 0-100 riskScore derived from registry-fact flags, a recommendedAction your automation can branch on, and a plain-English summary. A run-level summary record (and the SUMMARY key-value record) rolls up the portfolio distribution and top risks. The outputProfile input controls how much of each record ships.
The dataset ships with ready-made views in the Apify Console, so you do not have to scroll a wide table: Decisions (company, verdict, risk, action), Monitoring (change flag, events, risk delta — watchlist runs), Ownership & Officers (PSC, charges, officer network), and Overview (the plain registry fields).
{"recordType": "company","schemaVersion": "2.0.0","companyNumber": "00445790","companyName": "TESCO PLC","verdict": "active-with-warnings","riskScore": 10,"riskLevel": "low","riskGrade": "A","recommendedAction": "review","complianceFlags": ["HAS_CHARGES"],"riskFactors": ["Has registered charges (secured debt)"],"verdictReason": ["Has registered charges (secured debt)"],"summary": "TESCO PLC is active (verdict: active-with-warnings, risk 10/100 grade A). Recommended action: review. Flags: Has registered charges (secured debt).","riskNarrative": "TESCO PLC has 1 red flag (verdict: active-with-warnings, risk 10/100): has registered charges (secured debt).","redFlags": ["has registered charges (secured debt)"],"earlyWarningSignals": [],"anomalyFlags": [],"companyFingerprint": { "stability": 92, "ownershipComplexity": 0, "managementStability": 88, "financialPressure": 15, "registryRisk": 10 },"matchConfidence": 100,"exactMatch": true,"companyStatus": "active","companyType": "plc","jurisdiction": "england-wales","dateOfCreation": "1947-11-27","dateOfCessation": null,"ageYears": 78.1,"companyNumberFormat": { "valid": true, "scheme": "England & Wales" },"accountsOverdue": false,"accountsNextDue": "2025-12-31","confirmationStatementOverdue": false,"confirmationStatementNextDue": "2025-07-20","registeredOfficeInDispute": false,"undeliverableAddress": false,"previousNames": [],"registeredOfficeAddress": {"addressLine1": "Shire Park","addressLine2": "Kestrel Way","careOf": null,"country": "United Kingdom","locality": "Welwyn Garden City","poBox": null,"postalCode": "AL7 1GA","premises": null,"region": "Hertfordshire"},"sicCodes": ["47110"],"hasCharges": true,"hasInsolvencyHistory": false,"activeOfficerCount": 12,"resignedOfficerCount": 40,"officers": [{"name": "MURPHY, Ken","officerRole": "director","appointedOn": "2020-10-01","resignedOn": null,"nationality": "Irish","countryOfResidence": "England","occupation": "Chief Executive"},{"name": "STEWART, Imran","officerRole": "secretary","appointedOn": "2022-06-01","resignedOn": null,"nationality": "British","countryOfResidence": "England","occupation": "Company Secretary"}],"recentFilings": [{"date": "2024-09-15","category": "accounts","type": "AA","description": "Full accounts made up to 24 February 2024","barcode": "XD1234567"},{"date": "2024-07-20","category": "confirmation-statement","type": "CS01","description": "Confirmation statement made on 27 November 2023","barcode": "XC9876543"}],"companiesHouseUrl": "https://find-and-update.company-information.service.gov.uk/company/00445790"}
The decision fields — what most consumers branch on:
| Field | Type | Description |
|---|---|---|
verdict | string | active-good-standing, active-with-warnings, dormant, in-insolvency, dissolved, or unknown |
riskScore / riskLevel / riskGrade | number / string | 0-100 score, low/medium/high/critical band, A-F grade |
recommendedAction | string | proceed, review, enhanced-due-diligence, manual-review, or archive |
scoreBreakdown | object[] | Auditable per-factor contribution [{ factor, label, points }] (the score is their capped sum) |
companyFingerprint | object | { stability, ownershipComplexity, managementStability, financialPressure, registryRisk } (0-100 each) |
riskNarrative / redFlags | string / string[] | Paste-ready one-line summary + investigator red flags |
complianceFlags / riskFactors | string[] | Stable enum flags + their human labels (full enum list in the dataset schema) |
recordType / matchConfidence / companiesHouseUrl | string / number / string | Record discriminator, query-match confidence, official registry link |
Registry facts (always present): companyNumber, companyName, companyStatus, companyType, jurisdiction, dateOfCreation, ageYears, registeredOfficeAddress, sicCodes, hasCharges, hasInsolvencyHistory, accountsOverdue / accountsNextDue, confirmationStatementOverdue, previousNames, companyNumberFormat.
Enrichment blocks (each present only when its input is enabled): pscSummary + ownershipComplexity (includePsc), chargesSummary (includeCharges), filingSummary + timeline + healthTrend (includeFilings), officerNetworkSummary + directorChurn + officers (includeOfficers), relationshipSummary + connectedCompanies (includeRelationshipAnalysis), graphNodes + graphEdges (includeGraphEdges), sectorComparison (includeSectorComparison), and the always-on earlyWarningSignals / anomalyFlags. Every field is documented in .actor/dataset_schema.json.
Monitoring fields (only when watchlistName is set): changeFlag (NEW/RESOLVED/ESCALATED/DOWNGRADED/UNCHANGED), previousRiskScore, riskDelta, changeReason[], events[] (typed corporate events: STATUS_CHANGED, BECAME_DISSOLVED, ENTERED_INSOLVENCY, COMPANY_RESTORED, DORMANT_STATUS_CHANGED, NEW_CHARGE_REGISTERED, CHARGE_SATISFIED, INSOLVENCY_HISTORY_APPEARED, ACCOUNTS_NOW_OVERDUE, CONFIRMATION_STATEMENT_NOW_OVERDUE, DIRECTOR_APPOINTED, DIRECTOR_RESIGNED, NEW_PSC, PSC_REMOVED, ADDRESS_CHANGED, NAME_CHANGED, RISK_ESCALATED, RISK_IMPROVED -- director/PSC/charge/address/name events require the matching enrichment to be enabled), firstSeenAt, and runsSeen. The run summary record carries a portfolioSummary rollup (companies checked, the full critical/high/medium/low distribution, a ranked topRisks[], and -- in monitoring mode -- entered-insolvency / new-charge / new-director / restored counts) plus runStats.
What this does NOT do
Honest scope so you know what you are buying:
- Official registry facts, not credit scoring. The risk score is built from public Companies House facts (status, insolvency history, charges, overdue filings). It is not a commercial credit rating like Creditsafe, Dun & Bradstreet, or Experian, and it does not predict default probability.
- Identifier hygiene, not entity legitimacy. Company-number validation checks the registration number's structure (UK company numbers carry no check digit, so it is format-only). A validly registered, active company can still be a dormant shell.
- Companies House only. This covers UK-registered companies. It summarises beneficial ownership (PSC) for the queried company, but does not traverse the full multi-level ownership graph, and does not pull HMRC, court judgments (CCJs), or non-UK registries.
- No address clustering / formation-agent detection. The Companies House API has no exact registered-address count (its only address filter is fuzzy full-text that over-counts a single building into the tens of thousands), so this actor does not claim a "companies at this address" or "mass-registration address" signal rather than fabricate one. Sector comparison covers age-percentile only, for the same honesty reason.
- Decision support, not legal advice.
recommendedActionis operational routing (proceed / review / enhanced-due-diligence / archive) for your own workflow, not regulated advice.
Use cases
- Due diligence and KYC -- Verify company registration details, incorporation dates, and current status as part of Know Your Customer or anti-money laundering checks.
- B2B lead generation -- Search for active companies in specific industries using SIC codes and build targeted prospect lists with officer contact details.
- Competitor monitoring -- Track filing activity, officer changes, and status updates for competitor companies on a scheduled basis.
- Investment research -- Pull company profiles, insolvency history, and charge indicators for companies you are evaluating for investment or acquisition.
- Supply chain verification -- Confirm that suppliers and partners are registered, active companies with valid registered addresses in the UK.
- Legal and compliance -- Retrieve officer lists and filing history for litigation research, regulatory compliance, or corporate governance reviews.
- Academic and market research -- Analyze company formation trends, dissolution rates, and industry distribution across the UK company registry.
- Real estate intelligence -- Cross-reference company registered addresses with property data to understand corporate property holdings.
- Insolvency and credit risk -- Identify companies with insolvency history or charges registered against them to assess credit risk.
- Journalism and investigations -- Look up companies, their directors, and filing histories for investigative reporting or public interest research.
Use in Dify
Drop this actor into Dify workflows via the Apify plugin's Run Actor node. Each company returns scored, classified, and recommended as structured JSON: verdict (active-good-standing / active-with-warnings / in-insolvency / dissolved), riskLevel (low / medium / high / critical), and the recommendedAction your downstream node branches on. A scraper pointed at the Companies House website returns rendered HTML of a paginated UI; this returns decisions.
- Actor ID:
ryanclinton/uk-companies-house - Sample input (KYB gate on a counterparty before onboarding):
{"query": "09446231","apiKey": "YOUR_COMPANIES_HOUSE_API_KEY","outputProfile": "minimal"}
Branching example. A Dify if/else node routes the onboarding flow on the actor's enum without parsing any prose:
recommendedAction == "proceed"→ auto-approve the counterparty and continue.recommendedAction == "review"→ send to the human review queue.recommendedAction == "enhanced-due-diligence"→ trigger your EDD sub-workflow.recommendedAction == "archive"→ reject (company is dissolved).
You can branch equally cleanly on verdict, on riskLevel, or on the decision-ready booleans (accountsOverdue, hasInsolvencyHistory, registeredOfficeInDispute). The complianceFlags[] and riskFactors[] arrays are usable verbatim in a notification or ticket body — no LLM rewriting needed.
Monitoring mode for Dify. Set a watchlistName and schedule the run; each company then also carries changeFlag and a typed events[] array (ENTERED_INSOLVENCY, NEW_CHARGE_REGISTERED, ACCOUNTS_NOW_OVERDUE). A Dify workflow filters events to fire an alert only when a counterparty's standing actually changes.
The outputProfile: "minimal" setting returns only the decision fields, keeping the JSON an agent has to read small.
API & Integration
You can start runs and retrieve results programmatically using the Apify API or client libraries. See the code examples in the How to use section above for full Python, JavaScript, and cURL samples.
Fetch results from a completed run:
$curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_APIFY_TOKEN&format=json"
Platform integrations
This actor works with all Apify integrations out of the box:
- Zapier -- Trigger Zaps when new company data is available.
- Make (Integromat) -- Build automated workflows that process company search results.
- Google Sheets -- Export results directly to a spreadsheet for collaborative analysis.
- Slack -- Send notifications when specific companies are found or status changes occur.
- Webhooks -- Configure a webhook URL to receive results as soon as a run completes.
- REST API -- Start runs, check status, and retrieve datasets from any HTTP client.
How it works

Each company runs through resolve → enrich → score → (diff) pipeline, streaming a decision row as it completes:
- Resolve -- A company-number query resolves directly to one record; a name query hits
/search/companies; aquerieslist resolves each entry;searchMode: "advanced"discovers companies by filters. The dry-run path (no API key) returns registration instructions. - Enrich (opt-in) -- For each company, the full profile (
/company/{number}) is fetched, plus any enabled enrichment: officers, filing history, beneficial ownership (/persons-with-significant-control), charges (/charges), and officer appointments (/officers/{id}/appointments) for the officer network and connected-company discovery. - Score -- Registry facts collapse into deterministic compliance flags, then a 0-100
riskScore(reweighted by the chosenriskPolicy), averdict, arecommendedAction, acompanyFingerprint, red flags, early-warning signals, and anomaly flags. No LLM, no randomness. - Diff (watchlist) -- With a
watchlistName, each company is compared against its prior snapshot (in a named key-value store) to emit change flags, typed corporate events, and analertSeverity. - Output -- Each decision row streams to the dataset as it resolves; a run-level
summaryrecord (portfolio rollup + run stats) and aSUMMARYkey-value record close the run.
All fetches use a 30-second timeout and retry with exponential backoff on rate limits (429), 5xx, and transient network errors. A circuit breaker stops early if the profile endpoint fails repeatedly.
Performance & cost
Run time scales with how much enrichment you turn on, because each enrichment is an extra API call per company. The actor paces requests within the Companies House limit (600 requests per 5 minutes).
| Mode / enrichment | API calls per company | Typical pace |
|---|---|---|
lookup (profile only) | 1 | fastest -- a single lookup is ~1--2 seconds |
kyb (PSC + charges + officers + filings) | ~5 | a few seconds per company |
investigate (KYB + relationship graph) | up to ~15 | slowest -- the officer-appointments fan-out dominates |
+ includeSectorComparison | +2 count queries | adds two calls per company |
The cost-transparency log at the start of every run states the expected calls per company and the per-event charge. The Companies House API itself is free; you only pay for Apify platform compute. Use the lookup mode and minimal enrichment for the fastest, cheapest runs; reach for investigate when you actually need the relationship graph.
Limitations
- Maximum 100 results per run -- The Companies House search API returns a maximum of 100 items per request. For broader searches, run multiple queries with different keywords.
- API key required for live data -- A free Companies House API key is required. Without one, the actor runs in dry-run mode and returns registration instructions only.
- Rate limiting -- The API allows 600 requests per 5 minutes. Large runs with officers and filings enabled for 100 companies may approach this limit, though the actor handles retries automatically.
- UK companies only -- This actor searches the Companies House registry, which covers England, Wales, Scotland, and Northern Ireland. It does not cover companies registered in other jurisdictions.
- Officer limit of 50 per company -- The actor fetches up to 50 officers per company. Companies with more than 50 current and former officers may have incomplete officer lists.
- Filing history limited to 25 entries -- Only the 25 most recent filings are returned per company. Older filings are not included.
- Search relevance -- The Companies House search API uses its own relevance ranking. Broad or generic search terms may return unexpected results.
Responsible use
- Public data only -- This actor accesses publicly available data through the official Companies House REST API. All returned information is part of the UK public record.
- Respect rate limits -- The actor automatically handles rate limiting, but avoid scheduling unnecessarily frequent runs that could strain the API. Use reasonable intervals for scheduled monitoring.
- Data protection compliance -- Officer names and addresses are public record under UK company law. However, if you process this data alongside other personal information, ensure compliance with UK GDPR and the Data Protection Act 2018.
- No scraping involved -- This actor uses the official API, not web scraping. It operates within the terms of service of the Companies House Developer Hub.
- Intended for legitimate purposes -- Use the data for lawful business purposes such as due diligence, compliance, research, and lead generation. Do not use it for harassment, stalking, or other unlawful activities.
FAQ
Q: Is the Companies House API free? A: Yes. The Companies House REST API is completely free to use. You only need to register for a developer account at developer.company-information.service.gov.uk and create an API key. There are no usage charges from Companies House.
Q: How do I get a Companies House API key? A: Visit the Companies House Developer Hub, create a free account, go to "Manage Applications", create a new application, select the "Live" environment and "REST API" type, and copy your API key.
Q: What happens if I run the actor without an API key? A: The actor enters dry-run mode and outputs a helpful JSON object with step-by-step instructions on how to register for a free API key. No error is thrown.
Q: Can I search for dissolved companies? A: Yes. By default, the search returns companies of all statuses. You can also specifically filter for dissolved companies by setting the Company Status Filter to "dissolved".
Q: How many results can I get per run? A: Up to 100 companies per run. Each company includes a full profile, and optionally up to 50 officers and 25 recent filings.
Q: Does this actor scrape the Companies House website? A: No. This actor uses the official Companies House REST API, which is the recommended and legitimate way to access UK company data programmatically.
Q: What are SIC codes in the output? A: Standard Industrial Classification (SIC) codes describe a company's primary business activities. For example, code 47110 represents "Retail sale in non-specialised stores with food, beverages or tobacco predominating". You can look up SIC codes on the Companies House SIC code list.
Q: Can I search by company number instead of name? A: Yes. Enter the company number (e.g., "00445790") as the search query. The Companies House search API accepts both names and numbers.
Q: How does the status filter work? A: The status filter is applied as a post-filter after the search results are returned from the API. If you filter for "active" companies, dissolved and other non-active results are removed from the output before enrichment.
Q: What company types are covered? A: All types registered with Companies House, including private limited (ltd), public limited (plc), limited liability partnerships (llp), community interest companies (CIC), Scottish limited partnerships, and more.
Q: Can I schedule this actor to run automatically? A: Yes. Use Apify's built-in scheduling feature to run the actor on any interval -- hourly, daily, weekly, or with a custom cron expression. Combine with webhooks or integrations to get notified of new results.
Q: What does the hasCharges field mean?
A: The hasCharges field indicates whether the company has any registered charges (such as mortgages or debentures) recorded at Companies House. This is useful for credit risk assessment and due diligence.
Related actors
| Actor | Description | Link |
|---|---|---|
| OpenCorporates Search | Search the world's largest open database of company information covering 140+ jurisdictions | apify.com/ryanclinton/opencorporates-search |
| UK Charity Commission | Look up registered UK charities by name, number, or keyword for charity details and financial data | apify.com/ryanclinton/uk-charity-commission |
| GLEIF LEI Lookup | Search the Global Legal Entity Identifier database for corporate entity identifiers used in financial reporting | apify.com/ryanclinton/gleif-lei-lookup |
| UK Land Registry | Search UK HM Land Registry for property transaction data and price paid records | apify.com/ryanclinton/uk-land-registry |
| OFAC Sanctions Search | Search the US Treasury OFAC sanctions list to screen companies and individuals for compliance | apify.com/ryanclinton/ofac-sanctions-search |
| OpenSanctions Search | Search the OpenSanctions database for sanctioned entities, PEPs, and criminal watchlists worldwide | apify.com/ryanclinton/opensanctions-search |