EU Annual Reports API (ESEF): XBRL financial statements avatar

EU Annual Reports API (ESEF): XBRL financial statements

Pricing

from $50.00 / 1,000 annual report processeds

Go to Apify Store
EU Annual Reports API (ESEF): XBRL financial statements

EU Annual Reports API (ESEF): XBRL financial statements

Key financials (revenue, EBIT, net income, EPS, assets, equity, cash flows, margins, growth) from ESEF annual reports of European listed companies in 28 countries, via filings.xbrl.org. Each value links to its XBRL fact. Filter by LEI, company name, country and fiscal year end.

Pricing

from $50.00 / 1,000 annual report processeds

Rating

0.0

(0)

Developer

Bosco Labs

Bosco Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 minutes ago

Last modified

Share

Get normalized key financials from the official ESEF annual reports of European listed companies, by LEI, company name, country or fiscal year: revenue, EBIT, EBITDA, net income, EPS, dividends, balance sheet and cash flows, plus margins, return on equity and revenue growth versus the prior year. Every number comes with the exact XBRL fact it was taken from and a link to the annual report viewer, so you can audit any value in one click. For equity analysts, finance apps and AI agents that need comparable numbers for European listed companies.

Pricing (pay per event): $0.01 per run plus $0.05 per annual report ($50 per 1,000 reports). Each report includes the comparative prior year at no extra cost. Raw XBRL fact rows, if you switch them on, cost $0.0005 each. You only pay for reports delivered, the same fiscal year is never charged twice, and the Actor stops at your max charge limit.

Data comes from the European Single Electronic Format (ESEF) filings collected by filings.xbrl.org: 27,626 annual reports from 28 countries (counted 2026-11-05; largest: UA 9,852, GB 2,970, DK 2,218, SE 1,838, NO 1,199, FR 1,185, FI 1,169). No scraping, no logins.

What you get

One row per company per fiscal year, with the prior year nested in prior_year. Real output for ASML's 2025 annual report (shortened):

{
"lei": "724500Y6DUVHQD6OXN27",
"company_name": "ASML Holding N.V.",
"country": "NL",
"period_end": "2025-12-31",
"fiscal_year_start": "2025-01-01",
"currency": "EUR",
"revenue": 32667300000,
"revenue_growth": 0.1558,
"operating_profit": 12054000000,
"ebitda": 13486800000,
"net_income": 10213000000,
"operating_margin": 0.369,
"return_on_equity": 0.4223,
"eps_basic": 26.29,
"dividend_proposed_per_share": 7.5,
"total_assets": 55576800000,
"total_equity": 24185000000,
"operating_cash_flow": 13826500000,
"metrics_found": 22,
"sources": {
"revenue": {
"concept": "ifrs-full:RevenueFromContractsWithCustomers",
"fact_id": "f-9",
"period": "2025-01-01T00:00:00/2026-01-01T00:00:00",
"unit": "iso4217:EUR",
"decimals": -5
},
"ebitda": {
"derived": "operating_profit + depreciation_amortisation"
}
},
"prior_year": {
"period_end": "2024-12-31",
"revenue": 28262900000,
"net_income": 8349000000,
"...": "same fields as above"
},
"viewer_url": "https://filings.xbrl.org/724500Y6DUVHQD6OXN27/2025-12-31/ESEF/NL/0/asml-2025-12-31-1-en/reports/ixbrlviewer.html",
"source_url": "https://filings.xbrl.org/724500Y6DUVHQD6OXN27/2025-12-31/ESEF/NL/0/asml-2025-12-31-1-en.json",
"retrieved_at": "2026-11-05T15:00:00+00:00"
}

