Market metadata is current; historical snapshot/trade data has not yet reached 31 days (Polymarket from 2026-03-14, Kalshi from 2026-03-17). See Data availability.
GET /v1/markets
Paginated list of prediction markets from Polymarket and Kalshi. Filter by source, symbol, market_type, or active status.
Minimum tier: Free | Credits: 25 flat per request
GET https://kwery-api.com/v1/markets
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
api-key | string | Yes | — | Your API key. Send via X-API-Key header (recommended) or api-key query parameter. See Authentication. |
source | string | No | — | Filter by source platform: polymarket, kalshi. Omit for all prediction market sources. |
symbol | string | No | — | Filter by underlying asset (e.g. BTC, ETH). |
active | boolean | No | — | Filter by active status. true = tradable markets, false = resolved/expired. (Query name per OpenAPI.) |
limit | integer | No | 50 | Number of results to return. Range: 1–500. |
after | string | No | — | Cursor for pagination. Pass the next_cursor value from a previous response. |
The
offsetparameter is deprecated as of v1.6.0. Useafterwith themeta.next_cursorvalue for pagination.
For single-market lookups, use GET /v1/markets/{identifier}. The {identifier} path parameter accepts any of: market_id (numeric), condition_id (0x-prefixed hex), or event slug (human-readable string).
Response fields
Each object in data contains the following fields:
| Field | Type | Description |
|---|---|---|
market_id | string | Unique market identifier (source-specific). |
source | string | "polymarket" or "kalshi". |
slug | string | URL-friendly market slug. |
question | string | Human-readable market question (e.g. "Will BTC close above $100k on March 31?"). |
symbol | string | Underlying asset symbol. |
market_type | string | Market type (e.g. binary). |
start_date | string | ISO 8601 market open time. |
end_date | string | ISO 8601 market close / expiry time. |
is_active | boolean | Whether the market is currently tradable. |
resolution | string | null | Outcome ("yes", "no", or null if unresolved). |
resolved_at | string | null | ISO 8601 resolution timestamp, or null. |
final_volume | number | null | Total traded volume at resolution, or null. |
final_liquidity | number | null | Liquidity at resolution, or null. |
tokens | object | Source-specific token identifiers. For Polymarket: { clob_token_up, clob_token_down, condition_id }. For Kalshi: { ticker, series_ticker }. |
Response headers
| Header | Description |
|---|---|
X-Credits-Charged | Total credits consumed by this request. |
X-RateLimit-Remaining | Requests remaining in the current rate-limit window. |
X-RateLimit-Reset | ISO 8601 timestamp when the rate-limit window resets. |
Example request
Send your API key in the X-API-Key header (recommended) or as the api-key query parameter. Examples below use the header.
import requests
resp = requests.get(
"https://kwery-api.com/v1/markets",
headers={"X-API-Key": "YOUR_KEY"},
params={
"source": "polymarket",
"symbol": "BTC",
"active": True,
"limit": 2,
},
)
data = resp.json()Query parameter alternative: Add api-key=YOUR_KEY to the URL for quick tests; the header is recommended for production.
Example response
{
"data": [
{
"market_id": "0xabc123",
"source": "polymarket",
"slug": "btc-above-100k-march-2026",
"question": "Will BTC close above $100,000 on March 31, 2026?",
"symbol": "BTC",
"market_type": "binary",
"start_date": "2026-03-01T00:00:00Z",
"end_date": "2026-03-31T23:59:59Z",
"is_active": true,
"resolution": null,
"resolved_at": null,
"final_volume": null,
"final_liquidity": null,
"tokens": {
"clob_token_up": "0xtoken_up_789",
"clob_token_down": "0xtoken_down_012",
"condition_id": "0xdef456"
}
},
{
"market_id": "0xdef789",
"source": "polymarket",
"slug": "btc-above-110k-march-2026",
"question": "Will BTC close above $110,000 on March 31, 2026?",
"symbol": "BTC",
"market_type": "binary",
"start_date": "2026-03-01T00:00:00Z",
"end_date": "2026-03-31T23:59:59Z",
"is_active": true,
"resolution": null,
"resolved_at": null,
"final_volume": null,
"final_liquidity": null,
"tokens": {
"clob_token_up": "0xtoken_up_abc",
"clob_token_down": "0xtoken_down_def",
"condition_id": "0xghi012"
}
}
],
"meta": {
"symbol": "BTC",
"source": "polymarket",
"interval": null,
"count": 2,
"next_cursor": "eyJpZCI6IjB4ZGVmNzg5In0="
}
}
Source-specific behavior
| Behavior | Polymarket | Kalshi |
|---|---|---|
| Market ID format | Hex condition ID (0x...) | Ticker string (KXBTCD-26MAR14-67500) |
| Price denomination | 0–1 (probability) | 0–100 (cents) |
tokens fields | clob_token_up, clob_token_down, condition_id | ticker, series_ticker |
| Resolution values | "yes" / "no" | "yes" / "no" |
Tier access
| Tier | Access |
|---|---|
| Free | Active markets only (active=true in queries). Resolved markets may require a higher tier. |
| Pro | All markets (active and resolved). |
| Business | All markets (active and resolved). |
Errors
| Status | Code | Description |
|---|---|---|
400 | invalid_source | The source value is not polymarket or kalshi. |
400 | invalid_symbol | The symbol parameter is not recognized. |
403 | tier_locked | Free-tier request attempted to access resolved markets. |
429 | rate_limit_exceeded | You have exceeded your per-second or per-minute request quota. |