Prediction markets API
Newest trades across every prediction market
The live, cross-venue tape: every prediction-market trade as it fills, newest first, optionally narrowed to one venue.
/api/external/prediction/prediction-trades-recentWhat it returns
Every prediction-market trade, polymarket and kalshi interleaved by time, newest first — the whole live feed, not one market's tape (that is prediction-trades, keyed on one market id). There is no market or trader filter, only exchange. Only the HEAD of the feed is reachable: there is no cursor or offset, because the source has none that actually pages — a caller who needs the trades AFTER what one response holds has no way to reach them today. marketTitle and eventTitle are resolved from this page's own side-loaded directories and are null when a trade's market or event did not appear there, which is most of them. The trader address, trader username, transaction hash, and event id, slug and image are populated on polymarket only; the yes/no prices (plain, as dollars, and fixed-point), the fixed-point quantity, and the fill count are populated on kalshi only — null on the other venue, never a fabricated zero or empty string.
Chains
This endpoint is not tied to a chain: it takes no chain in its request.
Request
Send your key in the x-dex-data-key header. Replace each <placeholder> with a real value.
curl -H "x-dex-data-key: $DEXDATA_API_KEY" \ "https://api.dexdata.io/api/external/prediction/prediction-trades-recent"
| Parameter | Description |
|---|---|
limitquery · integer · optional | How many rows to return, after the exchange filter. Defaults to 50; at most 1000 — the source's own page ceiling. |
exchangequery · string · optional | Keep only one venue's trades, e.g. "polymarket" or "kalshi". Case-insensitive. A venue with no matching trades on the current page answers an empty list. |
Response fields
A JSON response. Every field is always present; null means the value could not be established, never zero.
| Field | Type | Description |
|---|---|---|
rows | object[] | Newest first, after the exchange filter and then limit. |
rows[].exchange | string | null | The venue that filled this trade, e.g. polymarket or kalshi. Open set: new venues can appear. |
rows[].id | string | null | This trade's id on its venue. |
rows[].marketId | string | null | The market traded, in its venue's own id space. |
rows[].timestamp | number | null | Unix seconds, when the trade filled. |
rows[].side | string | null | The side filled, e.g. yes, no, sell. Open set: new values can appear. |
rows[].price | number | null | Price per share/contract, 0 to 1. |
rows[].quantity | number | null | Shares/contracts traded. |
rows[].outcomeIndex | number | null | Which outcome of the market this trade is on (0-indexed). |
rows[].outcomeLabel | string | null | The outcome traded, e.g. Yes, MOUZ. |
rows[].groupItemTitle | string | null | The sub-market label inside a multi-outcome event, e.g. "75+", "Tie". Null when the market has none. |
rows[].marketTitle | string | null | The market's title, resolved from this page's own side-loaded market directory. Null when this trade's market did not appear in it. |
rows[].eventTitle | string | null | The event's title grouping this market, when known. Null when it cannot be resolved. |
rows[].traderAddress | string | null | The trader's wallet address. Populated on polymarket only; null elsewhere. |
rows[].traderUsername | string | null | The trader's chosen display name, when they set one. Populated on polymarket only; null elsewhere, including a polymarket trader who set none. |
rows[].txHash | string | null | The on-chain transaction hash. Populated on polymarket only; null elsewhere. |
rows[].eventId | string | null | The event id this trade's market belongs to. Populated on polymarket only; null elsewhere. |
rows[].eventSlug | string | null | The event's URL slug. Populated on polymarket only; null elsewhere. |
rows[].image | string | null | An image representing the market or event. Populated on polymarket only; null elsewhere. |
rows[].yesPrice | number | null | The Yes side's implied price, 0 to 1. Populated on kalshi only; null elsewhere. |
rows[].noPrice | number | null | The No side's implied price, 0 to 1. Populated on kalshi only; null elsewhere. |
rows[].yesPriceDollars | string | null | yesPrice as a decimal-string dollar amount. Populated on kalshi only; null elsewhere. |
rows[].noPriceDollars | string | null | noPrice as a decimal-string dollar amount. Populated on kalshi only; null elsewhere. |
rows[].yesPriceE6 | number | null | yesPrice scaled by 1e6 (fixed-point). Populated on kalshi only; null elsewhere. |
rows[].quantityE2 | number | null | quantity scaled by 1e2 (fixed-point). Populated on kalshi only; null elsewhere. |
rows[].countFp | string | null | The fill count, as this venue's own fixed-point decimal string. Populated on kalshi only; null elsewhere. |
Start building with DexData today
Sign in, create a key and make your first call in a minute. Free credits every month, and you only pay for calls that succeed.
Get a free API key