Skip to content
/api/v1/xbrl/companies/{id}/statements

As-filed ("as stated") face financial statements for a company, preserving the filer's own line labels, row order, and `depth` indentation.

As-filed ("as stated") face financial statements for a company, preserving the filer's own line labels, row order, and `depth` indentation. `statement=balance` selects the balance sheet. The filing-version default remains `basis=latest`; `basis=original` is only for an explicitly requested earliest-filed version. Addressed by ticker or CIK.

25 tokensSince v3.98.0

Why use this

Resolve `ticker`|`cik` -> the latest qualifying annual filing across 10-K, 20-F and 40-F families, or the requested explicit form (quarterly defaults to 10-Q), optionally pinned to a fiscal `year` or a point-in-time `as_of`, and serve its assembled `finradar_v1` statements — the same structured artifact as GET /api/v1/xbrl/filing/{accession}/statements, without knowing the accession first.

Common use case

Charting a named company's latest income statement / balance sheet / cash-flow statement without a prior accession lookup; pulling a specific fiscal year's statements by ticker; point-in-time replay of the statements as-known at a past date.

The by-ticker entry point to the as-filed statements surface. Where GET /api/v1/xbrl/filing/{accession}/statements needs an accession, this resolves a ticker or cik to its current filing of the requested form (annual period=A considers 10-K, 20-F and 40-F together; quarterly period=Q stays 10-Q; a nonblank form_type restricts selection to its family), optionally to a specific fiscal year or as-known at a past as_of date, and serves that filing's assembled finradar_v1 statements — the identical structured artifact, plus meta.resolved_accession/meta.period_of_report/meta.as_of telling you which filing was chosen. Errors: 400 INVALID_PARAM (bad period/year/as_of); 404 UNKNOWN_TICKER (the id matches no US filer); 404 NOT_YET_PARSED (a real filer, but no matching filing is in the engine yet — historical depth loads incrementally); 404 NOT_FOUND (a matching filing is present but its statements are not yet assembled). Bound the response with the repeatable statement= filter. Use the response's data.display.text for the ready-to-display statement from the filing. For a standardized template requested explicitly, use GET /api/v1/xbrl/timeseries with template=true.

Parameters

NameInRequiredDefaultAllowedDescriptionExample
idpathrequired——Company identifier: a ticker (e.g. `AAPL`; case-insensitive, `.`/`/` fold to `-` so `BRK.A`=`BRK-A`) or an all-digits SEC CIK (bare or zero-padded). A ticker resolves through the same canonical resolver the SEC filings endpoints use. A ticker that matches no US filer -> 404 `UNKNOWN_TICKER`; a real filer whose requested filing is not in the engine yet (historical depth loads incrementally) -> 404 `NOT_YET_PARSED` (poll `/api/v1/xbrl/coverage`).AAPL
periodqueryoptionalA—`A` (annual, default) considers the 10-K, 20-F and 40-F families together when `form_type` is absent or blank. The newest qualifying reporting period wins, then the existing `basis` filing-date order; a newer foreign annual can therefore replace an older 10-K. `Q` selects only the 10-Q family. Any other value -> 400 INVALID_PARAM.A
form_typequeryoptional——Explicit nonblank form type overrides `period` and restricts selection to that form family. Amendments match their base family (for example `20-F/A` selects the 20-F family); existing `basis`, `year` and `as_of` rules still apply. Omit or leave blank for automatic 10-K/20-F/40-F annual selection, or 10-Q quarterly selection. This selects only filings already in the engine; it does not retrieve missing statements or treat 6-K as an annual or quarter.10-K
yearqueryoptional——A specific fiscal year — the filing whose period_of_report falls in this calendar year. Omit for the latest filing. Non-numeric -> 400 INVALID_PARAM.2024
as_ofqueryoptional——Point-in-time: the latest filing filed on or before this date (`YYYY-MM-DD`). Malformed -> 400 INVALID_PARAM.2024-06-30
basisqueryoptionallatest—`latest` (default) elects the most recently filed version of the resolved period (restated view — a later 10-K/A wins); `original` elects the earliest-filed version (the statements as originally filed, pre-amendment). Composes with `year`/`as_of` (they bound the eligible filings, `basis` breaks the tie). Any other value -> 400 INVALID_PARAM.original
statementqueryoptional——Optional, repeatable — restrict to one or more statements (case-insensitive). Match by the statement's own slot (`StatementsOfIncome`, `BalanceSheets`, `StatementsOfCashFlows`, `StatementsOfComprehensiveIncome`, `StatementsOfShareholdersEquity`) OR by a short canonical alias: `income`, `balance`, `cashflow`, `comprehensive`, `equity`. Exact slot match wins first. A value that matches no statement in the resolved filing -> 400 INVALID_PARAM whose `details.available_statements` lists that filing's real slot names (a bad VALUE of a known param — unknown query-param NAMES are still ignored). Omit for every assembled statement.StatementsOfIncome
consolidated_onlyqueryoptionaltrue—`true` (default) serves dimensionless XBRL context columns in the structured matrix. The ready-to-display text is in `data.display.text`: `status=filed` preserves source-page dates and display units; `status=sdk` uses the existing SDK formatter with stored dates and full-value amounts. `false` adds the dimensioned columns - segment/geography and footnote breakouts of the same period - which are mostly empty for face rows (Apple 10-Q 0000320193-26-000013: 52 columns / 8% populated with `false`, vs 6 by default). Same name and meaning as GET /api/v1/xbrl/facts. Echoed at `meta.consolidated_only`.false

