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>",
"title": "<string>",
"status": "<string>",
"imageUrl": "<string>",
"tradable": true
},
"parlay": {
"name": "<string>",
"legs": [
{
"marketId": 123,
"imageUrl": "<string>",
"outcomeLabels": [
"<string>"
],
"outcomeImageUrls": [
"<string>"
],
"leagueName": "<string>",
"homeTeam": "<string>",
"awayTeam": "<string>",
"homeScore": 123,
"awayScore": 123,
"startsAt": "<string>"
}
]
},
"positionNow": {
"contracts": "<string>",
"averageEntryPrice": "<string>",
"currentValue": "<string>",
"payoutIfWins": "<string>",
"unrealizedPnl": "<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>",
"title": "<string>",
"status": "<string>",
"imageUrl": "<string>",
"tradable": true
},
"parlay": {
"name": "<string>",
"legs": [
{
"marketId": 123,
"imageUrl": "<string>",
"outcomeLabels": [
"<string>"
],
"outcomeImageUrls": [
"<string>"
],
"leagueName": "<string>",
"homeTeam": "<string>",
"awayTeam": "<string>",
"homeScore": 123,
"awayScore": 123,
"startsAt": "<string>"
}
]
},
"positionNow": {
"contracts": "<string>",
"averageEntryPrice": "<string>",
"currentValue": "<string>",
"payoutIfWins": "<string>",
"unrealizedPnl": "<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.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, including itsimageUrlcard image and atradableflag that turnsfalseonce the subject can no longer be traded.nullon parlay entries.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.positionNow: the trader’s live position in the subject market as of when the page was fetched, with contracts, average entry price, current value, payout if the position wins, and unrealized PnL.nullwhen there is no open position or no usable price mark.
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",
"groupSlug": null,
"title": "Will X happen?",
"status": "FUNDED",
"imageUrl": "https://...",
"tradable": true
},
"parlay": null,
"positionNow": {
"contracts": "120",
"averageEntryPrice": "0.540000",
"currentValue": "68.400000",
"payoutIfWins": "120.000000",
"unrealizedPnl": "3.600000"
}
}
],
"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