Companies API Reference
UK company data from Companies House. Search, lookup, financials, PSC data, comparison, and industry benchmarks.
Base URL: https://api.govdata.dev/v1
Company Search
/v1/companies/search
Waiting for request...
Search for UK companies by name. Returns paginated results ranked by relevance.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
q |
string | Yes | Search query (min 2 characters) |
status |
string | No | Filter by status. The active-register dataset has 14 statuses (for example active, liquidation, in-administration). dissolved is accepted but returns no records today. |
page |
integer | No | Page number (default: 1) |
per_page |
integer | No | Results per page (default: 25, max: 100) |
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.govdata.dev/v1/companies/search?q=ACME"
uri = URI("https://api.govdata.dev/v1/companies/search?q=ACME") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies/search", headers={"Authorization": "Bearer YOUR_API_KEY"}, params={"q": "ACME"} )
const url = new URL("https://api.govdata.dev/v1/companies/search"); url.searchParams.set("q", "ACME"); const response = await fetch(url, { headers: { "Authorization": "Bearer YOUR_API_KEY" } });
Response
{ "data": [ { "company_number": "12345678", "company_name": "ACME WIDGETS LTD", "company_status": "active", "company_type": "ltd", "date_of_creation": "2020-01-15", "registered_office_address": { "postal_code": "EC2R 6EA", "locality": "London" }, "sic_codes": ["62012", "62020"] } ], "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House", "source_url": "https://download.companieshouse.gov.uk", "query": "ACME" }, "pagination": { "total": 1, "page": 1, "per_page": 25, "total_pages": 1 } }
Company Lookup
/v1/companies/:company_number
Waiting for request...
Retrieve full details for a specific company by its Companies House number.
Parameters
| Parameter | Type | Description |
|---|---|---|
company_number |
string (path) | 8-digit Companies House number (e.g., 12345678) |
curl -H "Authorization: Bearer YOUR_API_KEY" \ https://api.govdata.dev/v1/companies/12345678
uri = URI("https://api.govdata.dev/v1/companies/12345678") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies/12345678", headers={"Authorization": "Bearer YOUR_API_KEY"} )
const response = await fetch("https://api.govdata.dev/v1/companies/12345678", { headers: { "Authorization": "Bearer YOUR_API_KEY" } });
Response
{ "data": { "company_number": "12345678", "company_name": "ACME WIDGETS LTD", "company_status": "active", "company_type": "ltd", "date_of_creation": "2020-01-15", "date_of_cessation": null, "registered_office_address": { "address_line_1": "123 Test St", "locality": "London", "postal_code": "EC2R 6EA", "country": "United Kingdom" }, "sic_codes": [ { "code": "62012", "description": "Business and domestic software development" }, { "code": "62020", "description": "Information technology consultancy activities" } ], "accounts": { "next_due": "2027-01-15", "last_made_up_to": null }, "confirmation_statement": { "next_due": "2027-01-15" }, "jurisdiction": "england-wales", "uri": "/company/12345678" }, "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House", "source_url": "https://download.companieshouse.gov.uk" } }
Company Listing
/v1/companies
Waiting for request...
List and filter UK companies by status, SIC code, or postcode area.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
status |
string | No | Filter by status: active, dissolved |
sic_code |
string | No | Filter by SIC code (e.g., 62012) |
postcode |
string | No | Filter by postcode area (e.g., EC2R) |
page |
integer | No | Page number (default: 1) |
per_page |
integer | No | Results per page (default: 25, max: 100) |
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.govdata.dev/v1/companies?status=active&sic_code=62012"
uri = URI("https://api.govdata.dev/v1/companies?status=active&sic_code=62012") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies", headers={"Authorization": "Bearer YOUR_API_KEY"}, params={"status": "active", "sic_code": "62012"} )
const url = new URL("https://api.govdata.dev/v1/companies"); url.searchParams.set("status", "active"); url.searchParams.set("sic_code", "62012"); const response = await fetch(url, { headers: { "Authorization": "Bearer YOUR_API_KEY" } });
Response
{ "data": [ { "company_number": "12345678", "company_name": "ACME WIDGETS LTD", "company_status": "active", "company_type": "ltd", "date_of_creation": "2020-01-15", "registered_office_address": { "postal_code": "EC2R 6EA", "locality": "London" }, "sic_codes": ["62012", "62020"] } ], "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House", "source_url": "https://download.companieshouse.gov.uk" }, "pagination": { "total": 1, "page": 1, "per_page": 25, "total_pages": 1 } }
SIC Codes
/v1/companies/sic-codes
Waiting for request...
List all UK Standard Industrial Classification (SIC) codes. Optionally filter by section letter.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
section |
string | No | Filter by section letter (e.g., J for Information and Communication) |
page |
integer | No | Page number (default: 1) |
per_page |
integer | No | Results per page (default: 25, max: 100) |
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.govdata.dev/v1/companies/sic-codes?section=J"
uri = URI("https://api.govdata.dev/v1/companies/sic-codes?section=J") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies/sic-codes", headers={"Authorization": "Bearer YOUR_API_KEY"}, params={"section": "J"} )
const url = new URL("https://api.govdata.dev/v1/companies/sic-codes"); url.searchParams.set("section", "J"); const response = await fetch(url, { headers: { "Authorization": "Bearer YOUR_API_KEY" } });
Response
{ "data": [ { "code": "62011", "description": "Ready-made interactive leisure and entertainment software development", "section": "J" }, { "code": "62012", "description": "Business and domestic software development", "section": "J" }, { "code": "62020", "description": "Information technology consultancy activities", "section": "J" } ], "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House", "source_url": "https://download.companieshouse.gov.uk" }, "pagination": { "total": 3, "page": 1, "per_page": 25, "total_pages": 1 } }
/v1/companies/sic-codes/:code
Waiting for request...
Look up a specific SIC code and its description.
Parameters
| Parameter | Type | Description |
|---|---|---|
code |
string (path) | SIC code (e.g., 62012) |
curl -H "Authorization: Bearer YOUR_API_KEY" \ https://api.govdata.dev/v1/companies/sic-codes/62012
uri = URI("https://api.govdata.dev/v1/companies/sic-codes/62012") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies/sic-codes/62012", headers={"Authorization": "Bearer YOUR_API_KEY"} )
const response = await fetch("https://api.govdata.dev/v1/companies/sic-codes/62012", { headers: { "Authorization": "Bearer YOUR_API_KEY" } });
Response
{ "data": { "code": "62012", "description": "Business and domestic software development", "section": "J", "section_description": "Information and Communication" }, "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House", "source_url": "https://download.companieshouse.gov.uk" } }
Company Statistics
/v1/companies/statistics
No parameters required.
Waiting for request...
Aggregate statistics about UK companies. No parameters required.
curl -H "Authorization: Bearer YOUR_API_KEY" \ https://api.govdata.dev/v1/companies/statistics
uri = URI("https://api.govdata.dev/v1/companies/statistics") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies/statistics", headers={"Authorization": "Bearer YOUR_API_KEY"} )
const response = await fetch("https://api.govdata.dev/v1/companies/statistics", { headers: { "Authorization": "Bearer YOUR_API_KEY" } });
Response
{ "data": { "total_companies": 5200000, "by_status": { "active": 4800000, "liquidation": 350000, "in-administration": 50000 }, "by_type": { "ltd": 4200000, "plc": 7500, "llp": 65000 }, "incorporations_this_month": 45000, "incorporations_this_year": 520000, "data_as_of": "2026-02-01" }, "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House", "source_url": "https://download.companieshouse.gov.uk" } }
Company Financials
Coverage note: structured financial figures are currently extracted from a minority of filings (~3% of companies have revenue data); coverage is expanding as extraction improves.
/v1/companies/{company_number}/financials
Waiting for request...
Returns financial data extracted from iXBRL/XBRL accounts filings for a company. Includes revenue, profit, assets, liabilities, and more.
Path parameters
| Parameter | Type | Description |
|---|---|---|
company_number |
string | Companies House number (8 characters) |
limit |
integer | Max filings to return (default: 10, max: 50) |
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.govdata.dev/v1/companies/12345678/financials"
uri = URI("https://api.govdata.dev/v1/companies/12345678/financials") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies/12345678/financials", headers={"Authorization": "Bearer YOUR_API_KEY"} )
const response = await fetch( "https://api.govdata.dev/v1/companies/12345678/financials", { headers: { "Authorization": "Bearer YOUR_API_KEY" } } );
Example response
{ "data": { "company_number": "12345678", "company_name": "ACME WIDGETS LTD", "filings_count": 2, "filings": [ { "period_start": "2024-01-01", "period_end": "2024-12-31", "filing_type": "full", "accounting_standard": "FRS 102", "filed_at": "2025-03-15T10:00:00Z", "financials": { "revenue": 1250000.00, "cost_of_sales": 750000.00, "gross_profit": 500000.00, "profit_before_tax": 340000.00, "total_assets": 2000000.00, "net_assets": 1400000.00, "employees_count": 42 } } ] }, "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House" } }
Persons with Significant Control (PSC)
/v1/companies/{company_number}/psc
Waiting for request...
Returns Persons with Significant Control records for a company. Includes individual and corporate PSCs with their natures of control.
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.govdata.dev/v1/companies/12345678/psc"
uri = URI("https://api.govdata.dev/v1/companies/12345678/psc") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies/12345678/psc", headers={"Authorization": "Bearer YOUR_API_KEY"} )
const response = await fetch( "https://api.govdata.dev/v1/companies/12345678/psc", { headers: { "Authorization": "Bearer YOUR_API_KEY" } } );
Example response
{ "data": { "company_number": "12345678", "company_name": "ACME WIDGETS LTD", "psc_count": 1, "psc_records": [ { "psc_type": "individual", "kind": "individual-person-with-significant-control", "name": "John Smith", "nationality": "British", "country_of_residence": "United Kingdom", "natures_of_control": ["ownership-of-shares-75-to-100-percent"], "notified_on": "2020-01-15", "ceased_on": null } ] }, "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House" } }
PSC Changes Timeline
/v1/companies/{company_number}/psc/changes
Waiting for request...
Returns a chronological timeline of PSC (Persons with Significant Control) changes for a company — appointments and cessations ordered by date.
Parameters
| Parameter | Type | Description |
|---|---|---|
company_number |
string (path) | 8-digit Companies House number (e.g., 12345678) |
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.govdata.dev/v1/companies/12345678/psc/changes"
uri = URI("https://api.govdata.dev/v1/companies/12345678/psc/changes") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies/12345678/psc/changes", headers={"Authorization": "Bearer YOUR_API_KEY"} )
const response = await fetch( "https://api.govdata.dev/v1/companies/12345678/psc/changes", { headers: { "Authorization": "Bearer YOUR_API_KEY" } } );
Example response
{ "data": { "company_number": "12345678", "company_name": "ACME WIDGETS LTD", "total_events": 3, "events": [ { "event": "appointed", "date": "2020-01-15", "name": "John Smith", "psc_type": "individual", "natures_of_control": ["ownership-of-shares-75-to-100-percent"] }, { "event": "appointed", "date": "2023-06-01", "name": "Jane Doe", "psc_type": "individual", "natures_of_control": ["ownership-of-shares-25-to-50-percent"] }, { "event": "ceased", "date": "2024-03-15", "name": "John Smith", "psc_type": "individual" } ] }, "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House" } }
Company Comparison
/v1/companies/compare
Waiting for request...
Compare 2–10 companies side by side. Returns profile information and financial data (when available) for each company.
Request body
| Field | Type | Description |
|---|---|---|
company_numbers |
array | Array of 2–10 company numbers |
curl -X POST -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"company_numbers": ["12345678", "87654321"]}' \ "https://api.govdata.dev/v1/companies/compare"
uri = URI("https://api.govdata.dev/v1/companies/compare") req = Net::HTTP::Post.new(uri, "Content-Type" => "application/json") req["Authorization"] = "Bearer YOUR_API_KEY" req.body = { company_numbers: ["12345678", "87654321"] }.to_json res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.post( "https://api.govdata.dev/v1/companies/compare", headers={"Authorization": "Bearer YOUR_API_KEY"}, json={"company_numbers": ["12345678", "87654321"]} )
const response = await fetch("https://api.govdata.dev/v1/companies/compare", { method: "POST", headers: { "Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json" }, body: JSON.stringify({ company_numbers: ["12345678", "87654321"] }) });
Example response
{ "data": { "companies_compared": 2, "companies": [ { "company_number": "12345678", "company_name": "ACME WIDGETS LTD", "profile": { "company_status": "active", "company_type": "ltd", "age_years": 6, "sic_codes": [{"code": "62012", "description": "Business and domestic software development"}] }, "financials": { "revenue": 1250000.00, "profit_before_tax": 340000.00, "total_assets": 2000000.00 } } ] }, "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House" } }
Industry Benchmarks
Coverage note: structured financial figures are currently extracted from a minority of filings (~3% of companies have revenue data); coverage is expanding as extraction improves.
By SIC Code
/v1/companies/benchmarks/{sic_code}
Waiting for request...
Returns aggregate financial statistics for all companies in a SIC sector. Includes median, mean, 25th and 75th percentile for key financial metrics including directors’ remuneration.
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.govdata.dev/v1/companies/benchmarks/62012"
response = requests.get( "https://api.govdata.dev/v1/companies/benchmarks/62012", headers={"Authorization": "Bearer YOUR_API_KEY"} )
Company vs Industry
/v1/companies/{company_number}/benchmark
Waiting for request...
Compare a company’s financials against its industry sector. Returns the company’s latest financials, industry benchmarks, and estimated percentile rankings.
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.govdata.dev/v1/companies/12345678/benchmark"
response = requests.get( "https://api.govdata.dev/v1/companies/12345678/benchmark", headers={"Authorization": "Bearer YOUR_API_KEY"} )
Example response
{ "data": { "company_number": "12345678", "company_name": "ACME WIDGETS LTD", "sic_code": "62012", "sic_description": "Business and domestic software development", "company_financials": { "revenue": 1250000.00, "profit_before_tax": 340000.00 }, "industry_benchmarks": { "revenue": {"median": 500000.00, "mean": 750000.00, "p25": 200000.00, "p75": 1000000.00}, "profit_before_tax": {"median": 100000.00, "mean": 150000.00, "p25": 30000.00, "p75": 250000.00}, "directors_remuneration": {"median": 120000.00, "mean": 150000.00, "p25": 60000.00, "p75": 220000.00} }, "percentile_rankings": {"revenue": 78, "profit_before_tax": 82, "directors_remuneration": 65} }, "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House" } }
Ownership Network
/v1/companies/{company_number}/network
Waiting for request...
Maps the ownership network of a company using PSC (Persons with Significant Control) data. Shows who controls the company and what other companies those same individuals control — useful for due diligence and relationship mapping.
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.govdata.dev/v1/companies/12345678/network"
uri = URI("https://api.govdata.dev/v1/companies/12345678/network") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies/12345678/network", headers={"Authorization": "Bearer YOUR_API_KEY"} )
const response = await fetch( "https://api.govdata.dev/v1/companies/12345678/network", { headers: { "Authorization": "Bearer YOUR_API_KEY" } } );
Example response
{ "data": { "company_number": "12345678", "company_name": "ACME WIDGETS LTD", "psc_count": 1, "controllers": [ { "name": "John Smith", "psc_type": "individual", "nationality": "British", "natures_of_control": ["ownership-of-shares-75-to-100-percent"] } ], "related_companies": [ { "controller_name": "John Smith", "companies": [ { "company_number": "99887766", "company_name": "SMITH HOLDINGS LTD", "company_status": "active" }, { "company_number": "55443322", "company_name": "JS CONSULTING LTD", "company_status": "active" } ] } ], "network_size": 3 }, "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House" } }
Filing Status
/v1/companies/{company_number}/filing-status
Waiting for request...
Check a company's filing compliance status. Returns whether accounts are overdue, due soon, or up to date, along with due dates and latest filing details.
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.govdata.dev/v1/companies/12345678/filing-status"
uri = URI("https://api.govdata.dev/v1/companies/12345678/filing-status") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies/12345678/filing-status", headers={"Authorization": "Bearer YOUR_API_KEY"} )
const response = await fetch( "https://api.govdata.dev/v1/companies/12345678/filing-status", { headers: { "Authorization": "Bearer YOUR_API_KEY" } } );
Compliance statuses
| Status | Description |
|---|---|
up_to_date | Accounts filed, next due date is 30+ days away |
due_soon | Next filing due within 30 days |
overdue | Filing is past its due date |
not_applicable | Company is dissolved or inactive |
unknown | No due date available |
Example response
{ "data": { "company_number": "12345678", "company_name": "ACME WIDGETS LTD", "company_status": "active", "compliance_status": "up_to_date", "accounts_next_due": "2027-01-15", "accounts_last_made_up_to": "2025-01-15", "confirmation_next_due": "2027-01-15", "days_until_due": 312, "days_since_last_filing": 418, "is_overdue": false, "latest_filing": { "period_end": "2025-01-15", "filing_type": "full", "has_financials": true } }, "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House" } }
Financial Trends
Coverage note: structured financial figures are currently extracted from a minority of filings (~3% of companies have revenue data); coverage is expanding as extraction improves.
/v1/companies/{company_number}/trends
Waiting for request...
Year-over-year financial trends for a company. Returns time series of revenue, profit, assets, and employees across all filed accounts, with absolute and percentage changes between consecutive periods.
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.govdata.dev/v1/companies/12345678/trends"
uri = URI("https://api.govdata.dev/v1/companies/12345678/trends") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies/12345678/trends", headers={"Authorization": "Bearer YOUR_API_KEY"} )
const response = await fetch( "https://api.govdata.dev/v1/companies/12345678/trends", { headers: { "Authorization": "Bearer YOUR_API_KEY" } } );
Example response
{ "data": { "company_number": "12345678", "company_name": "ACME WIDGETS LTD", "periods_count": 3, "periods": [ { "period_end": "2023-01-15", "filing_type": "full", "metrics": { "revenue": 500000.00, "profit_before_tax": 50000.00, "total_assets": 200000.00 } }, { "period_end": "2024-01-15", "filing_type": "full", "metrics": { "revenue": 600000.00, "profit_before_tax": 72000.00, "total_assets": 250000.00 } }, { "period_end": "2025-01-15", "filing_type": "full", "metrics": { "revenue": 680000.00, "profit_before_tax": 85000.00, "total_assets": 310000.00 } } ], "trends": [ { "from": "2023-01-15", "to": "2024-01-15", "changes": { "revenue": { "absolute": 100000.00, "percentage": 20.0 }, "profit_before_tax": { "absolute": 22000.00, "percentage": 44.0 } } }, { "from": "2024-01-15", "to": "2025-01-15", "changes": { "revenue": { "absolute": 80000.00, "percentage": 13.3 }, "profit_before_tax": { "absolute": 13000.00, "percentage": 18.1 } } } ] }, "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House" } }
Financial Health Score
Coverage note: structured financial figures are currently extracted from a minority of filings (~3% of companies have revenue data); coverage is expanding as extraction improves.
/v1/companies/{company_number}/health
Waiting for request...
Financial health assessment based on the latest filing. Calculates key ratios (current ratio, debt-to-equity, profit margin, ROA, cash ratio) and rates each as green, amber, or red.
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.govdata.dev/v1/companies/12345678/health"
uri = URI("https://api.govdata.dev/v1/companies/12345678/health") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies/12345678/health", headers={"Authorization": "Bearer YOUR_API_KEY"} )
const response = await fetch( "https://api.govdata.dev/v1/companies/12345678/health", { headers: { "Authorization": "Bearer YOUR_API_KEY" } } );
Health signals
| Signal | Description |
|---|---|
green | Healthy — ratio within normal range |
amber | Caution — ratio warrants attention |
red | Concern — ratio outside healthy range |
Example response
{ "data": { "company_number": "12345678", "company_name": "ACME WIDGETS LTD", "period_end": "2025-01-15", "health": { "current_ratio": { "value": 2.1, "signal": "green", "label": "Current Ratio" }, "debt_to_equity": { "value": 0.4, "signal": "green", "label": "Debt to Equity" }, "profit_margin": { "value": 12.5, "signal": "green", "label": "Profit Margin %" }, "return_on_assets": { "value": 8.3, "signal": "amber", "label": "Return on Assets %" }, "cash_ratio": { "value": 0.6, "signal": "green", "label": "Cash Ratio" } } }, "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House" } }
Sector Analytics
/v1/companies/sectors/{sic_code}/analytics
Waiting for request...
Sector-level analytics for a given SIC code. Returns company counts, active/inactive breakdown, incorporation trends, and financial benchmarks (when available).
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.govdata.dev/v1/companies/sectors/62012/analytics"
uri = URI("https://api.govdata.dev/v1/companies/sectors/62012/analytics") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies/sectors/62012/analytics", headers={"Authorization": "Bearer YOUR_API_KEY"} )
const response = await fetch( "https://api.govdata.dev/v1/companies/sectors/62012/analytics", { headers: { "Authorization": "Bearer YOUR_API_KEY" } } );
Example response
{ "data": { "sic_code": "62012", "sic_description": "Business and domestic software development", "sic_section": "J", "company_count": 45230, "active_count": 38100, "by_status": { "active": 38100, "liquidation": 240, "in-administration": 12 }, "incorporations": { "this_year": 1850, "last_year": 4120 }, "financial_benchmarks": { "median_revenue": 285000.00, "median_profit_margin": 15.2, "median_total_assets": 180000.00 }, "filing_count": 12500, "benchmark_calculated_at": "2026-03-01T00:00:00Z" }, "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House" } }
Geographic Data
/v1/companies/geography/{postcode_prefix}
Waiting for request...
Company statistics for a UK postcode area. Returns company counts, active/inactive breakdown, top industries, and incorporation trends.
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.govdata.dev/v1/companies/geography/EC2"
uri = URI("https://api.govdata.dev/v1/companies/geography/EC2") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies/geography/EC2", headers={"Authorization": "Bearer YOUR_API_KEY"} )
const response = await fetch( "https://api.govdata.dev/v1/companies/geography/EC2", { headers: { "Authorization": "Bearer YOUR_API_KEY" } } );
Example response
{ "data": { "postcode_prefix": "EC2", "company_count": 28500, "active_count": 21200, "by_status": { "active": 21200, "liquidation": 200, "in-administration": 15 }, "top_sic_codes": [ { "code": "64209", "description": "Activities of other holding companies", "count": 3200 }, { "code": "70229", "description": "Management consultancy activities", "count": 2100 }, { "code": "62012", "description": "Business and domestic software development", "count": 1800 } ], "incorporations": { "this_year": 920, "last_year": 2340 } }, "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House" } }
Company Timeline
/v1/companies/{company_number}/timeline
Waiting for request...
Chronological timeline of key events: incorporation, account filings, PSC changes (notifications and cessations), and company cessation.
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.govdata.dev/v1/companies/12345678/timeline"
uri = URI("https://api.govdata.dev/v1/companies/12345678/timeline") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies/12345678/timeline", headers={"Authorization": "Bearer YOUR_API_KEY"} )
const response = await fetch( "https://api.govdata.dev/v1/companies/12345678/timeline", { headers: { "Authorization": "Bearer YOUR_API_KEY" } } );
Event types
| Type | Description |
|---|---|
incorporation | Company was registered |
accounts_filed | Annual accounts submitted |
psc_notified | Person with Significant Control notified |
psc_ceased | Person with Significant Control ceased |
cessation | Company dissolved or struck off |
Example response
{ "data": { "company_number": "12345678", "company_name": "ACME WIDGETS LTD", "event_count": 5, "events": [ { "date": "2025-01-15", "type": "accounts_filed", "description": "Full accounts filed for period ending 2025-01-15", "details": { "filing_type": "full", "has_financials": true } }, { "date": "2024-01-15", "type": "accounts_filed", "description": "Full accounts filed for period ending 2024-01-15", "details": { "filing_type": "full", "has_financials": true } }, { "date": "2020-01-15", "type": "psc_notified", "description": "John Smith notified as individual PSC", "details": { "name": "John Smith", "psc_type": "individual" } }, { "date": "2020-01-15", "type": "incorporation", "description": "Company incorporated as LTD" } ] }, "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House" } }
Recent Filings Feed
/v1/companies/recent-filings
Waiting for request...
Paginated feed of recently filed company accounts. Filter by filing type, industry (SIC code), or date range.
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.govdata.dev/v1/companies/recent-filings?filing_type=full"
uri = URI("https://api.govdata.dev/v1/companies/recent-filings?filing_type=full") req = Net::HTTP::Get.new(uri) req["Authorization"] = "Bearer YOUR_API_KEY" res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
response = requests.get( "https://api.govdata.dev/v1/companies/recent-filings", headers={"Authorization": "Bearer YOUR_API_KEY"}, params={"filing_type": "full"} )
const response = await fetch( "https://api.govdata.dev/v1/companies/recent-filings?filing_type=full", { headers: { "Authorization": "Bearer YOUR_API_KEY" } } );
Example response
{ "data": [ { "company_number": "12345678", "barcode": "ABC123XYZ", "period_end": "2025-12-31", "filing_type": "full", "has_financials": true, "filed_at": "2026-03-05T14:30:00Z" } ], "pagination": { "total": 500000, "page": 1, "per_page": 25, "total_pages": 20000 }, "meta": { "api_version": "v1", "licence": "Open Government Licence v3.0", "source": "Companies House" } }
ICO Registrations
Search the daily ICO register of data-protection fee payers for compliance checks, supplier onboarding, and verification of a known registration reference. Search accepts an organisation-name prefix, postcode area, payment tier, or company number; the current source does not publish company numbers, so that filter will only become useful if the source adds them.
/v1/companies/ico-registrations
Waiting for request...
Query parameters
| name | type | required | default | description |
|---|---|---|---|---|
name | string | No* | — | Case-insensitive organisation-name prefix. |
postcode_area | string | No* | — | One- or two-letter UK postcode area. |
tier | string | No* | — | Exact source value: Tier 1, Tier 2, or Tier 3. |
company_number | string | No* | — | Exact source-provided number; currently absent from the dataset. |
page | integer | No | 1 | Results page. |
per_page | integer | No | 25 | Results per page, maximum 100. |
*At least one search filter is required. Use GET /v1/companies/ico-registrations/:registration_number for an exact registration lookup.
curl -H "Authorization: Bearer YOUR_API_KEY" "https://api.govdata.dev/v1/companies/ico-registrations?name=Emma&postcode_area=DN"
uri = URI("https://api.govdata.dev/v1/companies/ico-registrations?name=Emma&postcode_area=DN")\nreq = Net::HTTP::Get.new(uri)\nreq["Authorization"] = "Bearer YOUR_API_KEY"\nNet::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
requests.get("https://api.govdata.dev/v1/companies/ico-registrations", headers={"Authorization": "Bearer YOUR_API_KEY"}, params={"name": "Emma", "postcode_area": "DN"})
await fetch("https://api.govdata.dev/v1/companies/ico-registrations?name=Emma&postcode_area=DN", { headers: { Authorization: "Bearer YOUR_API_KEY" } });
Captured response
{"data":[{"registration_number":"ZA081809","organisation_name":"Emma Housham Limited","organisation_address":"17 Old Trent Road, Beckingham, South Yorkshire","organisation_postcode":"DN10 4PY","postcode_area":"DN","company_number":null,"tier":"Tier 1","registered_on":"2014-10-24","expires_on":"2026-10-23","public_authority":false,"dpo_details_published":false,"dpo_name_published":false,"trading_names":"Trent Valley Childrens Physiotherapy|Physio4kids.|","public_register_url":"https://ico.org.uk/ESDWebPages/Entry/ZA081809"}],"meta":{"api_version":"v1","licence":"Open Government Licence v3.0","source":"Information Commissioner's Office","source_url":"https://ico.org.uk/about-the-ico/what-we-do/register-of-fee-payers/download-the-register/"},"pagination":{"total":1,"page":1,"per_page":25,"total_pages":1}}
dpo_*_published indicates whether the source exposes DPO fields; GovData does not redistribute the personal contact values. Trading names retain the source's pipe delimiters.
Errors
{"error":{"code":"missing_parameter","message":"Provide at least one search filter.","documentation_url":"https://docs.govdata.dev/errors/missing_parameter"}}
{"error":{"code":"not_found","message":"ICO registration not found.","documentation_url":"https://docs.govdata.dev/errors/not_found"}}
400 applies when no search filter is supplied; 404 applies to an unknown exact reference. No 422 case currently applies because tier is a source string rather than a closed API enum.
Data notes
UK-wide current fee-payer registrations, refreshed daily by the ICO. The 9 August 2026 extract contained 1,433,320 records. Re-use is under the Open Government Licence, but the ICO states that the licence does not apply to personal data. The extract has no company number, so GovData performs no name-based or fuzzy Companies House join. Registration publication can lag payment or changes by up to two working days.
Business Demography
Returns official annual enterprise births, deaths, active counts, and cohort survival rates by coded UK geography. Use it to compare local business formation, attrition, and resilience or add an official baseline to an area profile.
/v1/companies/demography
Waiting for request...
| name | type | required | default | description |
|---|---|---|---|---|
geography | string | No | — | ONS geography-code prefix. |
name_prefix | string | No | — | Literal, case-insensitive geography-name prefix. |
from_year | integer | No | 2019 | Inclusive lower year. |
to_year | integer | No | 2024 | Inclusive upper year. |
page | integer | No | 1 | Results page. |
per_page | integer | No | 25 | Results per page, maximum 100. |
curl -H "Authorization: Bearer YOUR_API_KEY" "https://api.govdata.dev/v1/companies/demography?geography=E12&from_year=2024"
Net::HTTP.get(URI("https://api.govdata.dev/v1/companies/demography?geography=E12&from_year=2024"))
requests.get("https://api.govdata.dev/v1/companies/demography", params={"geography": "E12", "from_year": 2024}, headers={"Authorization": "Bearer YOUR_API_KEY"})
await fetch("https://api.govdata.dev/v1/companies/demography?geography=E12&from_year=2024", {headers: {Authorization: "Bearer YOUR_API_KEY"}});
Captured response
{"data":[{"geography_code":"E12000001","geography_name":"NORTH EAST","year":2024,"births":9030,"deaths":7850,"active_enterprises":76590,"survival_rates":{"1_year":null,"2_year":null,"3_year":null,"4_year":null,"5_year":null}}],"meta":{"source":"Office for National Statistics","source_url":"https://www.ons.gov.uk/businessindustryandtrade/business/activitysizeandlocation/datasets/businessdemographyreferencetable","api_version":"v1","licence":"Open Government Licence v3.0"},"pagination":{"total":1,"page":1,"per_page":25,"total_pages":1}}
Survival fields belong to the birth-cohort year; later rates remain null until the cohort reaches that anniversary.
Errors
{"error":{"code":"not_found","message":"Record not found","documentation_url":"https://docs.govdata.dev/errors/not_found"}}
400 and 422 are not applicable because filters are optional and open-valued. An unknown /demography/:geography_code/:year returns this 404 envelope.
Data notes
Coverage is 2019–2024 across UK countries, regions, counties, unitary authorities, and districts: 2,532 geography-year observations in the amended 2024 workbook. Updated annually, usually in November. ONS, OGL v3.0. Counts are control-rounded to base 5, boundaries vary between years, and industry-only tables are excluded because they have no geography code.
IPO Trade Marks
Search active records in the IPO’s 2018 domestic and international open-data snapshots, or retrieve one mark by application number. Use this for historical brand due diligence, proprietor research, and Nice-class portfolio discovery; it is not a current-register substitute.
/v1/companies/trademarks
Waiting for request...
| name | type | required | default | description |
|---|---|---|---|---|
mark_text | string | Conditional | — | Case-insensitive literal prefix; % and _ are not wildcards. |
proprietor | string | Conditional | — | Case-insensitive proprietor-name prefix. |
class | integer | Conditional | — | Nice class, 1–45. |
status | string | Conditional | — | Exact source status. |
company_number | string | Conditional | — | Exact Companies House number when supplied; absent from these extracts. |
page | integer | No | 1 | Results page. |
per_page | integer | No | 25 | Results per page, maximum 100. |
At least one search filter is required. GET /v1/companies/trademarks/:application_number performs an exact lookup.
curl -H "Authorization: Bearer YOUR_API_KEY" "https://api.govdata.dev/v1/companies/trademarks?mark_text=BASS&class=32"
uri = URI("https://api.govdata.dev/v1/companies/trademarks?mark_text=BASS&class=32")\nreq = Net::HTTP::Get.new(uri)\nreq["Authorization"] = "Bearer YOUR_API_KEY"\nNet::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
requests.get("https://api.govdata.dev/v1/companies/trademarks", params={"mark_text": "BASS", "class": 32}, headers={"Authorization": "Bearer YOUR_API_KEY"})
await fetch("https://api.govdata.dev/v1/companies/trademarks?mark_text=BASS&class=32", {headers: {Authorization: "Bearer YOUR_API_KEY"}});
Reset-database captured response
{"data":[{"application_number":"UK00000000001","registration_number":"UK00000000001","mark_text":"BASS & Co's PALE ALE","status":"Registered","classes":[32],"filed_on":"1876-01-01","registered_on":"1876-01-01","expires_on":null,"proprietor_name":"Pioneer Brewing Company Limited","company_number":null,"public_register_url":"http://www.ipo.gov.uk/tmcase/Results/1/UK00000000001","source_extract":"domestic"}],"meta":{"api_version":"v1","licence":"Open Government Licence v3.0","source":"Intellectual Property Office","source_url":"https://www.gov.uk/government/publications/ipo-trade-mark-data-release"},"pagination":{"total":1,"page":1,"per_page":25,"total_pages":1}}
classes contains Nice Classification numbers. Registration number is populated only for registered/protected records; company_number remains null because the source does not carry one.
Errors
{"error":{"code":"missing_parameter","message":"Provide at least one search filter.","documentation_url":"https://docs.govdata.dev/errors/missing_parameter"}}
{"error":{"code":"not_found","message":"Trade mark not found.","documentation_url":"https://docs.govdata.dev/errors/not_found"}}
400 applies without a search filter and 404 to an unknown exact number. 422 is not applicable because source status values are open strings.
Data notes
UK domestic and WIPO international registrations under OGL v3.0. The files are UTF-16LE pipe-delimited ZIP snapshots (63,238,846 and 6,155,443 bytes) last updated 13 February 2018, with coverage cut off at 31 August 2016 for new filings. Only registered/protected and pending statuses are loaded; dead, expired, refused, withdrawn, cancelled and other inactive rows are deferred. The publisher states no continuing cadence. Owner content can break physical lines and multi-owner marks repeat; malformed rows are rejected and exact application-number upserts retain one published proprietor. Always verify live status in the IPO register.
Company data is sourced from the Companies House bulk data product and updated monthly. Financial data is extracted from iXBRL/XBRL accounts filings and updated daily. Contains public sector information licensed under the Open Government Licence v3.0.
Data Coverage
| Source | Companies House |
| Date range | Active companies register (14 statuses, including active, liquidation, and in-administration); dissolved companies are not yet ingested |
| Records | ~5.9M companies |
| Updated | Monthly full snapshot, daily accounts filings |
| Limitations | Filings span 2009–present with no year cutoff. Structured financial figures are currently extracted from a minority of filings (~3% of companies have revenue data); coverage is expanding as extraction improves. |