API · Companies
Compare companies
Side-by-side KPIs for 2–5 issuers, Nordic + US can be mixed.
POST/api/v1/data/companies/compare
Fetches financials for each company in the input list and returns a structured comparison object. Nordic and US issuers can be mixed in a single call (e.g. "Neste vs ExxonMobil").
When to use this
- A peer table on a company page.
- Cross-market comparison ("how does the Helsinki gas peer compare to ExxonMobil?").
- One-click answer to "who is winning?" for a small competitive set.
Body
| Field | Type | Description |
|---|---|---|
| companiesrequired | string[] | 2–5 names or tickers. |
| years | integer default: 3 | Recent years per company (1–10). |
Example
bash
curl https://api.clarifo.com/api/v1/data/companies/compare \
-H "Authorization: Bearer $CLARIFO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"companies": ["Neste", "ExxonMobil"],
"years": 3
}'Response
json
{
"companies": [
{
"company_name": "Neste",
"display_name": "Neste Oyj",
"market": "nordic",
"currency": "EUR",
"latest_year": {
"year": "2024",
"revenue": 21990000000,
"operating_income": 1850000000,
"operating_margin": 8.4,
"ebitda": 2400000000,
"ebitda_margin": 10.9,
"net_income": 640000000,
"net_margin": 2.9,
"roe": 7.0,
"…": "…",
"_provenance": {"primary_source": "nordic_avainluvut+keymetrics", "page_ids": ["…"]}
},
"by_year": {
"2024": {"revenue": 21990000000, "ebitda": 2400000000, "ebitda_margin": 10.9, "net_income": 640000000, "…": "…"},
"2023": {"revenue": 22458000000, "…": "…"}
}
},
{
"company_name": "Exxon Mobil Corp",
"display_name": "Exxon Mobil Corp",
"market": "us",
"currency": "USD",
"ticker": "XOM",
"exchange": "NYSE",
"latest_year": {"year": "2024", "revenue": 344582000000, "net_margin": 9.8, "…": "…"},
"by_year": {"2024": {"…": "…"}, "2023": {"…": "…"}}
}
],
"kpis": [
"revenue", "gross_profit", "gross_margin", "operating_income", "operating_margin",
"ebit", "ebit_margin", "ebitda", "ebitda_margin", "net_income", "net_margin",
"eps_diluted", "total_assets", "total_equity", "roe", "roa",
"operating_cash_flow", "free_cash_flow", "capital_expenditures", "fcf_margin"
],
"not_found": [],
"computations": {
"gross_margin": "gross_profit / revenue * 100",
"operating_margin": "operating_income / revenue * 100",
"roe": "net_income / total_equity * 100",
"…": "…"
},
"data_quality_warnings": [
{
"type": "mixed_currency_comparison",
"severity": "high",
"currencies": ["EUR", "USD"],
"by_company": {"Neste Oyj": "EUR", "Exxon Mobil Corp": "USD"},
"message": "Companies in this comparison report in different currencies (EUR, USD). …"
}
]
}Margins and return ratios are percentages (8.4 = 8.4 %), computed
from the reported figures with the formulas listed in computations.
Absolute figures are in each company's own reporting currency and are
never FX-converted; compare across currencies on the margins and
ratios instead. Empty fields are omitted rather than sent as null.
Output shape
companies-- one entry per resolved issuer withcurrency,latest_year(a flat dict of thekpisfor the newest year with data, plusyear), andby_year(the same KPI keys per year, newest first). Keys are the lowercase KPI names in both (ebitda,ebit). Both carry_provenanceper year, as on the financials endpoint. US entries addtickerandexchange. An entry may also carrylatest_quarter(newest quarter's figures),latest_price(most recent stored close, typically one trading day old) anddata_quality_warnings(Nordic source conflicts, at most three).kpis-- the metric keys used forlatest_yearandby_year. The set depends on the companies' sector (banks, for example, get no gross profit or EBITDA). Use it to drive table rows or column headers.not_found-- input strings the resolver could not map. Surface these to the user instead of silently dropping them.computations-- the formula behind each derived margin and ratio.data_quality_warnings(top level) -- amixed_currency_comparisonentry when the companies report in different currencies.fiscal_calendar_warning-- present when the companies' fiscal years end months apart (e.g. August vs. January), listing each company'speriod_end.coverage_gaps-- companies that resolved but have no detailed financial data, withreasonandexplanation.
Limits
- 2 to 5 companies per call.
- 1 to 10 historical years per company.