Agent-readable docs index: /llms.txt. Full docs in one file: /llms-full.txt. Download /docs.zip to grep all markdown files locally.
/api/v1/indices/{id}/constituentsGET
Get constituent markets with weights and prices
Authorization
bearerAuth *Bearer <token>
Clerk session JWT, or an API key (the ak_ prefix), sent as a Bearer token or an ?api_key= query parameter. Each endpoint requires the read scope for its resource (e.g. org:rates:read for rates). Token in: header
Query Parameters
page?integer
Page number
Default: 1Min: 1
per_page?integer
Rows per page (max 500). The default holds every current index's basket in one page; when a basket is larger, meta.has_next is true and the remaining rows are on later pages.
Default: 500Min: 1Max: 500
expand?string
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.
flatten?boolean
Boolean alias for expand=markets.
Default: false
search?string
Case-insensitive substring match over ticker and name, applied server-side.
Response
200 · Paginated constituents
data?object[]
Show item properties
kind *"market" | "index"
Discriminator: 'market' for leaf prediction markets, 'index' for composite sub-indices.
market_id *string
Canonical id. For markets: <platform>:<raw_ticker>. For composites: the child index_id.
ticker *string
For markets: raw exchange ticker. For composites: the child index_id.
display_ticker *string
Human-readable market label — Polymarket market slug when present, else the raw ticker.
platform *string
'kalshi'/'polymarket' for markets; 'index' for composite components.
weight *number
This constituent's share of the index, as a fraction of 1 (0.18 means 18 percent). These are the index's stored base weights, which sum to 1 across the full constituent list; a given published price point can differ, because the calculation renormalizes over only the constituents that had a usable price that cycle.
price?numbernull
Latest value for the constituent: for market constituents, the most recent yes-side traded price on the 0-100 cents scale; for sub-index constituents (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.
name?stringnull
Display label for the constituent: the market's question for market rows, and the sub-index's name for kind = index rows.
volume?numbernull
All-time traded volume as a contract/share count (Kalshi contracts, Polymarket shares), not dollars. Present for kind='market' rows only. Unit is in volume_unit.
volume_unit?object | null
Wire unit for volume. See QuantityUnit.
open_interest?numbernull
Open interest: a Kalshi contract count; Polymarket's is USD. Present for kind='market' rows only. Unit is in open_interest_unit.
open_interest_unit?object | null
Wire unit for open_interest. See QuantityUnit.
end_date?string,null (date-time)
When trading closes for a market constituent. Always null for sub-index constituents (kind = index), which do not expire.
state_code?stringnull
Two-letter state code (House/Senate/Gubernatorial); market rows only
city_code?stringnull
City code (Mayoral); market rows only
meta?object
Show properties
total?integer
Total number of records matching the request across every page, not just the number returned in this one.
page?integer
The 1-based page number this response covers.
per_page?integer
Maximum number of items on a page. The last page may hold fewer.
total_pages?integer
Number of pages available at this per_page. It is at least 1, even when nothing matched.
has_next?boolean
True when a page exists after this one.
has_prev?boolean
True when this is not the first page.
403 · The organization has no paid plan, so the realtime read scopes are refused. Distinct from a 429, which means a plan's budget ran out: nothing here resets on a timer, and the request succeeds only once the organization holds a plan.
error *string
Human-readable reason the request was refused.
status *integer
HTTP status code, repeated in the body.
upgrade_url?string (uri)
Page listing the plans and their request allowances, for buying access. Absent when no plan is available for purchase.
404 · Index not found
error?string
Stable, machine-readable code identifying the failure; branch on this rather than on message. One of bad_request, unauthorized, forbidden, not_found, conflict, service_unavailable, upstream_error, service_error, or internal_error.
message?string
Human-readable explanation, safe to show to a user. For client errors it names the specific problem; for server-side failures it is a generic notice and the underlying detail is deliberately withheld.
429 · The paid organization's minute or UTC-day request budget is exhausted.
error *"rate_limited"
Always rate_limited. Branch on this to detect a throttled request.
limit *"rpm" | "daily"
Which limit was hit: rpm for the per-minute cap or daily for the daily one.
message *string
Human-readable explanation naming the limit that was exceeded.
upgrade_url?string (uri)
Page listing the plans and their request allowances, for buying a larger budget. Absent when no plan is available for purchase.
Request example
curl -X GET "https://api.adjacent.markets/api/v1/indices/<id>/constituents" \ -H "Authorization: Bearer <token>"
Response example
{ "data": [ { "kind": "index", "market_id": "presr_kalshi", "ticker": "presr_kalshi", "display_ticker": "presr_kalshi", "platform": "index", "weight": 0.4, "price": 91.5, "name": "Presidential (R)" }, { "kind": "index", "market_id": "senater_kalshi", "ticker": "senater_kalshi", "display_ticker": "senater_kalshi", "platform": "index", "weight": 0.3, "price": 99.0654, "name": "Senate (R)" } ], "meta": { "total": 5, "page": 1, "per_page": 500, "total_pages": 1, "has_next": false, "has_prev": false } }