curl --request GET \
--url https://api.limitless.exchange/feed/tradingimport requests
url = "https://api.limitless.exchange/feed/trading"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.limitless.exchange/feed/trading', 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/feed/trading",
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/feed/trading"
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/feed/trading")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.limitless.exchange/feed/trading")
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{
"requestedAudience": "all",
"effectiveAudience": "all",
"events": [
{
"id": "<string>",
"entryType": "BOUGHT",
"occurredAt": "<string>",
"facts": {},
"profile": {
"id": 123,
"account": "<string>",
"displayName": "<string>",
"username": "<string>",
"pfpUrl": "<string>",
"rankName": "<string>",
"xHandle": "<string>"
},
"subject": {
"kind": "MARKET",
"id": 123,
"slug": "<string>",
"groupSlug": "<string>",
"groupTitle": "<string>",
"groupImageUrl": "<string>",
"title": "<string>",
"status": "<string>",
"imageUrl": "<string>",
"tradable": true,
"createdAt": "<string>",
"startAt": "<string>",
"deadline": "<string>",
"resolvedAt": "<string>",
"winningOutcomeIndex": 123,
"payoutNumerators": [
123
],
"prices": [
123
]
},
"parlay": {
"name": "<string>",
"legs": [
{
"marketId": 123,
"imageUrl": "<string>",
"outcomeLabels": [
"<string>"
],
"outcomeImageUrls": [
"<string>"
],
"leagueName": "<string>",
"homeTeam": "<string>",
"awayTeam": "<string>",
"homeScore": 123,
"awayScore": 123,
"startsAt": "<string>"
}
]
}
}
],
"hasMore": true,
"nextCursor": "<string>",
"emptyReason": "NO_FOLLOWS"
}Get Trading Activity Feed
Returns trading activity from the last 24 hours for one audience: everyone (all), the profiles the signed-in viewer follows (following), or a curated set of featured traders (featured). Entries are Bought, Sold, Resolved, Parlay placed, and Parlay resolved events, newest first.
curl --request GET \
--url https://api.limitless.exchange/feed/tradingimport requests
url = "https://api.limitless.exchange/feed/trading"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.limitless.exchange/feed/trading', 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/feed/trading",
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/feed/trading"
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/feed/trading")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.limitless.exchange/feed/trading")
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{
"requestedAudience": "all",
"effectiveAudience": "all",
"events": [
{
"id": "<string>",
"entryType": "BOUGHT",
"occurredAt": "<string>",
"facts": {},
"profile": {
"id": 123,
"account": "<string>",
"displayName": "<string>",
"username": "<string>",
"pfpUrl": "<string>",
"rankName": "<string>",
"xHandle": "<string>"
},
"subject": {
"kind": "MARKET",
"id": 123,
"slug": "<string>",
"groupSlug": "<string>",
"groupTitle": "<string>",
"groupImageUrl": "<string>",
"title": "<string>",
"status": "<string>",
"imageUrl": "<string>",
"tradable": true,
"createdAt": "<string>",
"startAt": "<string>",
"deadline": "<string>",
"resolvedAt": "<string>",
"winningOutcomeIndex": 123,
"payoutNumerators": [
123
],
"prices": [
123
]
},
"parlay": {
"name": "<string>",
"legs": [
{
"marketId": 123,
"imageUrl": "<string>",
"outcomeLabels": [
"<string>"
],
"outcomeImageUrls": [
"<string>"
],
"leagueName": "<string>",
"homeTeam": "<string>",
"awayTeam": "<string>",
"homeScore": 123,
"awayScore": 123,
"startsAt": "<string>"
}
]
}
}
],
"hasMore": true,
"nextCursor": "<string>",
"emptyReason": "NO_FOLLOWS"
}all and featured audiences; the following audience requires authentication.
When to use
Use this endpoint to render an activity feed of what traders are doing on the platform right now. Choose a global stream, a curated list of featured traders, or a personal stream of the profiles the signed-in viewer follows. The API filters out small activity server-side so the feed stays meaningful.Audiences
Theaudience query parameter selects which profiles the feed reads:
all(default): activity from every profile. Public.featured: activity from a curated set of featured traders. Public.following: activity from the profiles the viewer follows. Requires authentication; an unauthenticated request returns401 Unauthorized.
featured page has no entries, the API serves the all stream instead and sets effectiveAudience: "all" in the response. A new viewer never lands on an empty screen. The returned cursor carries the effective audience, and continuation requests keep paging that same stream.
On the following audience, emptyReason distinguishes two empty states without a second request: NO_FOLLOWS when the viewer follows nobody, NO_RECENT_ACTIVITY when the followed profiles have been quiet. It is null everywhere else.
Entry types
Each entry carries anentryType and a facts object with immutable event-time values:
BOUGHT/SOLD: side, outcome, contracts, execution price, notional, and collateral symbol.SOLDentries also carryrealizedPnl,averageEntryPrice, androiwhen close data fully covers the fill; otherwise those fields arenulland the entry shows the fill only. Close data typically lands a few minutes after the fill. The API backfills the figures onto recentSOLDentries within minutes rather than waiting for hourly reconciliation.RESOLVED: the aggregated result (WON,LOST, orBREAK_EVEN) for a profile in one market or group, with realized PnL, cost basis, payout, and a per-market position breakdown.PARLAY_PLACED/PARLAY_RESOLVED: the pack’s legs, stake, multiplier, and potential payout, plus the payout, realized PnL, and result once resolved.
Display fields
Beyondfacts, each entry carries display data that the API resolves at read time, when you fetch the page:
profile: the trader’s account, display name, username, profile picture, rank name, and connected X handle (xHandle,nullwhen no X account is connected).subject: the market or group the entry is about.nullon parlay entries. See Subject fields.parlay(parlay entries only): the source pack’s name (nullfor a custom parlay or a deleted pack) and ordered leg details, including crest image, named outcomes, league, teams, live score, and fixture kickoff. Useparlay.legs[].startsAtfor match times;facts.legs[].startsAtis the market deadline, not the kickoff.
facts.contracts at the subject’s current prices.
Subject fields
The subject identifies the market (kind: "MARKET") or group (kind: "GROUP") the entry is about, with its id, slug, title, status, and imageUrl card image.
tradableistrueonly while the subject can actually be traded: the market must be funded, unresolved, and before itsdeadline. A group is tradable only when at least one visible child market meets those conditions.- A market inside a group carries
groupTitle,groupSlug, andgroupImageUrl, so a card can lead with the group question and its artwork while the market’s own title names the outcome. All three arenullfor a standalone market.
createdAt,startAt, anddeadline: when the market was created, when trading opened, and when trading closes.resolvedAt: when the market resolved.nulluntil the market resolves. This is the resolution time, not the deadline; a market resolved early carries its actual resolution time.winningOutcomeIndexandpayoutNumerators: the resolution result.nulluntil the market resolves.prices: current[yes, no]prices as fractions between 0 and 1, on the same scale asfacts.price. A resolved market carries its resolution outcome; an unresolved orderbook market carries its latest stored midpoint.nullwhen no honest price exists, such as an AMM market or a market with no price observations. The API never invents a price.
null. A group settles many markets at once and has no single lifecycle or price; use a child market’s own data instead.
Pagination
limitaccepts 1-30 and defaults to 30.- Pass
nextCursorfrom the previous page ascursorto fetch the next page.nextCursorisnullon the last page. - The cursor is opaque and pinned to the audience that issued it. A malformed or tampered cursor returns
400with codeTRADING_FEED_CURSOR_INVALID; a cursor sent with a different audience returns400with codeTRADING_FEED_CURSOR_AUDIENCE_MISMATCH.
Availability
The feed fails closed rather than serving incomplete data:503with codeTRADING_FEED_INITIALIZINGwhile the API is still building the first 24-hour window after a deployment.503with codeTRADING_FEED_STALEwhen the feed is temporarily behind.
Caching
Responses forall and featured carry Cache-Control: public, s-maxage=60, stale-while-revalidate=30, so CDN edges may serve a shared cached copy for up to a minute. following responses are per-viewer and carry private, no-store.
Example
curl "https://api.limitless.exchange/feed/trading?audience=all&limit=10"
{
"requestedAudience": "all",
"effectiveAudience": "all",
"events": [
{
"id": "clob:123456:42",
"entryType": "BOUGHT",
"occurredAt": "2026-09-02T14:03:11.482910Z",
"facts": {
"side": "BUY",
"outcome": "YES",
"contracts": "120",
"price": "0.540000",
"notional": "64.800000",
"symbol": "USDC"
},
"profile": {
"id": 42,
"account": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
"displayName": "Alice",
"username": "alice",
"pfpUrl": "https://...",
"rankName": "Expert",
"xHandle": "alice_trades"
},
"subject": {
"kind": "MARKET",
"id": 9876,
"slug": "will-x-happen-123",
"title": "Will X happen?",
"status": "FUNDED",
"imageUrl": "https://...",
"groupTitle": null,
"groupSlug": null,
"groupImageUrl": null,
"createdAt": "2026-09-01T09:00:00.000000Z",
"startAt": "2026-09-01T10:00:00.000000Z",
"deadline": "2026-09-05T00:00:00.000000Z",
"resolvedAt": null,
"winningOutcomeIndex": null,
"payoutNumerators": null,
"prices": [0.57, 0.43],
"tradable": true
},
"parlay": null
}
],
"hasMore": true,
"nextCursor": "eyJ2IjoxLCJhIjoi...",
"emptyReason": null
}
Query Parameters
Which set of profiles to read. following requires authentication. Defaults to all.
all, following, featured Entries per page (1-30).
1 <= x <= 30Opaque cursor from nextCursor on the previous page. A cursor is pinned to the audience that issued it; sending it with a different audience returns 400.
Response
One page of trading activity, newest first
The audience the request asked for
all, following, featured The audience actually served. Differs from requestedAudience only when a first featured page was empty and fell back to all; the cursor carries this value so continuation requests keep paging the same stream.
all, following, featured Show child attributes
Show child attributes
Pass as cursor with the same audience to fetch the next page; null on the last page
Only meaningful on the following audience: distinguishes a viewer who follows nobody from followed profiles that have been quiet
NO_FOLLOWS, NO_RECENT_ACTIVITY, null