Companies House financial data API: how to get UK company accounts as JSON
What the Companies House API returns, and what it does not
The Companies House public API returns register data and filing metadata, not accounts figures. You get the company profile, officers, persons with significant control, charges and the filing history, all as JSON. For accounts, the filing history gives you the type, the made-up date and a link to the Document API. The numbers themselves stay inside the document.
Here is a real filing history item for TESCO PLC (00445790), requested on 17 October 2026 with category=accounts:
{
"type": "AA",
"date": "2026-07-25",
"description": "accounts-with-accounts-type-group",
"description_values": { "made_up_date": "2026-02-28" },
"pages": 236,
"paper_filed": true,
"links": {
"document_metadata": "https://document-api.company-information.service.gov.uk/document/-uIFIZvVQM2_WxuNYmjA10Fv96C0Yuxb-wNWhAqNezY"
}
}
That is 236 pages of group accounts, available as a PDF. There is no net_assets field anywhere in the response. For a small company the same call leads to a document that is often available in two formats, and one of them is machine-readable.
Three ways to get the figures
You have three realistic routes, and the right one depends on how many companies you need and how fresh the data must be.
| Route | Best for | Cost | Work on your side |
|---|---|---|---|
| Companies House API plus Document API, parse yourself | A few hundred companies, on demand | Free | iXBRL parser, rate limiting, PDF fallback |
| Free bulk accounts files | The whole population, analytics | Free | Download about 2 GB a month, parse, store, deduplicate |
| Hosted API such as ours | Lookups in apps and AI agents, history since 2008 | Free tier, then paid | One HTTP call |
Route 1: Companies House API and the Document API
The Document API serves the original accounts file, and for electronically filed accounts it usually offers an application/xhtml+xml version, which is iXBRL. You need a free API key from the Companies House developer hub. Authentication is HTTP Basic with the key as the username and an empty password.
- Get the filing history with
category=accountsand takelinks.document_metadatafrom the item you want. - Fetch the metadata. The
resourcesobject lists the formats available. - Request
/contentwithAccept: application/xhtml+xml. The API answers with a 302 redirect to a signed storage URL that expires after 60 seconds.
import requests
KEY = "your-companies-house-api-key"
API = "https://api.company-information.service.gov.uk"
s = requests.Session()
s.auth = (KEY, "")
history = s.get(f"{API}/company/10623966/filing-history",
params={"category": "accounts", "items_per_page": 1}).json()
meta_url = history["items"][0]["links"]["document_metadata"]
meta = s.get(meta_url).json()
print(meta["resources"].keys())
# dict_keys(['application/pdf', 'application/xhtml+xml'])
if "application/xhtml+xml" in meta["resources"]:
doc = s.get(meta_url + "/content", headers={"Accept": "application/xhtml+xml"})
open("accounts.xhtml", "wb").write(doc.content)
requests follows the redirect and drops the Authorization header when the host changes, which is what the storage URL expects. If application/xhtml+xml is missing, the accounts exist only as a PDF (often a paper filing scanned by Companies House), and you need OCR or a person to read them.
You now have an iXBRL file. The hard part is turning it into correct numbers: each file holds this year and last year, plus breakdowns by share class or creditor maturity. Our guide to parsing iXBRL accounts in Python has a parser that handles this. Mind the 600 requests per five minutes limit: each company costs three calls on this route.
Route 2: the free bulk accounts files
Companies House publishes every electronically filed set of accounts as free ZIP files: a daily file (Tuesday to Saturday, kept for 60 days), monthly files for the last 12 months and historic archives back to 2008. Recent monthly files are 1.8 to 4.1 GB each. This route is right when you need statistics across many companies or want to build your own database.
Expect real engineering. You need the same parser as Route 1, storage for tens of millions of files, handling of amended accounts that arrive later for the same period, and a daily job to keep up. See Companies House bulk data explained for every product, size and schedule.
Route 3: a hosted API with figures already parsed
A hosted API skips both routes: you send a company number and get the balance sheet back. Ours, UK Company Data, is built on about 37 million iXBRL accounts filed from 2008 to 2026, covering about 7 million companies. About 70% of active companies have at least one machine-readable filing in it.
Get a free key (50 requests a month, no card) on the developer docs page, then call the endpoints below. Send the key as Authorization: Bearer YOUR_KEY.
Find a company by name
curl -H "Authorization: Bearer YOUR_KEY" \
"https://data.globalmindsetmarketing.co.uk/v1/search-by-name?name=tesco&limit=3"
The search covers the whole register, puts exact name matches and active companies first, and returns company numbers.
Get the register record and latest accounts
curl -H "Authorization: Bearer YOUR_KEY" \
"https://data.globalmindsetmarketing.co.uk/v1/company?number=10623966"
Watch companies and read alerts
curl -X POST -H "Authorization: Bearer YOUR_KEY" -H "Content-Type: application/json" \
-d '{"company_numbers":["10623966","00445790"]}' \
"https://data.globalmindsetmarketing.co.uk/v1/watchlist/add"
curl -H "Authorization: Bearer YOUR_KEY" \
"https://data.globalmindsetmarketing.co.uk/v1/alerts"
Alerts cover status changes (liquidation, administration, strike-off), overdue accounts, new accounts, new charges, negative net assets and falls of 30% or more in net assets or cash between the last two filings.
What the response looks like
Add format=json to /v1/company, /v1/search-by-name or /v1/alerts to get one JSON field per figure. Abridged response for /v1/company?number=10623966&format=json:
{
"company": {
"company_number": "10623966",
"name": "TESCONS LTD",
"status": "Active",
"type": "Private Limited Company",
"incorporated": "2017-02-16",
"accounts": { "category": "TOTAL EXEMPTION FULL", "last_made_up_to": "2025-05-31", "next_due": "2027-02-28" }
},
"accounts": [
{
"balance_sheet_date": "2025-05-31",
"figures": { "net_assets": 183, "equity": 183, "cash": null, "creditors": null }
}
],
"source": "Companies House register and iXBRL accounts bulk data, Open Government Licence v3.0"
}
Companies that file PDF-only accounts, such as TESCO PLC, return an empty accounts array. Field names follow the wording of the accounts: total_assets_less_current_liabilities and creditors are reported as filed, not as total assets and total liabilities. Values are in pounds; a field is null when the company did not file it. In Python:
import requests
r = requests.get(
"https://data.globalmindsetmarketing.co.uk/v1/company",
params={"number": "10623966", "format": "json"},
headers={"Authorization": "Bearer YOUR_KEY"},
timeout=30,
)
r.raise_for_status()
for acc in r.json()["accounts"]:
print(acc["balance_sheet_date"], acc["figures"].get("net_assets"), acc["figures"].get("cash"))
Without format=json, every endpoint returns the same shape as an MCP tool result: a content array whose first item holds the answer as Markdown text with tables, ready to show to a user or pass to a language model.
The same data is available to Claude, ChatGPT and Cursor through our Companies House MCP server, where the model reads the Markdown directly.
Fields and coverage
The parser reads the main FRS 102 and FRS 105 balance sheet tags plus their older UK GAAP equivalents. What you get depends on what the company chose to file.
| Field | Main iXBRL tags | Notes |
|---|---|---|
| Net assets | NetAssetsLiabilities | Equals equity in a correctly parsed balance sheet |
| Total assets less current liabilities | TotalAssetsLessCurrentLiabilities | Shown on most UK balance sheet formats |
| Cash | CashBankOnHand, CashBankInHand | Older filings use the UK GAAP name |
| Debtors, creditors | Debtors, Creditors, CreditorsDueWithinOneYear | Creditors are often split by maturity with a dimension |
| Employees | AverageNumberEmployeesDuringPeriod | A note, not a balance sheet line |
| Turnover, profit | TurnoverRevenue, ProfitLoss | Missing when the profit and loss account is not filed |
Most UK companies do not publish a profit and loss account. Micro-entity accounts were the last filing type of 32.4% of active companies on 1 October 2026, and those balance sheets carry no turnover. See UK companies by accounts type for the full split.
Known gaps
- PDF-only filers. Large groups and paper filers are not in iXBRL data. TESCO PLC is an example: its 2026 group accounts are a 236-page PDF.
- No accounts yet. 26.0% of active companies had not filed any accounts on 1 October 2026, mostly because they are new.
- As filed. Figures are what the company filed. Errors in the original filing stay in the data, and restated comparatives are not merged back.
Limits and pricing
The free key gives 50 requests a month; each REST call or MCP tool call counts as one. API Pro is £39 a month for 5,000 requests and a 50-company watchlist. Over the quota the API returns 429, and quotas reset on the 1st of each month (UTC). Details are on the pricing page.
FAQ
Does the Companies House API return turnover or net assets?
No. The Companies House API returns profiles, officers, PSCs, charges and filing history, and links to account documents through the Document API. Figures such as net assets, cash or turnover are inside those documents. You get them as data only by parsing the iXBRL version of the accounts yourself, by processing the bulk accounts files, or by using a hosted API that has already parsed them.
Are all UK company accounts available as iXBRL?
No. Companies House says about 75% of the 2.2 million accounts it expects each year are filed electronically and appear in its accounts data. The rest are paper or PDF filings, which includes many large groups. In our data about 70% of active companies have at least one machine-readable accounts filing since 2008.
Can I get a company's financial history for every year?
Yes, for years with an iXBRL filing. Each filing carries the current and prior year, and the bulk archives go back to 2008, so a company that has filed electronically every year has a continuous series. Our company endpoint shows the history of balance sheet dates with net assets for each filing.
Is the data free to reuse?
Companies House data is published under the Open Government Licence v3.0, which allows commercial reuse with attribution. That covers the register, documents and bulk files. A hosted provider charges for the parsing, storage and API, not for the underlying data.
Try it with a free key. 50 requests a month, REST and MCP, no card. Company register, iXBRL financial history since 2008 and watchlist alerts.
Get a free API key