Gov APIfind-and-update.company-information.service.gov.uk ↗
Access UK company profiles, filing histories, officers, and charges from Companies House via 7 structured endpoints. Filter by SIC code, status, type, and more.
What is the Gov API?
This API provides structured access to UK company data from Companies House across 7 endpoints, covering everything from basic company profiles to registered charges and filing histories. The get_company_profile endpoint returns incorporation date, SIC codes, registered address, and company status by registration number, while get_companies_with_charges_by_lender lets you cross-reference lenders against charge records across multiple companies in a single call.
curl -X GET 'https://api.parse.bot/scraper/0dc760ec-e863-4883-a169-6da8969b8b7e/search?page=1&type=all&query=Tesco' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace find-and-update-company-information-service-gov-uk-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Companies House SDK — search, profile, filings, charges."""
from parse_apis.companies_house_api import CompaniesHouse, SearchType, CompanyNotFound
client = CompaniesHouse()
# Search across all entity types (companies + officers) with enum filter.
for result in client.searchresults.search(query="Tesco", type=SearchType.COMPANIES, limit=3):
print(result.name, result.company_number, result.address)
# Fetch a full company profile by registration number.
company = client.companies.get(company_number="00445790")
print(company.company_name, company.status, company.incorporation_date)
# Drill into sub-resources: filings, officers, charges — each bounded.
for filing in company.filings.list(limit=3):
print(filing.date, filing.type, filing.description[:60])
for officer in company.officers.list(limit=3):
print(officer.name, officer.role, officer.appointed_on)
# Advanced search with status filter, then navigate to detail.
summary = client.companies.search(name="Tesco", status="active", limit=1).first()
if summary:
detail = summary.details()
print(detail.company_name, detail.company_type, detail.address)
# Typed error handling for a non-existent company.
try:
client.companies.get(company_number="99999999")
except CompanyNotFound as exc:
print(f"Company not found: {exc.company_number}")
print("exercised: searchresults.search / companies.get / filings.list / officers.list / companies.search / details")
Search for companies by name, number, or officer name. Returns paginated results mixing company and officer entries. Pagination via page number; each page holds up to 20 results.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| type | string | Search type filter. |
| queryrequired | string | Search keyword (company name, number, or officer name). |
{
"type": "object",
"fields": {
"page": "integer, current page number",
"type": "string, search type used",
"query": "string, the search query used",
"results": "array of search result objects containing name, type, url, and type-specific fields"
},
"sample": {
"data": {
"page": 1,
"type": "all",
"query": "Tesco",
"results": [
{
"url": "/company/00445790",
"name": "TESCO PLC",
"type": "company",
"status": "",
"address": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA",
"company_number": "00445790",
"incorporation_date": ""
}
]
},
"status": "success"
}
}About the Gov API
Company Search and Profiles
The search endpoint accepts a query string and an optional type parameter (all, companies, officers, disqualified-officers) to filter results. Each result includes a name, type, url, and type-specific fields such as company_number or officer_id. For more targeted lookups, advanced_search_companies supports filtering by company_name_includes, company_status, company_type, sic_codes, and registered_office_address, returning an array of objects with company_name, company_number, status, and type.
The get_company_profile endpoint takes a company_number (leading zeros preserved, e.g. 00445790) and returns the full registered profile: company_name, address, status, company_type, incorporation_date, and an array of sic_codes where available. This is the canonical starting point for any per-company data pipeline.
Filings, Officers, and Charges
get_company_filing_history returns a paginated list of filings for a given company, each with a date, type code, and plain-text description. An optional category parameter narrows results to a specific filing category. get_company_officers returns the current officer list with name, address, role, and appointed_on per officer — useful for building director networks or compliance checks.
get_company_charges returns all registered charges (mortgages and secured lending) against a company, including charge_code, created_date, delivered_date, status, persons_entitled, and a description. The get_companies_with_charges_by_lender endpoint goes further: given a lender_name, it searches for companies and filters their charge records for a matching entry in persons_entitled, returning company_name, company_number, and the full matching_charges array. An optional search_query parameter overrides the default company search term.
The Gov API is a managed, monitored endpoint for find-and-update.company-information.service.gov.uk — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when find-and-update.company-information.service.gov.uk changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official find-and-update.company-information.service.gov.uk API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a due diligence tool that pulls company status, incorporation date, and SIC codes before a contract is signed.
- Monitor filing history for a portfolio of companies to detect annual return submissions or director changes.
- Map director networks by querying
get_company_officersacross multiple company numbers and joining on officer names. - Identify all companies with charges held by a specific bank or lender using
get_companies_with_charges_by_lender. - Screen for dissolved or inactive companies in a supplier list using
advanced_search_companieswith acompany_statusfilter. - Aggregate SIC code distributions across a set of companies for sector-level analysis.
- Verify registered office addresses by comparing
get_company_profileoutput against self-reported contact data.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Companies House have an official developer API?+
What does `get_company_charges` return, and how does it differ from `get_companies_with_charges_by_lender`?+
get_company_charges takes a single company_number and returns all charge records for that company, including charge_code, created_date, delivered_date, status, persons_entitled, and description. get_companies_with_charges_by_lender works in the opposite direction: you supply a lender_name and it searches across multiple companies, returning only those whose charge records contain that lender in the persons_entitled field, along with the matching charge details.Does the API return resigned or historical officers?+
get_company_officers returns the current officer list as it appears on the Companies House record. Historical or resigned officers are not currently included in the response. You can fork this API on Parse and revise it to add a resigned-officers endpoint if your use case requires appointment history.How does pagination work across endpoints that support it?+
search, advanced_search_companies, and get_company_filing_history endpoints accept an integer page parameter. Each response echoes back the current page value alongside the result array. There is no explicit total-count or next-page URL field in the response, so iteration requires incrementing the page number until an empty results array is returned.