---
title: "Point-in-time fundamentals"
method: GET
path: "/v1/stocks/{symbol}/fundamentals"
tags: ["fundamentals"]
---

# Point-in-time fundamentals

`GET /v1/stocks/{symbol}/fundamentals`

## Request

- Base URL: `https://api.tapetide.com`
- URL: `https://api.tapetide.com/v1/stocks/{symbol}/fundamentals`
- Auth: HTTP bearer

Financial statement metrics as a tidy series: one row per metric and fiscal period. Quarterly results from 2002 and annual statements from 1999 where the company reported them; updated as results are declared. Every row carries `available_from`, the date the value became public. Pass `as_of` to see only what was public on that date, with the value as it was then (before any later restatement) — the backtest-safe view. Where more than one reading exists for the same metric and period, a populated value is preferred over an empty one, then a non-zero value over a 0 (one dataset rounds to whole crore, so small figures can read 0 there), then the primary dataset over the secondary, then the most recently published reading on or before `as_of`. A reported 0 that means "not reported" is not published as a value: periods where total assets, total liabilities or share capital read 0 are omitted, and revenue reading 0 while the same period shows non-zero operating expenses is published as `value: null`. Defaults to the last 10 years of periods. Rows are ordered by period end (oldest first by default; `order=desc` for newest first), then in a fixed metric order.

## Path parameters

- `symbol` string, required: Stock symbol, e.g. "RELIANCE". Percent-encode "&" (M%26M).

## Query parameters

- `metrics` string[]
- `period_type` 'quarter' | 'annual'
- `basis` 'preferred' | 'consolidated' | 'standalone'
- `from` string
- `to` string
- `as_of` string
- `order` 'asc' | 'desc'
- `limit` integer
- `cursor` string

## Response `200`

OK. Costs one request unit.

- object
  - `data` StockFundamentalsItem[], required
    - `metric` 'revenue' | 'operating_expenses' | 'operating_profit' | 'operating_margin_pct' | 'other_income' | 'interest_expense' | 'depreciation' | 'profit_before_tax' | 'tax_rate_pct' | 'net_profit' | 'eps' | 'dividend_payout_pct' | 'share_capital' | 'reserves' | 'borrowings' | 'other_liabilities' | 'total_liabilities' | 'fixed_assets' | 'capital_work_in_progress' | 'investments' | 'other_assets' | 'total_assets' | 'cash_from_operations' | 'cash_from_investing' | 'cash_from_financing' | 'net_cash_flow' | 'free_cash_flow' | 'cash_from_operations_to_operating_profit_pct' | 'roce_pct' | 'debtor_days' | 'inventory_days' | 'payable_days' | 'cash_conversion_cycle_days' | 'working_capital_days', required: Metric name; see GET /v1/fundamentals/metrics.
    - `period_type` 'quarter' | 'annual', required: quarter = a three-month period; annual = a fiscal year.
    - `period_end` string, required: Last day of the fiscal period (YYYY-MM-DD).
    - `basis` 'consolidated' | 'standalone', required: Statement basis the value comes from.
    - `value` number, nullable, required: Reported value in `unit`. null for revenue that reads 0 while the same period shows non-zero operating expenses (not reported).
    - `unit` 'inr_crore' | 'inr_per_share' | 'percent' | 'days', required: inr_crore = INR crore (1 crore = 10 million); inr_per_share = INR per share; percent where 1.5 means 1.5%; days.
    - `available_from` string, required: First date this value was publicly available (the result declaration date). Use it to avoid look-ahead bias (YYYY-MM-DD).
    - `available_from_estimated` boolean, required: true when the exact declaration date is unknown and `available_from` is a conservative estimate from the regulatory filing deadline.
  - `meta` ListMeta, required
    - `as_of` string, date-time, required: When this response was assembled (UTC).
    - `route` string, required: operationId that served the request.
    - `count` integer, required: Items in this page.
    - `limit` integer, required: Page size applied.
    - `has_more` boolean, required: Whether another page exists.
    - `next_cursor` string, nullable, required: Pass as `cursor` to fetch the next page; null on the last page.
  - `links` Links, required
    - `next` string, nullable: Relative URL of the next page, or null.

## Other responses

- `400`: Malformed or out-of-range parameter. Not charged.
- `401`: Missing or invalid bearer token.
- `404`: The requested resource does not exist. Not charged.
- `429`: Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.
- `500`: Unexpected server error. Not charged.
- `502`: A data dependency was unavailable. Not charged.
- `503`: Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.

---

[API](https://skmtc.dev/tapetide/apis/tapetide-api.md) · [All operations](https://skmtc.dev/tapetide/apis/tapetide-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tapetide/apis/tapetide-api/revisions/261ec086bde5?raw)
