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/indicesGET
Get all available indices
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
Default: 1
per_page?integer
Default: 100Max: 500
Response
200 · List of indices
data?object[]
Show item properties
index_id *string
Stable identifier for the index (for example red). Use it as the {id} path parameter on the index detail, constituents, and price endpoints.
name *string
Full display name of the index.
ticker *string
Short uppercase symbol for the index (for example RED). The detail endpoint accepts either this ticker (case-insensitively) or index_id as its path parameter.
description *string
One-line description of what the index tracks, suitable for a listing card.
constituents_count *integer
Number of constituents in the index: member markets for a market-basket index, or child sub-indices for a composite. A derived index that inherits its book from a base index reports 0 and names that base in base_index_id.
is_composite *boolean
True for a composite index (its constituents are other indices and its price blends child sub-index values); false for a market-basket index (its constituents are exchange markets). Always present, so a client can branch on index kind even when the index has no constituents yet.
office_category *stringnull
The index's declared office category (lowercase, e.g. "senate"), the input to methodology weighting and composite child-weight derivation. Null for composites and uncategorized indices; always present.
latest_price?numbernull
Most recent index level, on the base-100 index scale (100 is neutral; for the probability-based families each point above or below 100 is one percentage point of the blended win probability). Omitted when the index has no computed value yet.
previous_close_1d?numbernull
The index level at the previous daily close, meaning the most recent completed daily close before the current day in US Eastern time, not a rolling 24-hour window. Baseline for change_1d.
change_1d?numbernull
Trailing percent change from the previous completed ET daily close (previous_close_1d) to the live tip. Omitted when there is no prior daily close.
price_change_1d?numbernull
Absolute 1-day change in index points (latest_price minus previous_close_1d), measured against the same previous ET daily close as change_1d. Omitted when there is no prior daily close.
price_change_7d?numbernull
Absolute 7-day change in index points (latest_price minus previous_close_7d), measured against the same daily-close baseline as change_7d. Omitted when there is no daily close that far back.
price_change_30d?numbernull
Absolute 30-day change in index points (latest_price minus previous_close_30d), measured against the same daily-close baseline as change_30d. Omitted when there is no daily close that far back.
price_change_90d?numbernull
Absolute 90-day change in index points (latest_price minus previous_close_90d), measured against the same daily-close baseline as change_90d. Omitted when there is no daily close that far back.
change_7d?numbernull
Trailing percent change from the index value 7 days ago to the live tip, from the daily close series. Omitted when there is no daily close that far back.
change_30d?numbernull
Trailing percent change over the last 30 days. Omitted when there is no daily close that far back.
change_90d?numbernull
Trailing percent change over the last 90 days. Omitted when there is no daily close that far back.
previous_close_7d?numbernull
The index value (daily close) 7 days before the snapshot, the baseline change_7d is measured against, so a client can show the absolute change on the same baseline. Omitted when there is no daily close that far back.
previous_close_30d?numbernull
The index value (daily close) 30 days before the snapshot.
previous_close_90d?numbernull
The index value (daily close) 90 days before the snapshot.
updated_at?string,null (date-time)
Timestamp of latest_price. Omitted when the index has no computed value yet.
methodology?stringnull
Key of the methodology family that defines this index's constituent weighting and level calculation, for example upfi, battleground, or total_return. Null for an index with no methodology recorded.
quote_convention?"percent" | "points"
The unit this index quotes trailing performance in. percent: render the change_* fields. points: render the price_change_* fields, because the level is a point sum and a percent of it carries no meaning.
base_index_id?stringnull
For a total_return index, the composite index it derives its book from; null for every curated family.
created_at?string (date-time)
When the index was created in this API. Returned by the authenticated indices list only.
display_order?integernull
Presentation ordering; lower values sort first, null sorts last.
halted?boolean
True when the latest index value was carried forward because the index fell below its constituent floor.
halt_valid_constituents?integernull
When halted, the valid (priced, guardrail-passing) constituents at the most recent halt cycle. Omitted when not halted.
halt_min_constituents?integernull
When halted, the category constituent floor the index fell below. Omitted when not halted.
halt_reason?stringnull
When halted, a human-readable explanation of the halt, composed from the constituent halt counts. Omitted when not halted.
party_side?"republican" | "democrat"
Which party line the basket is priced on, or null for a non-party index. Drives composition.state_exposure.party_lean (the Dem/Rep axis the state map colors on). Always present so a client can render the side an index carries rather than inferring it.
visibility?"public" | "superuser" | "organization"
Access level of the index. public is visible to everyone; organization is visible to members of listed organizations. Other reserved values may appear on authenticated responses. Omitted on the anonymous public tier, which returns only public indices.
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.
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" \ -H "Authorization: Bearer <token>"
Response example
{ "data": [ { "index_id": "red", "name": "Republican Political Future Index", "ticker": "RED", "description": "Composite of Republican party-line contests across all levels of office in the United States", "constituents_count": 5, "latest_price": 91.3069, "updated_at": "2026-06-20T19:16:06.844983Z", "methodology": "upfi", "created_at": "2026-06-02T14:20:24.299003Z", "display_order": 1, "halted": false }, { "index_id": "blue", "name": "Democratic Political Future Index", "ticker": "BLUE", "description": "Composite of Democratic party-line contests across all levels of office in the United States", "constituents_count": 5, "latest_price": 108.5114, "updated_at": "2026-06-20T19:16:06.740650Z", "methodology": "upfi", "created_at": "2026-06-02T14:20:24.587181Z", "display_order": 2, "halted": false } ], "meta": { "total": 12, "page": 1, "per_page": 20, "total_pages": 1, "has_next": false, "has_prev": false } }