---
title: "Index memberships of a stock"
method: GET
path: "/v1/stocks/{symbol}/index-memberships"
tags: ["indices"]
---

# Index memberships of a stock

`GET /v1/stocks/{symbol}/index-memberships`

## Request

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

Observed membership spells of one stock across the 38 tracked indices since March 2026: when each spell was first and last observed, the observed absences that bracket its join and exit (`last_absent_before`, `first_absent_after`), and whether it is current. Pass `date` to keep only spells containing that date (`state: present`); add `include_uncertain=true` to also keep spells whose join or exit bracket contains it (`state: uncertain`). With `date`, `meta.date_status` says whether the date is inside the observed window at all: an empty result is proven non-membership only when it is `in_coverage`, and never for the indices listed in `meta.out_of_coverage_indices`. Pages by index slug.

## Path parameters

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

## Query parameters

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

## Response `200`

OK. Costs one request unit.

- object
  - `data` StockIndexMembershipsItem[], required
    - `index_slug` string, required: Index slug.
    - `index_name` string, required: Index name.
    - `state` 'present' | 'uncertain', nullable, required: With `date`: present when `date` is inside the observed spell, uncertain when it falls only in the unobserved bracket around the join or exit. null without `date`.
    - `member_since` string, required: First observed date of this membership spell (YYYY-MM-DD).
    - `member_through` string, required: Last observed date of this membership spell (YYYY-MM-DD).
    - `current` boolean, required: True when the stock was still a member on the latest observed date.
    - `joined_before_coverage` boolean, required: True when the stock was already a member when observation began, so it joined before `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, nullable, required: The `date` filter, or null.
    - `coverage_from` string, nullable, required: First date this membership history observes (YYYY-MM-DD).
    - `answerable_through` string, nullable, required: Latest date membership answers are complete through, across tracked indices (YYYY-MM-DD).
    - `date_status` 'in_coverage' | 'out_of_coverage', nullable, required: With `date`: out_of_coverage when the date is before observation began or after `answerable_through`, so an empty result says nothing about membership; in_coverage when an index without a row is a proven non-member on that date (unless the stock itself is outside per-index coverage listed in `out_of_coverage_indices`). null without `date`.
    - `out_of_coverage_indices` string[], required: With `date`: slugs of tracked indices whose own observed window does not cover the date (e.g. a stalled index), so a missing row there is not evidence of non-membership. Empty otherwise.
  - `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)
