Connect your agent to Europe's private companies
Annual accounts, ownership and filing history for private companies, taken straight from the national registries that publish them. One schema, whatever the country.
Sourced directly from official EU registries
Search across EU registries in one call
Search by name, registration number or VAT ID across every jurisdiction we ingest. You do not write a per-country integration; we normalise the fields before you see them.
Analyse years of statutory accounts
Annual accounts going back a decade or more, where the registry holds them that far. We parse revenue, EBITDA, net assets and the balance-sheet lines out of the filed PDFs and hand you JSON.
Extract context from registry filings
The text of the documents themselves: director reports, auditor notes, articles of association. Chunked and indexed if you are feeding a retrieval pipeline.
One schema across every registry we cover
You stop maintaining a scraper per country. We ingest from six official national registries, map them to one schema, and refresh daily.
What you get from each registry
Each data type is normalised, schema-versioned, and documented with full field-level provenance back to the source filing.
Annual Accounts
P&L, balance sheet and cash flow, pulled from the statutory filing itself. Revenue, EBITDA, total assets, and the rest of the line items the filing carries.
Beneficial Ownership
UBO registers and PSC data, where the registry publishes it. Ownership chains, shareholding percentages, director histories.
Filing History
A dated index of what has been lodged with the registry: annual reports, confirmation statements, director changes.
Balance Sheets
Balance-sheet lines across years, mapped to one schema whatever the local accounting standard. Where a registry files under its own national rules, we map those too.
How you query it
RESTful JSON over HTTPS. One API key. Consistent schema across all jurisdictions. Full OpenAPI spec for codegen.
# Fetch 5 years of annual accounts for a German company
curl -X GET \
"https://api.privatefinancials.eu/v1/companies/GB-08412996/financials" \
-H "Authorization: Bearer pf_live_••••••••••••••••" \
-H "Accept: application/json" \
-d "years=5"import requests
client = requests.Session()
client.headers["Authorization"] = "Bearer pf_live_••••••••••••••••"
# Annual accounts: last 5 years
resp = client.get(
"https://api.privatefinancials.eu/v1/companies/GB-08412996/financials",
params={"years": 5},
)
data = resp.json()
for year in data["annual_accounts"]:
print(
f"{year['period_end']} "
f"Revenue: {year['revenue_eur']:>14,.0f} EUR "
f"EBITDA: {year['ebitda_eur']:>13,.0f} EUR"
){
"company_id": "GB-08412996",
"company_name": "Brightwater Ltd",
"jurisdiction": "GB",
"registry": "Companies House",
"annual_accounts": [
{
"period_end": "2023-09-30",
"revenue_eur": 77800000000,
"ebitda_eur": 11200000000,
"net_profit_eur": 4200000000,
"total_assets_eur": 106000000000,
"filing_date": "2024-02-15",
"document_url": "https://api.privatefinancials.eu/v1/documents/..."
}
]
}OpenAPI 3.1 spec
Auto-generate client libraries in any language.
Consistent schema
Same field names and units regardless of source country.
Webhook updates
Get notified when a new filing lands for a tracked company.
Request access
Tell us which companies you need
We add registries one at a time. Tell us which jurisdictions and companies you need, and we will tell you what we hold now and what is realistic next.
We use your details to answer your request and nothing else. We will not add you to a mailing list and we do not sell it on. See our privacy policy.
Tell us what you need
We grant access case by case. That way we can tell you what we hold for your jurisdictions before you build anything on top of it.
Prefer email, or need a custom data agreement? Talk to sales