/api/v1/public/indices/{id}/constituentsGETkind=market rows also carry all-time volume + open interest. Returns the {data, meta} envelope, paginated: meta.total counts the rows matching this request, so a search narrows it, and has_next is true when the basket does not fit one page. The default page holds every current index's basket whole.markets flattens a composite index into its leaf markets server-side, each returned once with its effective weight (product of the BASE parent×child weights along the path; sums to ~1.0 for a full composite basket, under 1.0 for a partial basket whose methodology categories are not all linked). Non-composite indices are unaffected; absent, the direct-components shape is kept for back-compat. true is also accepted as an alias for markets.expand=markets.false1Min: 1meta.has_next is true and the remaining rows are on later pages.500Min: 1Max: 500<platform>:<raw_ticker>. For composites: the child index_id.kind = index), the child index's latest published level, which is in index points and not on the 0-100 scale. Null when the constituent has never traded or has no published value yet, and it carries no age bound, so an inactive market's price can be hours old.kind = index rows.volume_unit.volume. See QuantityUnit.open_interest_unit.open_interest. See QuantityUnit.kind = index), which do not expire.message. One of bad_request, unauthorized, forbidden, not_found, conflict, service_unavailable, upstream_error, service_error, or internal_error.curl -X GET "https://api.adjacent.markets/api/v1/public/indices/<id>/constituents"
{ "data": [ { "kind": "index", "market_id": "presr_kalshi", "ticker": "presr_kalshi", "display_ticker": "presr_kalshi", "platform": "index", "weight": 0.4000000059604645, "price": 91.5, "name": "Presidential (R)" } ], "meta": { "total": 5, "page": 1, "per_page": 1, "total_pages": 5, "has_next": true, "has_prev": false } }