API · Companies

Get a full financial statement

Line-item income statement, balance sheet, or cash flow with per-period metric labels.

GET/api/v1/data/companies/{company}/statement

Returns up to 25 periods of a complete financial statement -- income statement, balance sheet, or cash flow -- with metric names, values, units, per-period coverage annotations, and source links. Nordic cells carry per-figure provenance; US statements are cited per annual filing (see Provenance).

When to use this

  • Building a multi-year trend chart of operating margin.
  • Rendering a full income statement table on a company page.
  • Feeding a forecasting model that needs every reported line.

For headline KPIs only, use the financials endpoint — it is cheaper and pre-aggregated.

Path

FieldTypeDescription
companyrequiredstringCompany name or ticker.

Query

FieldTypeDescription
statementstring
default: income_statement
income_statement | balance_sheet | cash_flow
yearsinteger
default: 10
Max periods to return (1–25).
marketstringnordic | us. Omit to auto-detect.
period_typestring
default: annual
annual | quarterly | auto. Quarterly line items are US-only (see Period types).
yearintegerFilter to a specific fiscal year.
quarterintegerFilter to a specific fiscal quarter (1–4). Implies period_type=quarterly when period_type is annual.

Example

bash
curl "https://api.clarifo.com/api/v1/data/companies/Fiskars/statement?statement=income_statement&years=10" \
  -H "Authorization: Bearer $CLARIFO_API_KEY"

Response

json
{
  "company_name": "Fiskars",
  "market": "nordic",
  "statement": "income_statement",
  "period_type": "annual",
  "periods": [
    {
      "year": 2024,
      "period": "2024",
      "coverage_status": "complete",
      "available_core_metrics": 8,
      "expected_core_metrics": 8,
      "metrics": {
        "revenue": {
          "metric_key": "revenue",
          "metric_name": "Liikevaihto",
          "value": 1250500000,
          "unit": "EUR",
          "currency": "EUR",
          "source": "esef",
          "source_url": "https://filings.xbrl.org/…",
          "concept": "ifrs-full:Revenue",
          "filing_index": "743700UJPK…"
        }
      }
    }
  ],
  "coverage_summary": {
    "complete": 10,
    "partial": 0,
    "sparse": 0,
    "total": 10,
    "core_metric_set": ["revenue", "operating_income", "…"]
  },
  "sources": [
    {
      "id": "src_1",
      "company": "Fiskars",
      "document_title": "Fiskars 2024 Financial Statement",
      "document_type": "financial_statement",
      "year": 2024,
      "source_url": "https://filings.xbrl.org/…",
      "source_kind": "s3_pdf",
      "page_reference": "financial_statement",
      "page_reference_type": "document",
      "citation_label": "Fiskars 2024 Financial Statement",
      "citation_markdown": "[Fiskars 2024 Financial Statement](https://filings.xbrl.org/…)",
      "…": "…"
    }
  ],
  "source_policy": {"citation_mode": "claim_level", "…": "…"}
}

ESEF cells report value in full currency units and unit is the currency code ("EUR", "SEK", ...). Older Nordic years come from PDF-extracted tables whose unit can differ, so always read unit per cell. Empty fields are omitted rather than sent as null.

Coverage fields

Every period carries coverage_status (complete = at least 80 % of the statement's core line items present, partial = 30–79 %, sparse = below 30 %), available_core_metrics, expected_core_metrics and missing_core_metrics. The top-level coverage_summary counts periods per band and lists the core_metric_set used. Use these to drop or flag a period where only a handful of facts were ingested.

Provenance fields

Nordic metric objects carry per-figure provenance when the source provides it:

FieldDescription
source"esef" (iXBRL filing) or "avainluvut" (figure extracted from a PDF filing page).
source_urlESEF: the filing viewer. PDF-extracted: a Clarifo snapshot link for the page.
conceptESEF: the IFRS concept tag (e.g. "ifrs-full:Revenue"). PDF-extracted: "avainluvut:<metric>".
filing_indexESEF filing identifier.
page_idPDF-extracted figures: the filing page, resolvable via the snapshot endpoint.

US metric objects carry metric_key, metric_name, metric_name_en, value, unit and currency only. Amounts are in whole US dollars (unit and currency are both "USD", including on per-share rows). There is no per-cell source, concept, filing_index or page_id: provenance is attached per annual period instead, as periods[]._provenance (form_type, accession_number, filing_url, document_url, display_label) naming the 10-K or 20-F that owns the fiscal year. For a restated year this is the amendment, which may not have supplied every line item. US quarterly periods carry no filing link.

The top-level sources list holds one evidence card per distinct source behind the statement (a filing, or a page for PDF-extracted figures) (with citation_label and citation_markdown), and source_policy describes how to render citations. Show users citation_markdown, not raw page_ids.

Period types

period_typeReturns
annual (default)Newest fiscal years.
quarterlyNewest quarters. US only.
autoUS: annual + quarterly rows mixed, newest first. Nordic: annual rows plus a note.

Nordic statements are annual-only: ESEF filings are annual and interim reports are not ingested at line-item level. A Nordic quarterly request returns HTTP 200 with an empty periods list and:

json
{
  "company_name": "Fiskars",
  "market": "nordic",
  "statement": "income_statement",
  "period_type": "quarterly",
  "error": "quarterly_line_items_not_available",
  "explanation": "Quarterly line-item statements (quarterly) are not available for Nordic companies: …",
  "alternative_tools": ["get_company_financials", "search_filing_content"]
}

For Nordic quarterly headline figures, use the financials endpoint with period_type=quarterly.

Misses

If neither market has statement data for the company, the response is HTTP 200 with "error": "No statement data found", "failure_kind": "not_found", the echoed company, statement, period_type and tried_markets. When the company is known but has no line items yet, a coverage block explains why ("reason": "no_detailed_data").