Every market on Rain Trade is readable over plain HTTP — no account, no API key, no rate limit. Build a tracker, a bot, a dashboard, or feed the data to an agent.
The Rain Trade market data API is public, read-only and unauthenticated. It serves JSON over HTTPS and sends Access-Control-Allow-Origin: *, so it can be called directly from a browser. The base URL is https://prod-api.rain.trade. All responses share the envelope { statusCode, message, data }, with the payload under data.
Two levels of granularity are exposed. Marketsare pools — an event, which may carry several sub-markets ("Which party will win the House?" → Democratic Party, Republican Party). Binaries are the atomic tradeable unit — one Yes/No leg with its own live price. If you want prices, use /markets/binaries.
curl "https://prod-api.rain.trade/markets/binaries?limit=5&sort=volume"Lists markets (pools) with their nested sub-markets, prices, volume and liquidity. By default only pools that are open for trading are returned.
| Parameter | Type | Notes |
|---|---|---|
tag | string | Category slug, e.g. crypto. Matches the market's primary tag or any of its secondary tags. |
featured | boolean | true returns only editorially featured markets. |
status | string | An exact pool status, e.g. Live. Pass all to drop the open-only default. |
page | integer | 1-based. Defaults to 1. |
limit | integer | Page size. Defaults to 50. |
data.markets[] carries the index record (_id, contractAddress, market_tag, featured, poolImage) with the on-chain pool under poolData — question, status, dates, USD volume and liquidity, participant count, and a subPools[] array whose options[] hold the Yes/No price and percentage. data.pagination carries total, page, limit and totalPages.
GET https://prod-api.rain.trade/markets?limit=1
{
"statusCode": 200,
"message": "Markets fetched successfully",
"data": {
"markets": [
{
"_id": "6a3a99b8327da13393928154",
"contractAddress": "0x9b76c72fcc72262a9e4ced7688f2a8f1229cf276",
"market_tag": "politics",
"featured": true,
"hidden": false,
"poolImage": "https://media-rain-profile.s3.us-east-1.amazonaws.com/...",
"poolData": {
"question": "Which party will win the House in 2026?",
"status": "Live",
"startDate": "2026-06-23T14:37:27.000Z",
"endDate": "2026-11-04T04:59:00.000Z",
"totalVolumeUSD": 212154386030,
"totalLiquidityUSD": 2106000000,
"participantCount": 7,
"subPools": [
{
"subPoolIndex": 1,
"question": "Democratic Party",
"options": [
{ "optionName": "Yes", "choiceIndex": 1, "percentage": 86, "price": 0.86 },
{ "optionName": "No", "choiceIndex": 2, "percentage": 14, "price": 0.14 }
]
}
]
}
}
],
"pagination": { "total": 80, "page": 1, "limit": 1, "totalPages": 80 }
}
}Lists every binary leg across all markets, each with its current price as a probability between 0 and 1. This is the endpoint to poll for odds. Defaults to active legs only.
| Parameter | Type | Notes |
|---|---|---|
tag | string | Category slug. Max 120 characters. |
status | string | One status, a comma-separated list, or the parameter repeated. all disables the active-only default. |
featured | boolean | Featured legs only. |
poolAddress | string | All legs of one pool. A 0x-prefixed 40-character address. |
source | string | rainone or pulsepairs. |
sort | string | order (default), volume, close-time or price. Featured legs lead every sort. |
page | integer | 1-based. Defaults to 1. |
limit | integer | 1–200. Defaults to 50. Above 200 returns 400. |
Unknown query parameters are rejected with 400 Validation Failed and a details array naming the offending key.
GET https://prod-api.rain.trade/markets/binaries?limit=1&sort=volume
{
"statusCode": 200,
"message": "Binaries fetched successfully",
"data": {
"binaries": [
{
"poolAddress": "0x8d756cea7b7f4acf7af6582722b46e0de6ffd14c",
"optionIndex": 6,
"poolId": "6a731837db51af2891267b5f",
"contractAddress": "0x8d756cea7b7f4acf7af6582722b46e0de6ffd14c",
"title": "Will Shimon Mizrahi be the largest shareholder of Maccabi Tel Aviv in 2026?",
"short_title": "Shimon Mizrahi",
"question": "Shimon Mizrahi",
"mergedQuestion": "Will Shimon Mizrahi be the largest shareholder of Maccabi Tel Aviv in 2026?",
"market_tag": "sports",
"tags": ["sports", "business", "finance"],
"featured": false,
"status": "Live",
"leg_status": "Live",
"end_date": "2026-12-31T21:59:00.000Z",
"price": 0.025,
"trading_model": "OrderBook",
"is_ai_resolver": true,
"pool_volume_usd": 1632129.037359,
"pool_liquidity_usd": 2385.342569,
"pool_participant_count": 5,
"is_private": false,
"is_field_leg": false,
"source": "rainone",
"url_path": null
}
],
"pagination": { "total": 321, "page": 1, "limit": 1, "totalPages": 321 }
}
}One market by its _id — the same value returned in data.markets[]._id from /markets, and the id that ends every market URL on the site. Takes no query parameters. The response is a single object under data, identical in shape to one element of data.markets[]. An unknown id returns 404.
GET https://prod-api.rain.trade/markets/6a3a99b8327da13393928154
{
"statusCode": 200,
"message": "Market fetched successfully",
"data": { "_id": "6a3a99b8327da13393928154", "poolData": { ... } }
}
GET https://prod-api.rain.trade/markets/deadbeef → 404
{ "statusCode": 404, "message": "Market not found" }Every category tag in use, with a live count per tag. Takes no query parameters. tags is everything present in the data; configured is the curated, ordered subset the site renders as category tabs. Feed either into ?tag= on the two list endpoints.
GET https://prod-api.rain.trade/markets/tags
{
"statusCode": 200,
"message": "Market tags fetched successfully",
"data": {
"tags": ["crypto", "entertainment", "finance", "other", "politics",
"science", "sports", "tech", "weather"],
"counts": {
"sports": 145, "crypto": 56, "politics": 56, "finance": 47,
"entertainment": 31, "tech": 21, "other": 9, "science": 4
},
"configured": ["sports", "crypto", "science", "finance", "politics",
"entertainment", "weather", "other", "tech"],
"configured_source": "config"
}
}Both list endpoints page with ?page= and ?limit=. page is 1-based and defaults to 1; limit defaults to 50. There is no offset parameter — /markets/binaries?offset=3 returns 400, and /markets?offset=3 silently ignores it and serves page 1. Walk a collection by incrementing page until it exceeds data.pagination.totalPages.
/markets/binaries caps limit at 200 and returns 400 Validation Failed above it. /markets enforces no ceiling today, but do not rely on that — page instead.
GET https://prod-api.rain.trade/markets/binaries?limit=100&page=2
"pagination": { "total": 321, "page": 2, "limit": 100, "totalPages": 4 }No rate limit is currently enforced. The API returns no X-RateLimit-* headers and no 429 responses. Please still be considerate: cache what you can, and poll on the order of seconds rather than continuously. This may change, so handle 429 and Retry-After defensively.
This API is read-only. There is no public write endpoint — placing or cancelling an order, providing liquidity, creating a market and claiming winnings are all on-chain transactions signed by the user's wallet, and go through the app. Anything you build on top of this data is a reader: trackers, dashboards, alerting, research.
Documented against https://prod-api.rain.trade. Endpoints are additive — fields may be added to responses without notice, so parse defensively. Questions: contact support.