Response schema

FieldTypeNullableDescription
data.displayobjectnoCanonical ready-to-display text, forwarded unchanged by SDK to_statement() and MCP TextContent. status=filed|partial|unavailable refers to source display evidence only. Financial rows remain available independently. New ingestion captures the source presentation; deployment does not reprocess older artifacts.
dataobjectnoThe same assembled-statements payload as GET /api/v1/xbrl/filing/{accession}/statements (`data.kind`, `data.statements[]` with `columns[]` x `rows[]`; each row carries the company's own human `label` beside the `concept` qname, and each value's own `units[]` and `decimals[]`).
meta.company_namestringyesThe company's display name, embedded so a client can label the company without a second lookup (mirrors the SEC companyfacts `entityName`). Resolved from the always-updated company catalog by the resolved CIK; present with `null` when the catalog has no name for the company (never a fabricated value). Sits in `meta` beside `ticker`/`cik`.
meta.resolved_accessionstringnoThe accession number of the filing that was elected for this ticker/period — resolve once here, then drill into it with the accession-scoped endpoints.
meta.period_of_reportstringyesThe elected filing's period of report (ISO date).
meta.as_ofstringyesEcho of the `as_of` point-in-time cap (ISO date), or null when not supplied.
meta.coveredbooleannoWhether the company is within the covered universe. `meta` also carries `ticker`, `cik`, `company_name`, `form_type`, `engine_version`, `generated_at`, and `statement_count`.

Sample response

·
  • "request_id": null
  • "timestamp": "2026-09-24T12:00:00Z"
  • "status": "success"
  • "data":
    • "kind": "finradar_v1"
    • "display":
    • "statements":
    }
  • "meta":
    • "basis": "latest"
    • "consolidated_only": true
    • "ticker": "AAPL"
    • "cik": "0000320193"
    • "company_name": "Apple Inc."
    • "form_type": "10-K"
    • "engine_version": 1
    • "generated_at": "2026-07-06T04:12:00Z"
    • "statement_count": 1
    • "resolved_accession": "0000320193-24-000123"
    • "period_of_report": "2024-09-28"
    • "as_of": null
    • "covered": true
    }
}

Errors

StatusLabelDescription
200OKRequest succeeded.
400Bad RequestInvalid query, body, or path parameter.
401UnauthorizedMissing or invalid Authorization header / api_Token.
402Payment RequiredInsufficient token balance for this call. Top up
429Too Many RequestsRate limit exceeded for your tier (see /pricing for tier limits). Tier limits
500Server ErrorUnexpected server-side failure. Retry with backoff; report if persistent.

Code samples

curl "https://api.finradar.ai/api/v1/xbrl/companies/AAPL/statements?period=A&form_type=10-K&year=2024&as_of=2024-06-30&basis=original&statement=StatementsOfIncome&consolidated_only=false" \
  -H "X-API-Key: YOUR_API_KEY"

Generate an API key in /account/credentials to run live queries (literal YOUR_API_KEY placeholder shown until then).