Reported fields (null when the company didn't tag them; nothing is estimated): revenue, gross_profit, operating_profit, profit_before_tax, net_income, net_income_attributable_to_parent, eps_basic, eps_diluted, total_assets, current_assets, cash_and_equivalents, total_equity, equity_attributable_to_parent, total_liabilities, current_liabilities, noncurrent_liabilities, operating_cash_flow, investing_cash_flow, financing_cash_flow, depreciation_amortisation, employee_benefits_expense, dividends_paid, dividend_per_share, dividend_proposed_per_share, shares_outstanding.

Derived fields (computed only when all inputs are reported; sources shows the formula): ebitda (operating profit + D&A), operating_margin, net_margin, return_on_equity, equity_ratio, revenue_growth, and total_liabilities when it isn't tagged (assets minus equity).

Input

{ "countries": ["NL", "BE", "FR"], "periodFrom": "2025-01-01", "maxFilings": 50 }
FieldMeaning
leisLook up specific companies by LEI
companyNameName contains, e.g. "heineken"
countriesFiling countries (ISO codes), e.g. ["NL"]. Empty = all countries
periodFrom / periodToFiscal year end between these dates
maxFilingsMax annual reports. Default 10
onlyNewSinceLastRunFor schedules: skip reports you already received with the same filters
includeRawFactsAlso output every XBRL fact (record_type: "fact")

Running without input returns the 10 newest annual reports of any country. Reports are ordered by the fiscal period listed in the filings.xbrl.org index, latest first; the period_end in the output is taken from the report itself, which corrects the occasional wrong date in the index.

Use cases

  • Investment research and screening: compare European companies on one schema, without PDF parsing, including growth and margins.
  • KYB and credit checks: latest audited revenue, equity and liabilities by LEI.
  • Monitoring: schedule the Actor weekly with onlyNewSinceLastRun and get (and pay for) only newly published reports.
  • Dashboards and data pipelines: export to CSV, Excel, Google Sheets or your warehouse.
  • AI agents: small, predictable JSON with a source link for every value.

Use with AI agents (MCP)

Agents can call this Actor as a tool through the Apify MCP server. Add this server URL to your MCP client (Claude, Cursor, VS Code, ...):

https://mcp.apify.com?tools=bosco_labs/esef-annual-reports

It loads this Actor as a tool, plus the tools that read its results (get-actor-run, get-dataset-items). The hosted server signs you in with OAuth, or accepts your Apify token as Authorization: Bearer <APIFY_TOKEN>. On the default server (https://mcp.apify.com), agents can also find this Actor with search-actors and run it with call-actor.

Example prompts this Actor answers:

  • "Get Heineken's latest revenue growth and operating margin from its annual report."
  • "Compare net income and equity of Belgian listed companies for fiscal years ending in 2024."
  • "Which XBRL fact does ASML's reported revenue come from?"

For the first one, the agent passes:

{"companyName": "heineken", "maxFilings": 1}

Output for agents: stable, typed JSON, one row per annual report. Every row has schema_version and a source_url pointing to the report's xBRL-JSON on filings.xbrl.org (plus viewer_url and a sources entry per value), so the agent can cite its source. An LEI or name search covers every country; if nothing matches, the run's status message says so.

Cost: $0.01 per run plus $0.05 per annual report; raw XBRL fact rows, if switched on, $0.0005 each, billed to the Apify account the MCP server is signed in with.

FAQ

Which countries? All 28 countries in the filings.xbrl.org index, listed above. Germany is not in the index (0 filings). Most testing was done on NL, BE and FR reports; reports from countries with their own IFRS taxonomy variant (e.g. Ukraine) may have fewer standard fields filled. metrics_found tells you how complete a row is.

How fresh? Reports appear a few days to a few weeks after publication, once filings.xbrl.org has processed them.

Why are some fields empty? Companies tag their statements differently. Some use their own (extension) concepts instead of the standard IFRS ones; those stay null rather than being guessed. For example, LVMH tags no standard operating profit, so its operating margin and EBITDA are empty too.

Number of employees? ESEF reports almost never tag the headcount as a number (it sits in text notes), so it isn't included. employee_benefits_expense (total staff costs) is.

Are the numbers in thousands? No. All values are in full currency units (XBRL canonical values), per-share figures are per share, and ratios are fractions (0.25 = 25%).

Legal basis? These are public regulatory disclosures, and filings.xbrl.org currently places no restrictions on use. Raw fact rows can contain names from notes such as directors' remuneration; if you process those, you are responsible for your own legal basis under GDPR.