Bosco Labs

Tools › Finance & SEC

EU Annual Reports API (ESEF): XBRL financial statements

On Apify Store

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.

Price$0.01 per run plus $0.05 per annual report; raw XBRL fact rows, if switched on, $0.0005 each
DomainFinance & SEC
Call itApify API or MCP

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

FieldTypeMeaning
schema_versionstringOutput schema version.
record_typestringsummary = one row per annual report; fact = one raw XBRL fact (only with includeRawFacts).
leistringLegal Entity Identifier of the filer.
company_namestringRegistered name.
countrystringFiling country (ISO 3166 alpha-2).
period_endstringFiscal year end (YYYY-MM-DD), taken from the report facts.
fiscal_year_startstring | nullFiscal year start (YYYY-MM-DD).
currencystring | nullISO 4217 currency of the monetary values.
revenuenumber | nullrevenue for the fiscal year; source concept: ifrs-full:Revenue or ifrs-full:RevenueFromContractsWithCustomers
gross_profitnumber | nullgross_profit for the fiscal year; source concept: ifrs-full:GrossProfit
operating_profitnumber | nulloperating_profit for the fiscal year; source concept: ifrs-full:ProfitLossFromOperatingActivities
profit_before_taxnumber | nullprofit_before_tax for the fiscal year; source concept: ifrs-full:ProfitLossBeforeTax
net_incomenumber | nullnet_income for the fiscal year; source concept: ifrs-full:ProfitLoss
net_income_attributable_to_parentnumber | nullnet_income_attributable_to_parent for the fiscal year; source concept: ifrs-full:ProfitLossAttributableToOwnersOfParent
eps_basicnumber | nulleps_basic for the fiscal year; source concept: ifrs-full:BasicEarningsLossPerShare
eps_dilutednumber | nulleps_diluted for the fiscal year; source concept: ifrs-full:DilutedEarningsLossPerShare
total_assetsnumber | nulltotal_assets for the fiscal year; source concept: ifrs-full:Assets
current_assetsnumber | nullcurrent_assets for the fiscal year; source concept: ifrs-full:CurrentAssets
cash_and_equivalentsnumber | nullcash_and_equivalents for the fiscal year; source concept: ifrs-full:CashAndCashEquivalents
total_equitynumber | nulltotal_equity for the fiscal year; source concept: ifrs-full:Equity
equity_attributable_to_parentnumber | nullequity_attributable_to_parent for the fiscal year; source concept: ifrs-full:EquityAttributableToOwnersOfParent
total_liabilitiesnumber | nulltotal_liabilities for the fiscal year; source concept: ifrs-full:Liabilities
current_liabilitiesnumber | nullcurrent_liabilities for the fiscal year; source concept: ifrs-full:CurrentLiabilities
noncurrent_liabilitiesnumber | nullnoncurrent_liabilities for the fiscal year; source concept: ifrs-full:NoncurrentLiabilities
operating_cash_flownumber | nulloperating_cash_flow for the fiscal year; source concept: ifrs-full:CashFlowsFromUsedInOperatingActivities
investing_cash_flownumber | nullinvesting_cash_flow for the fiscal year; source concept: ifrs-full:CashFlowsFromUsedInInvestingActivities
financing_cash_flownumber | nullfinancing_cash_flow for the fiscal year; source concept: ifrs-full:CashFlowsFromUsedInFinancingActivities
depreciation_amortisationnumber | nulldepreciation_amortisation for the fiscal year; source concept: ifrs-full:DepreciationAndAmortisationExpense or ifrs-full:AdjustmentsForDepreciationAndAmortisationExpense or ifrs-full:DepreciationAmortisationAndImpairmentLossReversalOfImpairmentLossRecognisedInProfitOrLoss or ifrs-full:AdjustmentsForDepreciationAndAmortisationExpenseAndImpairmentLossReversalOfImpairmentLossRecognisedInProfitOrLoss
employee_benefits_expensenumber | nullemployee_benefits_expense for the fiscal year; source concept: ifrs-full:EmployeeBenefitsExpense
dividends_paidnumber | nulldividends_paid for the fiscal year; source concept: ifrs-full:DividendsPaidClassifiedAsFinancingActivities or ifrs-full:DividendsPaid
dividend_per_sharenumber | nulldividend_per_share for the fiscal year; source concept: ifrs-full:DividendsRecognisedAsDistributionsToOwnersPerShare
dividend_proposed_per_sharenumber | nulldividend_proposed_per_share for the fiscal year; source concept: ifrs-full:DividendsProposedOrDeclaredBeforeFinancialStatementsAuthorisedForIssueButNotRecognisedAsDistributionToOwnersPerShare
shares_outstandingnumber | nullshares_outstanding for the fiscal year; source concept: ifrs-full:NumberOfSharesOutstanding
metrics_foundintegerHow many of the reported metrics were found.
ebitdanumber | nullDerived: operating_profit + depreciation_amortisation.
operating_marginnumber | nullDerived: operating_profit / revenue.
net_marginnumber | nullDerived: net_income / revenue.
return_on_equitynumber | nullDerived: net_income / total_equity.
equity_rationumber | nullDerived: total_equity / total_assets.
revenue_growthnumber | nullDerived: revenue / prior_year.revenue - 1.
sourcesobjectPer field: concept, fact_id, period, unit, decimals of the source fact, or {derived: formula}.
prior_yearobject | nullComparative fiscal year from the same report: period_end, fiscal_year_start, currency, the same metrics and derived fields, metrics_found and sources.
fact_idstringXBRL fact id inside the report.
conceptstringXBRL concept, e.g. ifrs-full:Revenue.
valuestring | nullRaw fact value as reported (canonical form).
unitstring | nullXBRL unit, e.g. iso4217:EUR.
periodstring | nullXBRL period (instant or start/end).
decimalsinteger | nullXBRL decimals (precision).
dimensionsobjectExtra XBRL dimensions (axes/members) of the fact.
filing_idstringfilings.xbrl.org filing id.
publishedstring | nullPublication timestamp of the filing.
viewer_urlstring | nullInline XBRL viewer of the annual report.
report_urlstring | nullThe iXBRL (XHTML) annual report.
source_urlstringxBRL-JSON the row was extracted from.
retrieved_atstringUTC 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

FieldTypeMeaning
leisarrayLegal Entity Identifiers (20 letters/digits), e.g. ["724500Y6DUVHQD6OXN27"] for ASML: the most precise lookup, any country. Empty = no LEI filter.
companyNamestringCase-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.
countriesarrayFiling 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).
periodFromstringFiscal year ending on or after this date, YYYY-MM-DD, e.g. "2024-01-01". Empty = no lower limit.
periodTostringFiscal year ending on or before this date, YYYY-MM-DD, e.g. "2024-12-31". Empty = no upper limit.
maxFilingsintegerMaximum 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.
includeRawFactsbooleantrue = 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).
onlyNewSinceLastRunbooleantrue = 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.