EU Annual Reports API (ESEF): XBRL financial statements
On Apify StoreGet 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.
Questions agents ask
- “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?”
Example
Input
{ "countries": ["NL", "BE", "FR"], "periodFrom": "2025-01-01", "maxFilings": 50 }Output
{
"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"
}What you get
| Field | Type | Meaning |
|---|---|---|
schema_version | string | Output schema version. |
record_type | string | summary = one row per annual report; fact = one raw XBRL fact (only with includeRawFacts). |
lei | string | Legal Entity Identifier of the filer. |
company_name | string | Registered name. |
country | string | Filing country (ISO 3166 alpha-2). |
period_end | string | Fiscal year end (YYYY-MM-DD), taken from the report facts. |
fiscal_year_start | string | null | Fiscal year start (YYYY-MM-DD). |
currency | string | null | ISO 4217 currency of the monetary values. |
revenue | number | null | revenue for the fiscal year; source concept: ifrs-full:Revenue or ifrs-full:RevenueFromContractsWithCustomers |
gross_profit | number | null | gross_profit for the fiscal year; source concept: ifrs-full:GrossProfit |
operating_profit | number | null | operating_profit for the fiscal year; source concept: ifrs-full:ProfitLossFromOperatingActivities |
profit_before_tax | number | null | profit_before_tax for the fiscal year; source concept: ifrs-full:ProfitLossBeforeTax |
net_income | number | null | net_income for the fiscal year; source concept: ifrs-full:ProfitLoss |
net_income_attributable_to_parent | number | null | net_income_attributable_to_parent for the fiscal year; source concept: ifrs-full:ProfitLossAttributableToOwnersOfParent |
eps_basic | number | null | eps_basic for the fiscal year; source concept: ifrs-full:BasicEarningsLossPerShare |
eps_diluted | number | null | eps_diluted for the fiscal year; source concept: ifrs-full:DilutedEarningsLossPerShare |
total_assets | number | null | total_assets for the fiscal year; source concept: ifrs-full:Assets |
current_assets | number | null | current_assets for the fiscal year; source concept: ifrs-full:CurrentAssets |
cash_and_equivalents | number | null | cash_and_equivalents for the fiscal year; source concept: ifrs-full:CashAndCashEquivalents |
total_equity | number | null | total_equity for the fiscal year; source concept: ifrs-full:Equity |
equity_attributable_to_parent | number | null | equity_attributable_to_parent for the fiscal year; source concept: ifrs-full:EquityAttributableToOwnersOfParent |
total_liabilities | number | null | total_liabilities for the fiscal year; source concept: ifrs-full:Liabilities |
current_liabilities | number | null | current_liabilities for the fiscal year; source concept: ifrs-full:CurrentLiabilities |
noncurrent_liabilities | number | null | noncurrent_liabilities for the fiscal year; source concept: ifrs-full:NoncurrentLiabilities |
operating_cash_flow | number | null | operating_cash_flow for the fiscal year; source concept: ifrs-full:CashFlowsFromUsedInOperatingActivities |
investing_cash_flow | number | null | investing_cash_flow for the fiscal year; source concept: ifrs-full:CashFlowsFromUsedInInvestingActivities |
financing_cash_flow | number | null | financing_cash_flow for the fiscal year; source concept: ifrs-full:CashFlowsFromUsedInFinancingActivities |
depreciation_amortisation | number | null | depreciation_amortisation for the fiscal year; source concept: ifrs-full:DepreciationAndAmortisationExpense or ifrs-full:AdjustmentsForDepreciationAndAmortisationExpense or ifrs-full:DepreciationAmortisationAndImpairmentLossReversalOfImpairmentLossRecognisedInProfitOrLoss or ifrs-full:AdjustmentsForDepreciationAndAmortisationExpenseAndImpairmentLossReversalOfImpairmentLossRecognisedInProfitOrLoss |
employee_benefits_expense | number | null | employee_benefits_expense for the fiscal year; source concept: ifrs-full:EmployeeBenefitsExpense |
dividends_paid | number | null | dividends_paid for the fiscal year; source concept: ifrs-full:DividendsPaidClassifiedAsFinancingActivities or ifrs-full:DividendsPaid |
dividend_per_share | number | null | dividend_per_share for the fiscal year; source concept: ifrs-full:DividendsRecognisedAsDistributionsToOwnersPerShare |
dividend_proposed_per_share | number | null | dividend_proposed_per_share for the fiscal year; source concept: ifrs-full:DividendsProposedOrDeclaredBeforeFinancialStatementsAuthorisedForIssueButNotRecognisedAsDistributionToOwnersPerShare |
shares_outstanding | number | null | shares_outstanding for the fiscal year; source concept: ifrs-full:NumberOfSharesOutstanding |
metrics_found | integer | How many of the reported metrics were found. |
ebitda | number | null | Derived: operating_profit + depreciation_amortisation. |
operating_margin | number | null | Derived: operating_profit / revenue. |
net_margin | number | null | Derived: net_income / revenue. |
return_on_equity | number | null | Derived: net_income / total_equity. |
equity_ratio | number | null | Derived: total_equity / total_assets. |
revenue_growth | number | null | Derived: revenue / prior_year.revenue - 1. |
sources | object | Per field: concept, fact_id, period, unit, decimals of the source fact, or {derived: formula}. |
prior_year | object | null | Comparative fiscal year from the same report: period_end, fiscal_year_start, currency, the same metrics and derived fields, metrics_found and sources. |
fact_id | string | XBRL fact id inside the report. |
concept | string | XBRL concept, e.g. ifrs-full:Revenue. |
value | string | null | Raw fact value as reported (canonical form). |
unit | string | null | XBRL unit, e.g. iso4217:EUR. |
period | string | null | XBRL period (instant or start/end). |
decimals | integer | null | XBRL decimals (precision). |
dimensions | object | Extra XBRL dimensions (axes/members) of the fact. |
filing_id | string | filings.xbrl.org filing id. |
published | string | null | Publication timestamp of the filing. |
viewer_url | string | null | Inline XBRL viewer of the annual report. |
report_url | string | null | The iXBRL (XHTML) annual report. |
source_url | string | xBRL-JSON the row was extracted from. |
retrieved_at | string | UTC time the source was fetched. |
Coverage
ESEF annual reports collected by filings.xbrl.org: 27,626 reports from 28 countries (counted 2026-11-05; largest: UA, GB, DK, SE, NO, FR, FI). Germany is not in the index. Reports appear a few days to a few weeks after publication, once filings.xbrl.org has processed them. All values are in full currency units.
Use with AI agents (MCP)
Add this URL to your MCP client (Claude, Cursor, VS Code, ...) to load the Actor as a tool through the Apify hosted MCP server. It signs you in with OAuth or accepts Authorization: Bearer <APIFY_TOKEN>.
https://mcp.apify.com?tools=bosco_labs/esef-annual-reports
For “Get Heineken's latest revenue growth and operating margin from its annual report.” the agent passes:
{"companyName": "heineken", "maxFilings": 1}
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.
Or call the Apify API: POST https://api.apify.com/v2/acts/bosco_labs~esef-annual-reports/run-sync-get-dataset-items with the input as JSON body. Cost: $0.01 per run plus $0.05 per annual report; raw XBRL fact rows, if switched on, $0.0005 each.
Input fields
| Field | Type | Meaning |
|---|---|---|
leis | array | Legal Entity Identifiers (20 letters/digits), e.g. ["724500Y6DUVHQD6OXN27"] for ASML: the most precise lookup, any country. Empty = no LEI filter. |
companyName | string | Case-insensitive part of the registered company name, e.g. "heineken" or "lvmh"; can match several companies, so check company_name in the output. Empty = no name filter. |
countries | array | Filing countries as ISO 3166 alpha-2 codes, e.g. ["NL", "BE", "FR"]; also SE, DK, FI, NO, IT, ES, GB and others. Empty = all 28 countries in the index (Germany is not in it). |
periodFrom | string | Fiscal year ending on or after this date, YYYY-MM-DD, e.g. "2024-01-01". Empty = no lower limit. |
periodTo | string | Fiscal year ending on or before this date, YYYY-MM-DD, e.g. "2024-12-31". Empty = no upper limit. |
maxFilings | integer | Maximum annual reports, newest fiscal period first, e.g. 1 for a company's latest report. Default 10. One report per company per fiscal year, with the prior year nested in each row. |
includeRawFacts | boolean | true = also output every tagged XBRL fact of each report as its own row (record_type = "fact"), charged per fact row. Default false (one summary row per report). |
onlyNewSinceLastRun | boolean | true = skip (and don't charge for) reports an earlier run with the same filters already delivered. For scheduled runs. Default false. Remembered in a named key-value store in your account. |
Sources, licence and limits
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.