Skip to main content
GET
Get the public trading activity feed
Returns a feed of trading activity from the last 24 hours, newest first. Entries cover buys, sells, market resolutions, and pack (parlay) placements and resolutions. Public for the 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

The audience 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 returns 401 Unauthorized.
If the first 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 an entryType and a facts object with immutable event-time values:
  • BOUGHT / SOLD: side, outcome, contracts, execution price, notional, and collateral symbol. SOLD entries also carry realizedPnl, averageEntryPrice, and roi when close data fully covers the fill; otherwise those fields are null and the entry shows the fill only.
  • RESOLVED: the aggregated result (WON, LOST, or BREAK_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

Beyond facts, 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, null when no X account is connected).
  • subject: the market or group the entry is about, including its imageUrl card image and a tradable flag that turns false once the subject can no longer be traded. null on parlay entries.
  • parlay (parlay entries only): the source pack’s name (null for a custom parlay or a deleted pack) and ordered leg details, including crest image, named outcomes, league, teams, live score, and fixture kickoff. Use parlay.legs[].startsAt for match times; facts.legs[].startsAt is 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. null when there is no open position or no usable price mark.

Pagination

  • limit accepts 1-30 and defaults to 30.
  • Pass nextCursor from the previous page as cursor to fetch the next page. nextCursor is null on the last page.
  • The cursor is opaque and pinned to the audience that issued it. A malformed or tampered cursor returns 400 with code TRADING_FEED_CURSOR_INVALID; a cursor sent with a different audience returns 400 with code TRADING_FEED_CURSOR_AUDIENCE_MISMATCH.

Availability

The feed fails closed rather than serving incomplete data:
  • 503 with code TRADING_FEED_INITIALIZING while the API is still building the first 24-hour window after a deployment.
  • 503 with code TRADING_FEED_STALE when the feed is temporarily behind.
Both are transient; retry later.

Caching

Responses for all 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

Query Parameters

audience
enum<string>
default:all

Which set of profiles to read. following requires authentication. Defaults to all.

Available options:
all,
following,
featured
limit
number
default:30

Entries per page (1-30).

Required range: 1 <= x <= 30
cursor
string

Opaque 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

requestedAudience
enum<string>
required

The audience the request asked for

Available options:
all,
following,
featured
effectiveAudience
enum<string>
required

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.

Available options:
all,
following,
featured
events
object[]
required
hasMore
boolean
required
nextCursor
string | null
required

Pass as cursor with the same audience to fetch the next page; null on the last page

emptyReason
enum<string> | null
required

Only meaningful on the following audience: distinguishes a viewer who follows nobody from followed profiles that have been quiet

Available options:
NO_FOLLOWS,
NO_RECENT_ACTIVITY,
null