---
title: "Index constituents on a date"
method: GET
path: "/v1/indices/{slug}/constituents"
tags: ["indices"]
---

# Index constituents on a date

`GET /v1/indices/{slug}/constituents`

## Request

- Base URL: `https://api.tapetide.com`
- URL: `https://api.tapetide.com/v1/indices/{slug}/constituents`
- Auth: HTTP bearer

Stocks proven to be members of the index on `date` (default: the latest answerable date for this index), with `state: present`. Membership is observed from daily snapshots, so a join or exit is known only to within a bracket: the stock was last seen outside the index on `last_absent_before` and first seen inside on `member_since` (and the same for an exit, `member_through` / `first_absent_after`). A date inside such a bracket is not guessed: by default those stocks are left out; pass `include_uncertain=true` to also list them with `state: uncertain`. Membership history is observed from March 2026 for 38 NSE and BSE indices (check `has_constituents` in the catalogue). `meta` states this index's observed window and `answerable_through`; a date outside it is out of coverage and rejected with a 400 (`details.reason: out_of_coverage`) that states the window, because no observation exists to answer it. Pages by symbol.

## Path parameters

- `slug` string, required: Index slug from `/v1/reference/indices`, e.g. "nifty-50", "nifty-bank", "india-vix".

## Query parameters

- `date` string
- `include_uncertain` boolean
- `limit` integer
- `cursor` string

## Response `200`

OK. Costs one request unit.

- object
  - `data` IndexConstituentsItem[], required
    - `symbol` string, required: Stock symbol.
    - `name` string, nullable, required: Company name.
    - `isin` string, nullable, required: ISIN of the equity share.
    - `state` 'present' | 'uncertain', required: present: `date` falls inside the observed spell. uncertain (only with `include_uncertain=true`): `date` falls in the unobserved bracket around this spell's join or exit, so membership on that day is plausible but not proven.
    - `member_since` string, required: First observed date of the membership spell containing (or bracketing) the requested date. Membership may predate it when `joined_before_coverage` is true (YYYY-MM-DD).
    - `member_through` string, required: Last observed date of that spell. Equals the latest answerable date for current members (YYYY-MM-DD).
    - `joined_before_coverage` boolean, required: True when the stock was already a member on the first observed date, so the real joining date is earlier than `member_since`.
    - `last_absent_before` string, nullable, required: Last observed date the stock was NOT a member before this spell (YYYY-MM-DD). The real join day is after it and on or before `member_since`. null when the spell starts at the beginning of observation (`joined_before_coverage`).
    - `first_absent_after` string, nullable, required: First observed date the stock was no longer a member after this spell (YYYY-MM-DD). The real exit day is after `member_through` and on or before it. null while the spell is current.
  - `meta` object, 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.
    - `date` string, required: As-of date answered (YYYY-MM-DD).
    - `coverage_from` string, nullable, required: First date this membership history observes (YYYY-MM-DD).
    - `observed_through` string, nullable, required: Latest observed snapshot date (YYYY-MM-DD).
    - `answerable_through` string, nullable, required: Latest date membership answers are complete through (YYYY-MM-DD): the earlier of the latest observation and the latest date folded into the membership history. Dates after it are out of coverage, not absent.
    - `lag_days` integer, nullable, required: Days the folded membership history trails the latest observation. 0 when current; null when unknown.
  - `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)
