Statements
Quarterly / annual income statement and balance sheet rendered by canonical line item with a per-row time series
The statements endpoint renders the per-statement table view of the stock-detail page. Each canonical row (Revenue, Net Profit, Total Assets, …) carries a time series so the table grows historical columns once multi-quarter coverage exists.
| Method | Path | Cache TTL |
|---|---|---|
GET | /api/nepse/companies/{symbol}/fundamentals/statements | 10 min |
Request
curl "$BASE/api/nepse/companies/NABIL/fundamentals/statements?type=income&period=quarterly&years=1"Query parameters
| Param | Default | Values | Notes |
|---|---|---|---|
type | income | income / balance / cashflow | Discriminates the statement type |
period | quarterly | quarterly / annual | Annual reads from operator-uploaded overrides |
years | 1 | int, clamped to [1, 10] | Lookback window |
type=cashflow short-circuits to available: false with a reason string — upstream MDP has no cashflow rows across the 259-symbol corpus as of v4.5. The shape stays stable for when it lights up.
Response — type=income, period=quarterly
{
"message": "ok",
"data": {
"symbol": "NABIL",
"type": "income",
"period": "quarterly",
"years": 1,
"available": true,
"rows": [
{
"canonical": "revenue",
"label": "Revenue",
"status": "valid",
"timeseries": [
{
"fiscalYearBs": "2082/2083",
"fiscalYearAd": "2025/2026",
"quarter": "Q3",
"value": 5000000000,
"dataSource": "mdp"
}
]
},
{
"canonical": "interest_income",
"label": "Interest Income",
"status": "upstream_missing",
"timeseries": []
}
/* ... more rows in render order ... */
],
"note": "",
"dataAsOf": "2026-05-23T14:55:00+05:45",
"servedAt": "2026-05-23T14:56:30+05:45"
}
}Canonical row order
Rows are returned in a fixed render order so FE table rendering stays stable across requests. Rows that don't apply to the symbol's sector return status: upstream_missing with timeseries: [] — they stay in the shape so a future sector reclassification doesn't change which rows appear.
type=income | type=balance |
|---|---|
| Revenue | Total Assets |
| Interest Income | Current Assets |
| Interest Expense | Non-Current Assets |
| Net Interest Income | Cash and Cash Equivalent |
| Operating Profit | Inventories |
| Profit Before Tax | Total Liabilities |
| Tax Expense | Current Liabilities |
| Net Profit | Non-Current Liabilities |
| Earnings Per Share | Share Capital |
| Total Equity | |
| Book Value Per Share |
Banking-specific rows (Interest Income / Net Interest Income) are interleaved with sector-agnostic rows so a single canonical order covers every sector — non-applicable rows simply carry status: upstream_missing.
Response — period=annual
Annual mode reads exclusively from nepse_audited_annual_overrides (Phase A operator uploads under v4.5). Each populated canonical maps to one row per uploaded FY.
{
"rows": [
{
"canonical": "revenue",
"label": "Revenue",
"status": "valid",
"timeseries": [
{ "fiscalYearBs": "2080/2081", "value": 18500000000, "dataSource": "manual_swp" },
{ "fiscalYearBs": "2079/2080", "value": 16200000000, "dataSource": "manual_swp" }
]
}
],
"note": "Annual statements appear here once audited annual figures are uploaded for this company (see Phase A)."
}When zero canonicals have an override, the response surfaces the note above and every row carries status: insufficient_history with an empty timeseries.
Response — type=cashflow
{
"data": {
"type": "cashflow",
"available": false,
"reason": "Cash flow statements are not currently provided by upstream (NEPSE MDP). Will be enabled once available.",
"rows": [],
/* ... */
}
}Field rules
| Field | Type | Notes |
|---|---|---|
available | bool | false only for type=cashflow today |
reason | string | Set when available=false; omitted otherwise |
note | string | Soft hint when the shape is valid but data is missing (e.g. empty quarterly history) |
rows[].canonical | string | Stable taxonomy key (snake_case) |
rows[].label | string | Display label; safe to render directly |
rows[].status | MetricStatus | valid / upstream_missing / insufficient_history |
rows[].timeseries[].dataSource | string | mdp (quarterly) or manual_swp (annual override) |
Caching
| Key | TTL |
|---|---|
nepse:fundamentals:statements:{SYMBOL}:{type}:{period}:y{years} | 10 min |
Errors
| Code | Reason |
|---|---|
200 | OK (including available:false for cashflow) |
400 | type not in income/balance/cashflow, period not in quarterly/annual |
404 | Symbol not in nepse_companies |
500 | DB error |