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>
Session token from the app, or an API key (the ak_ prefix), sent as a Bearer token or an ?api_key= query parameter.. Token in: header
Query Parameters
page?integer
Page number
Default: 1Min: 1
per_page?integer
Rows per page (max 500).
Default: 500Min: 1Max: 500
expand?string
markets flattens a composite into its leaf markets, each returned once with the share that entered the published price. Included shares sum to 1.0. A name omitted from that price has weight 0.
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'/'gemini' for markets; 'index' for composite components.
weight *number
Share of the index as a fraction of 1 (0.18 means 18 percent). When the index has a published price, this is that name's share of that price: included shares sum to 1.0, and a name that did not enter is 0. When the index has no published price yet, this is the catalog share.
excluded *boolean
True when a book quality check omitted this constituent from the published price.
exclude_reason?stringnull
The book quality check that omitted this constituent. Present only when excluded is true.
price?numbernull
For a market, the yes-side mid (0-100) that entered the published price. For a child index (kind = index), the child's published level from the same computation. When the index has no published price yet, the latest yes-side trade (markets) or latest published level (child indices). Null when this constituent has never traded or has no published value.
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?integernull
Total number of records matching the request across every page, not just the current one. null on an uncounted list; page using has_next. A relevance-ranked search is uncounted, and a searched events list stays uncounted even with sort. A searched markets list with sort returns a total over the ranked matches (at most 10,000).
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?integernull
Total number of pages available at the current per_page. null whenever total is null; page using has_next.
has_next?boolean
True when a page exists after this one.
has_prev?boolean
True when this is not the first page.
total_capped?boolean
True when total and total_pages reflect the server's counting ceiling rather than the exact matched count: the real set is at least total large. Render such totals as a lower bound (for example "10,000+"). Omitted when the count is exact. A sorted markets search that fills the 10,000-candidate ceiling sets this flag.
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 organization's minute or UTC-day request budget is exhausted, or the organization has reached its cap on requests running at the same time (`limit: "concurrency"`). Wait `Retry-After` seconds before retrying; for a concurrency 429, reduce parallelism.
error *"rate_limited"
Always rate_limited. Branch on this to detect a throttled request.
limit *"rpm" | "daily" | "concurrency"
Which limit was hit: rpm for the per-minute cap, daily for the daily one, or concurrency for the cap on requests running at the same time.
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)", "excluded": false }, { "kind": "index", "market_id": "senater_kalshi", "ticker": "senater_kalshi", "display_ticker": "senater_kalshi", "platform": "index", "weight": 0.3, "price": 99.0654, "name": "Senate (R)", "excluded": false } ], "meta": { "total": 5, "page": 1, "per_page": 500, "total_pages": 1, "has_next": false, "has_prev": false } }