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. Close data typically lands a few minutes after the fill. The API backfills the figures onto recent SOLD entries within minutes rather than waiting for hourly reconciliation.
  • 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. null on parlay entries. See Subject fields.
  • 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.
There is no per-trader live position block. A card values its own 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.
  • tradable is true only while the subject can actually be traded: the market must be funded, unresolved, and before its deadline. A group is tradable only when at least one visible child market meets those conditions.
  • A market inside a group carries groupTitle, groupSlug, and groupImageUrl, so a card can lead with the group question and its artwork while the market’s own title names the outcome. All three are null for a standalone market.
Market subjects also carry lifecycle and price data:
  • createdAt, startAt, and deadline: when the market was created, when trading opened, and when trading closes.
  • resolvedAt: when the market resolved. null until the market resolves. This is the resolution time, not the deadline; a market resolved early carries its actual resolution time.
  • winningOutcomeIndex and payoutNumerators: the resolution result. null until the market resolves.
  • prices: current [yes, no] prices as fractions between 0 and 1, on the same scale as facts.price. A resolved market carries its resolution outcome; an unresolved orderbook market carries its latest stored midpoint. null when no honest price exists, such as an AMM market or a market with no price observations. The API never invents a price.
Group subjects return all lifecycle and price keys as null. A group settles many markets at once and has no single lifecycle or price; use a child market’s own data instead.

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