/api/v1/xbrl/companies/{id}/statementsAssembled face financial statements for a company's latest qualifying filing, addressed BY TICKER or CIK (not accession).
Assembled face financial statements for a company's latest qualifying filing, addressed BY TICKER or CIK (not accession).
Why use this
Common use case
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 -> 10-K, quarterly period=Q -> 10-Q; override with form_type), 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. Want the numbers already arranged into a rendered, footed statement (canonical line items in presentation order)? Call GET /api/v1/xbrl/timeseries with template=true.
Parameters
| Name | In | Required | Default | Allowed | Description | Example |
|---|---|---|---|---|---|---|
| id | path | required | — | — | 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 |
| period | query | optional | A | — | `A` (annual, default) selects the 10-K family; `Q` selects the 10-Q family. Any other value -> 400 INVALID_PARAM. | A |
| form_type | query | optional | — | — | Explicit form type, overriding the `period` default (default `10-K` for `period=A`, `10-Q` for `period=Q`). Matched on form family, so a 10-K/A amendment resolves to the current 10-K. | 10-K |
| year | query | optional | — | — | 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_of | query | optional | — | — | Point-in-time: the latest filing filed on or before this date (`YYYY-MM-DD`). Malformed -> 400 INVALID_PARAM. | 2024-06-30 |
| basis | query | optional | latest | — | `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 |
| statement | query | optional | — | — | 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_only | query | optional | true | — | `true` (default) serves the consolidated face columns the filer laid out. `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
| Field | Type | Nullable | Description |
|---|---|---|---|
| data | object | no | The 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). |
| meta.company_name | string | yes | The 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_accession | string | no | The 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_report | string | yes | The elected filing's period of report (ISO date). |
| meta.as_of | string | yes | Echo of the `as_of` point-in-time cap (ISO date), or null when not supplied. |
| meta.covered | boolean | no | Whether 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
- "status": "success"
- "data":
- "kind": "finradar_v1"
- "statements":
- "meta":
- "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
| Status | Label | Description |
|---|---|---|
| 200 | OK | Request succeeded. |
| 400 | Bad Request | Invalid query, body, or path parameter. |
| 401 | Unauthorized | Missing or invalid Authorization header / api_Token. |
| 402 | Payment Required | Insufficient token balance for this call. Top up |
| 429 | Too Many Requests | Rate limit exceeded for your tier (see /pricing for tier limits). Tier limits |
| 500 | Server Error | Unexpected server-side failure. Retry with backoff; report if persistent. |
Code samples
curl "https://api.finradar.ai/api/v1/xbrl/companies/AAPL/statements?api_Token=YOUR_API_KEY&period=A&form_type=10-K&year=2024&as_of=2024-06-30&basis=original&statement=StatementsOfIncome&consolidated_only=false" \
-H "Authorization: Bearer YOUR_JWT_TOKEN"Generate an API key in /account/credentials to run live queries (literal YOUR_API_KEY placeholder shown until then).