curl --request GET \
--url https://api.limitless.exchange/markets/{addressOrSlug}import requests
url = "https://api.limitless.exchange/markets/{addressOrSlug}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.limitless.exchange/markets/{addressOrSlug}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.limitless.exchange/markets/{addressOrSlug}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.limitless.exchange/markets/{addressOrSlug}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.limitless.exchange/markets/{addressOrSlug}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.limitless.exchange/markets/{addressOrSlug}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"id": 7494,
"conditionId": "0x947b8e6812bf8ac27687fa25b642d6a25bf5c7292068e5aef129d9d26e9780b8",
"negRiskRequestId": null,
"description": "<string>",
"collateralToken": {
"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"decimals": 6,
"symbol": "USDC"
},
"title": "<string>",
"proxyTitle": "<string>",
"expirationDate": "<string>",
"expirationTimestamp": 123,
"createdAt": "<string>",
"updatedAt": "<string>",
"categories": [
"<string>"
],
"status": "<string>",
"expired": true,
"creator": {
"name": "Limitless",
"imageURI": "https://limitless.exchange/assets/images/logo.svg",
"link": "https://x.com/trylimitless",
"address": "0x55257A9a03601B0587Ab4752FD42A87c4Bad2e1e"
},
"tags": [
"<string>"
],
"volume": "<string>",
"volumeFormatted": "<string>",
"tokens": {
"yes": "78695809706775235377718830617502491971378663350108823320552375535762230401980",
"no": "8642544735724967665477930445154251213223700833624811358896571351781151616445"
},
"prices": [
123
],
"tradePrices": {
"buy": {
"market": [
0.997,
0.997
],
"limit": [
0.003,
0.003
]
},
"sell": {
"market": [
0.003,
0.003
],
"limit": [
0.997,
0.997
]
}
},
"isRewardable": true,
"slug": "<string>",
"tradeType": "clob",
"marketType": "single",
"priorityIndex": 123,
"winningOutcomeIndex": 123,
"metadata": {
"fee": true,
"isBannered": false,
"isPolyArbitrage": false,
"shouldMarketMake": false
},
"settings": {
"minSize": "50000000",
"maxSpread": 0.035,
"dailyReward": "20",
"rewardsEpoch": "0.013888888888888888",
"c": "3"
},
"logo": "<string>",
"source": "<string>",
"properties": [
{
"propertyKeySlug": "domain",
"value": "sports"
}
],
"frequency": "minutely",
"subFrequency": "minutes_5",
"feedEvents": [
{
"eventType": "NEW_TRADE",
"timestamp": "2025-09-01T11:30:31.000Z",
"user": {
"account": "0xea27f6788F083e6070961d3E52A2e596367E04CC",
"username": null,
"displayName": "GG",
"imageURI": null,
"id": 7080,
"rankName": "Bronze",
"points": "0.00000000",
"name": "GG"
},
"data": {
"title": "DOGE Up or Down - Hourly",
"address": "0x76d3e2098Be66Aa7E15138F467390f0Eb7349B9b",
"strategy": "Buy",
"outcome": "Down",
"contracts": "9.071313",
"txHash": "0xe8a4464daf3561f6be5fef4d1bc64184c4f6fe9d6306ab7297fe7ed63a24df1c",
"symbol": "USDC",
"tradeAmount": "5",
"tradeAmountUSD": "4.999525",
"marketId": 7495,
"slug": "doge-up-or-down-1-hour-1756136880125"
},
"bodyHash": "01100995"
}
]
}Get Market Details
Retrieves market or group data using either an Ethereum address or a slug identifier
curl --request GET \
--url https://api.limitless.exchange/markets/{addressOrSlug}import requests
url = "https://api.limitless.exchange/markets/{addressOrSlug}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.limitless.exchange/markets/{addressOrSlug}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.limitless.exchange/markets/{addressOrSlug}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.limitless.exchange/markets/{addressOrSlug}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.limitless.exchange/markets/{addressOrSlug}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.limitless.exchange/markets/{addressOrSlug}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"id": 7494,
"conditionId": "0x947b8e6812bf8ac27687fa25b642d6a25bf5c7292068e5aef129d9d26e9780b8",
"negRiskRequestId": null,
"description": "<string>",
"collateralToken": {
"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"decimals": 6,
"symbol": "USDC"
},
"title": "<string>",
"proxyTitle": "<string>",
"expirationDate": "<string>",
"expirationTimestamp": 123,
"createdAt": "<string>",
"updatedAt": "<string>",
"categories": [
"<string>"
],
"status": "<string>",
"expired": true,
"creator": {
"name": "Limitless",
"imageURI": "https://limitless.exchange/assets/images/logo.svg",
"link": "https://x.com/trylimitless",
"address": "0x55257A9a03601B0587Ab4752FD42A87c4Bad2e1e"
},
"tags": [
"<string>"
],
"volume": "<string>",
"volumeFormatted": "<string>",
"tokens": {
"yes": "78695809706775235377718830617502491971378663350108823320552375535762230401980",
"no": "8642544735724967665477930445154251213223700833624811358896571351781151616445"
},
"prices": [
123
],
"tradePrices": {
"buy": {
"market": [
0.997,
0.997
],
"limit": [
0.003,
0.003
]
},
"sell": {
"market": [
0.003,
0.003
],
"limit": [
0.997,
0.997
]
}
},
"isRewardable": true,
"slug": "<string>",
"tradeType": "clob",
"marketType": "single",
"priorityIndex": 123,
"winningOutcomeIndex": 123,
"metadata": {
"fee": true,
"isBannered": false,
"isPolyArbitrage": false,
"shouldMarketMake": false
},
"settings": {
"minSize": "50000000",
"maxSpread": 0.035,
"dailyReward": "20",
"rewardsEpoch": "0.013888888888888888",
"c": "3"
},
"logo": "<string>",
"source": "<string>",
"properties": [
{
"propertyKeySlug": "domain",
"value": "sports"
}
],
"frequency": "minutely",
"subFrequency": "minutes_5",
"feedEvents": [
{
"eventType": "NEW_TRADE",
"timestamp": "2025-09-01T11:30:31.000Z",
"user": {
"account": "0xea27f6788F083e6070961d3E52A2e596367E04CC",
"username": null,
"displayName": "GG",
"imageURI": null,
"id": 7080,
"rankName": "Bronze",
"points": "0.00000000",
"name": "GG"
},
"data": {
"title": "DOGE Up or Down - Hourly",
"address": "0x76d3e2098Be66Aa7E15138F467390f0Eb7349B9b",
"strategy": "Buy",
"outcome": "Down",
"contracts": "9.071313",
"txHash": "0xe8a4464daf3561f6be5fef4d1bc64184c4f6fe9d6306ab7297fe7ed63a24df1c",
"symbol": "USDC",
"tradeAmount": "5",
"tradeAmountUSD": "4.999525",
"marketId": 7495,
"slug": "doge-up-or-down-1-hour-1756136880125"
},
"bodyHash": "01100995"
}
]
}venue.exchange and venue.adapter) needed for EIP-712 order signing. Fetch once per market and cache — venue data is static.winningOutcomeIndex, an index into the fixed outcomeTokens: ['Yes', 'No'] array:winningOutcomeIndex: 0— YES resolvedwinningOutcomeIndex: 1— NO resolvednull— either the market is not yet resolved, or it resolved to a split (see below)
0 = Up and 1 = Down. Up is the YES side: the market resolves Up when the reference price ends strictly higher. Picking Up means buying tokens.yes.prices format. On CLOB markets, prices is [yesMidpoint, noMidpoint] as decimal fractions between 0 and 1 (for example [0.715, 0.285]; the pair sums to ≈ 1). AMM markets quote percent-style values between 0 and 100 — the schema example showing values like 42.8 reflects that AMM shape. Branch on tradeType before parsing rather than assuming one scale.metadata.chainlinkDataStream. Read streamType to tell the two apart: "spot" markets resolve on an instantaneous price, while "twap" markets resolve on a time-weighted average over twapWindowSeconds. Resolution compares the closing TWAP against the Price to Beat captured from the same stream at open; greater than or equal resolves Up. The market’s description always names the exact feed, window, and tolerance. See Market Resolution.status: RESOLVED, winningOutcomeIndex: null, and a payoutNumerators array (indexed [YES, NO]) with both entries positive — the ratio defines the payout. [50, 50] pays each side equally; [70, 30] pays YES holders 70% and NO holders 30%. Each side redeems at numerator / sum(numerators) through the same redeem endpoint.Winner-take-all resolutions populate winningOutcomeIndex (0 or 1). Note that payoutNumerators may still be populated on them ([1, 0] / [0, 1]) or may be null, depending on which resolution path wrote the record. Do not branch on the presence of payoutNumerators alone. The reliable split test mirrors the server’s own:const isSplit =
m.status === 'RESOLVED' &&
m.winningOutcomeIndex === null &&
(m.payoutNumerators?.filter(n => n > 0).length ?? 0) >= 2;
tokens.yes / tokens.no to human outcome labels. Every individual market’s token pair is always YES / NO in the API — there is no per-token label field for custom outcomes like “Up” / “Down” or “Norway” / “England”. The mapping to a human label depends on the market type:- Binary single market (e.g. “Will ETH close above $3,000?”):
tokens.yes= the question resolves true,tokens.no= the question resolves false. The market’stitle/proxyTitlecarries the semantic meaning. - Recurring up-or-down price market (CLOB, e.g. “BTC Up or Down 15 Min”): a single binary market whose outcomes are labeled Up/Down. Up is the YES side: the market resolves Up when the reference price ends strictly higher than the open. Picking Up = buying
tokens.yes; picking Down = buyingtokens.no. - Directional AMM market (e.g. “BTC Up or Down - 5 Min”): each direction is a separate individual market.
tokens.yeson the “Up” market = betting on Up;tokens.noon the same market = the opposite side of that bet. To find the “Down” side, fetch the sibling market from the group. - NegRisk group market (e.g. “Norway vs England: team to advance?”): the group response returns
outcomeTokens: string[](for example["Norway", "England"]) andmarkets[], one submarket per outcome. To trade a specific outcome, callgetMarket()on that submarket’s slug and use itstokens.yes— that YES token represents “this outcome resolves true”. See the NegRisk overview and the TypeScript NegRisk group markets walkthrough.
tokens.up / tokens.down field — always resolve labels from the group’s outcomeTokens array or from the submarket title / proxyTitle.volume field (raw, base units) and volumeFormatted (human-readable USDC). The API does not expose a rolling 24-hour volume field; for time-windowed activity, derive it client-side from Get Feed Events (filter trade events by timestamp).status values. The response’s status field is one of:FUNDED— the market is live and accepting trades. The default for active markets.LOCKED— trading is paused on the market: orders cannot be placed or filled, but existing positions remain. A market typically entersLOCKEDshortly before resolution (after the deadline, while the winning outcome is being determined) or when an operator manually halts it. The market resumes asFUNDEDif unlocked, or transitions toRESOLVEDonce the outcome is set.RESOLVED— the winning outcome is known.winningOutcomeIndexis populated and winners can redeem their CTF positions. See Lifecycle after a trade.FUNDED_FLAGGED— the market is live but flagged for review (for example, pending resolution clarification). Treat it asFUNDEDfor trading purposes unless your integration wants to surface the flag to users.DRAFT— the market exists but has not been funded yet and is not tradeable.
settings object carries takerDelayMs — the market’s taker delay in milliseconds (0 = none, the default). When it is greater than 0, the matching engine briefly holds marketable (taker) orders before filling them, and order submission becomes asynchronous. The create-order response returns settlementStatus: "DELAYED" with an eligibleAt; track the fill over subscribe_order_events. Read settings.takerDelayMs to detect delay-enabled markets before placing taker orders. postOnly (maker) orders are never delayed.Path Parameters
Query Parameters
Response
Market or group details with pricing and volume data
- Option 1
- Option 2
- Option 3
CLOB market with position IDs and trading data
Market ID
7494
Condition ID
"0x947b8e6812bf8ac27687fa25b642d6a25bf5c7292068e5aef129d9d26e9780b8"
NegRisk request ID
null
Market description
Show child attributes
Show child attributes
Market title
Proxy title
Expiration date
Expiration timestamp
Created timestamp
Updated timestamp
Categories
Market status
Is expired
Show child attributes
Show child attributes
Tags
Volume
Formatted volume
Show child attributes
Show child attributes
Prices
Show child attributes
Show child attributes
Is rewardable
Market slug
Trade type
"clob"
Market type
"single"
Priority index
Winning outcome index
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Market logo
Market source (e.g. ugm:crypto, ugm:sports)
Admin-assigned market analytics properties
Show child attributes
Show child attributes
Schedule frequency for timeline
"minutely"
Schedule sub-frequency for timeline
"minutes_5"
Feed events
Show child attributes
Show child attributes