List Positions
This route returns the open positions of traders who have a winning record in that kind of market, on markets that are still trading. Each row covers one side of one market. It shows the biggest holder, the other holders, what they paid and what the side costs now.
Some venues do not name their traders. On those venues a row shows the side that large buys went to, and lead is null. Rivo refreshes prices from the market activity it already holds and rebuilds the list every few minutes.
Each holder on a row, lead and every one of others, counts as one trade toward your account's 5,000 trades a day.
Example request
curl "https://api.rivo.markets/v2/positions?venue=kalshi&category=sports&limit=1" \
-H "Authorization: Bearer rivo_live_..."import requests
url = "https://api.rivo.markets/v2/positions"
headers = {
"Authorization": "Bearer rivo_live_...",
}
params = [
("venue", "kalshi"),
("category", "sports"),
("limit", "1"),
]
res = requests.get(url, headers=headers, params=params)
res.raise_for_status()
print(res.json())const params = new URLSearchParams([
["venue", "kalshi"],
["category", "sports"],
["limit", "1"],
]);
const res = await fetch(`https://api.rivo.markets/v2/positions?${params}`, {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.RIVO_API_KEY}`,
},
});
if (!res.ok) throw new Error(`Rivo API ${res.status}`);
const { data } = await res.json();Query parameters
venuestringReturns rows from these venues:
kalshi,polymarket,polymarket_usorgemini. To pass several values, repeat the key, up to 50 times. A row matches if it matches any of them.categorystringReturns rows in these categories:
sports,politics,crypto,finance,culture. To pass several values, repeat the key, up to 50 times. A row matches if it matches any of them.kindstringReturns rows in these kinds of market. Each kind belongs to one category:
nfl,college_football,nba,wnba,college_basketball,basketball,mlb,nhl,soccer,tennis,golf,mma,boxing,motorsport,cricket,esports,chess,rugby,olympics,parlay,other_sports,us_elections,us_politics,world_politics,other_politics,bitcoin,ethereum,solana,xrp,other_crypto,fed_rates,economic_data,stocks_indices,companies,commodities,fx,other_finance,mentions,weather,entertainment,tech_ai,health,other_culture. See Kinds of market. To pass several values, repeat the key, up to 50 times. A row matches if it matches any of them.tradertrader refReturns positions this trader holds. Take the trader's
reffrom any row that names them. To pass several values, repeat the key, up to 50 times. A row matches if it matches any of them.marketmarket refReturns rows for this market. The
refcan name one contract or a market with several outcomes. To pass several values, repeat the key, up to 50 times. A row matches if it matches any of them.outcomestringReturns rows for one side of the market. Pass the side's
name(Yes,No,Lakers,Up) or itslabelfrom Get Market, such asMilwaukee. The match ignores case. You must also pass exactly onemarket.priceMinnumberReturns sides that trade at or above this price now, from 0 to 1. Rows with no recent price drop out.
priceMaxnumberReturns sides that trade at or below this price now, from 0 to 1. Rows with no recent price drop out.
minUsdnumberReturns sides that hold at least this many dollars.
minTradersintegerReturns sides that at least this many winning traders hold, from 1 to 100.
backedbooleanSet to
trueto return only positions with a measured record of how bets like them paid. On those rowsrecordis notnull.sortstringdefaultsizeHow to order the positions.
sizesorts by dollars held,newestputs the latest buy first, andmoveputs the biggest price move of the last hour first, in either direction.limitintegerdefault50The number of rows on each page, from 1 to 200.
cursorstringPass the
nextCursorfrom the previous page to read the next one. A cursor works only on the listing that made it. See Paging.
Example response
{
"data": [
{
"market": {
"ref": "a2Fsc2hpOm1hcmtldDpLWE5GTE5GQ05PUlRILTI3LUNISQ",
"contract": "a2Fsc2hpOm1hcmtldDpLWE5GTE5GQ05PUlRILTI3LUNISQ",
"title": "Will Chicago win the Pro Football NFC North Division?",
"venue": "kalshi",
"category": "sports",
"kind": "nfl"
},
"outcome": "Yes",
"outcomeLabel": null,
"entryPrice": 0.2005,
"price": 0.2,
"priceAt": "2026-10-15T02:28:27.319Z",
"usd": 42770.17,
"openedAt": "2026-10-04T08:40:39.804Z",
"lastBoughtAt": "2026-10-12T05:13:29.103Z",
"lead": {
"ref": "kalshi:avidsmores",
"name": "avidsmores",
"winRate": 0.6973,
"profit": 15681.48,
"settled": 935,
"usd": 42770.17,
"entryPrice": 0.2005
},
"others": [],
"split": { "sameSideUsd": 42770.17, "otherSideUsd": 0, "otherSideTraders": 0 },
"activity": null,
"record": null
}
],
"nextCursor": "eyJvIjoxfQ"
}Response fields
dataobject[]The positions on this page.
Show 14 data fields
marketobjectThe market this row is about.
Show 6 market fields
refmarket refThe market's ref. You can pass it to any
marketfilter or to Get Market. On a market of several outcomes, it names the whole event.contractmarket ref or nullThe ref of the exact contract. It is the same as
refon a market with one contract. On a market of several outcomes, such as a game with a moneyline and a spread, it tells the contracts apart. Pass it to Place Paper Order or a market bot.titlestringThe market's title, as the venue writes it.
venuestringThe venue that lists the market: one of
kalshi,polymarket,polymarket_usorgemini.categorystring or nullThe market's category: one of
sports,politics,crypto,finance,culture. It isnullwhen Rivo has not classified the market.kindstring or nullThe kind of market, such as
nflorbitcoin. It isnullwhen Rivo has not classified the market yet.
outcomestringThe side the traders hold:
Yes,No, or a named outcome.outcomeLabelstring or nullThe name the market gives this side, when
YesorNoalone says too little.entryPricenumber or nullThe average price every holder paid, from 0 to 1. Rivo divides their dollars by their contracts.
pricenumber or nullThe price the side trades at now. It is
nullwhen nothing traded recently.priceAtstring or nullWhen Rivo read
price, in ISO 8601 UTC.usdnumberThe dollars on this side. On a venue that does not name its traders, this is the sum of the large buys.
openedAtstringWhen the first buy happened, in ISO 8601 UTC.
lastBoughtAtstringWhen the latest buy happened, in ISO 8601 UTC.
leadobject or nullThe biggest holder, with their record in this kind of market. It is
nullon a venue that does not name its traders.Show 7 lead fields
reftrader refThe trader's ref. You can pass it to any
traderfilter or to Get Trader.namestring or nullThe trader's public name, or
nullwhen they have none. The API never returns a wallet address as a name.winRatenumber or nullThe share of their settled bets the trader won, from 0 to 1. It covers the kind of market this row is about, or their whole record when Rivo has none for that kind. It is
nulluntil they have 10 settled bets.profitnumber or nullThe trader's profit in USD, over the same bets as
winRate.settledintegerThe number of settled bets behind
winRateandprofit.usdnumberThe dollars this trader has put on this side.
entryPricenumber or nullThe average price this trader paid, from 0 to 1.
othersobject[]The other winning holders. Each has the same fields as
lead.Show 7 others fields
reftrader refThe trader's ref. You can pass it to any
traderfilter or to Get Trader.namestring or nullThe trader's public name, or
nullwhen they have none. The API never returns a wallet address as a name.winRatenumber or nullThe share of their settled bets the trader won, from 0 to 1. It covers the kind of market this row is about, or their whole record when Rivo has none for that kind. It is
nulluntil they have 10 settled bets.profitnumber or nullThe trader's profit in USD, over the same bets as
winRate.settledintegerThe number of settled bets behind
winRateandprofit.usdnumberThe dollars this trader has put on this side.
entryPricenumber or nullThe average price this trader paid, from 0 to 1.
splitobjectHow the winning traders' money splits between this side and the other sides of the market.
Show 3 split fields
sameSideUsdnumberThe dollars on this side.
otherSideUsdnumberThe dollars on the other sides.
otherSideTradersintegerThe number of winning traders on the other sides.
activityobject or nullWhat this side did over the last hour. It is
nullwhen Rivo has no reading for the hour.Show 2 activity fields
move1hnumber or nullThe price change over the hour.
volume1hnumber or nullThe dollars traded over the hour.
recordobject or nullHow settled bets like this one did at this price. It is
nullwhen Rivo has no measured record.Show 3 record fields
settledintegerThe number of settled bets in the record.
winRatenumberThe share of those bets that won, from 0 to 1.
maxPricenumberThe highest price at which the record says this bet was worth buying, from 0 to 1.
nextCursorstring or nullPass this as
cursorto read the next page. It isnullon the last page.
The cursor marks a place in the sorted list. If Rivo rebuilds the list between two pages, a row can shift by one place.
Errors
| Code | When |
|---|---|
VALIDATION | A parameter is out of range or unknown. You sent outcome without exactly one market. Or the cursor came from another listing. |