Shop It Docs
Stock Analysis (Fundamentals)

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.

MethodPathCache TTL
GET/api/nepse/companies/{symbol}/fundamentals/statements10 min

Request

curl "$BASE/api/nepse/companies/NABIL/fundamentals/statements?type=income&period=quarterly&years=1"

Query parameters

ParamDefaultValuesNotes
typeincomeincome / balance / cashflowDiscriminates the statement type
periodquarterlyquarterly / annualAnnual reads from operator-uploaded overrides
years1int, 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=incometype=balance
RevenueTotal Assets
Interest IncomeCurrent Assets
Interest ExpenseNon-Current Assets
Net Interest IncomeCash and Cash Equivalent
Operating ProfitInventories
Profit Before TaxTotal Liabilities
Tax ExpenseCurrent Liabilities
Net ProfitNon-Current Liabilities
Earnings Per ShareShare 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

FieldTypeNotes
availableboolfalse only for type=cashflow today
reasonstringSet when available=false; omitted otherwise
notestringSoft hint when the shape is valid but data is missing (e.g. empty quarterly history)
rows[].canonicalstringStable taxonomy key (snake_case)
rows[].labelstringDisplay label; safe to render directly
rows[].statusMetricStatusvalid / upstream_missing / insufficient_history
rows[].timeseries[].dataSourcestringmdp (quarterly) or manual_swp (annual override)

Caching

KeyTTL
nepse:fundamentals:statements:{SYMBOL}:{type}:{period}:y{years}10 min

Errors

CodeReason
200OK (including available:false for cashflow)
400type not in income/balance/cashflow, period not in quarterly/annual
404Symbol not in nepse_companies
500DB error