Get Paper Account
This route returns the paper account: totals for the whole account, and its positions. It shows open positions by default. It lists positions you placed by hand and positions held by paper bots together, and tags each one with its source.
include=orders adds every paper order you placed by hand, newest first. The orders page with their own cursor, ordersCursor. Each sale carries profit, measured against the average cost of what you held.
Market bots keep their trades on the bot itself. You can find them in Get Bot, not here.
Example request
curl "https://api.rivo.markets/v2/paper?status=open&include=orders" \
-H "Authorization: Bearer rivo_live_..."import requests
url = "https://api.rivo.markets/v2/paper"
headers = {
"Authorization": "Bearer rivo_live_...",
}
params = [
("status", "open"),
("include", "orders"),
]
res = requests.get(url, headers=headers, params=params)
res.raise_for_status()
print(res.json())const params = new URLSearchParams([
["status", "open"],
["include", "orders"],
]);
const res = await fetch(`https://api.rivo.markets/v2/paper?${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
statusstringdefaultopenWhich positions to return:
open,settledorall.sourcestringdefaultallWhich positions to return by where they came from:
hand,botorall.botstringReturns only one bot's positions. Pass its id, such as
trader:<id>orsignal:<id>.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.marketmarket refReturns positions on this contract. Pass the contract's
ref. Repeat the key to pass several, up to 50.includestringSet to
ordersto add your hand-placed paper orders.sincestringWith
include=orders, returns orders at or after this time, in ISO 8601 with an offset.ordersCursorstringWith
include=orders, pass theorders.nextCursorfrom the previous page to read the next one.limitintegerdefault50The number of rows on each page, from 1 to 200. It applies to both positions and orders.
cursorstringPass the
positions.nextCursorfrom the previous page to read the next one.
Example response
{
"data": {
"totals": {
"openUsd": 1842.6,
"unrealized": 63.18,
"realized": 412.95,
"winRate": 0.5833
},
"positions": {
"data": [
{
"market": {
"ref": "a2Fsc2hpOm1hcmtldDpLWE1MQkdBTUUtMjZPQ1QxNDIwMDBNSUxMQUQtTUlM",
"contract": "a2Fsc2hpOm1hcmtldDpLWE1MQkdBTUUtMjZPQ1QxNDIwMDBNSUxMQUQtTUlM",
"title": "Milwaukee wins",
"venue": "kalshi",
"category": "sports",
"kind": "mlb"
},
"outcome": "Yes",
"contracts": 284,
"entryPrice": 0.8796,
"price": 0.89,
"cost": 249.81,
"value": 252.76,
"profit": 2.95,
"status": "open",
"result": null,
"source": "hand",
"bot": null,
"openedAt": "2026-10-15T02:31:07.412Z",
"settledAt": null
},
{
"market": {
"ref": "a2Fsc2hpOm1hcmtldDpLWE5GTE5GQ05PUlRILTI3LUNISQ",
"contract": "a2Fsc2hpOm1hcmtldDpLWE5GTE5GQ05PUlRILTI3LUNISQ",
"title": "Will Chicago win the Pro Football NFC North Division?",
"venue": "kalshi",
"category": "sports",
"kind": "nfl"
},
"outcome": "Yes",
"contracts": 500,
"entryPrice": 0.2,
"price": 0.2,
"cost": 100,
"value": 100,
"profit": 0,
"status": "open",
"result": null,
"source": "bot",
"bot": { "id": "trader:8d3f2a61-0c4e-4b7a-9f15-2e6a1c9b4d70", "name": "avidsmores" },
"openedAt": "2026-10-12T05:13:31.000Z",
"settledAt": null
}
],
"nextCursor": null
},
"orders": {
"data": [
{
"id": "5b7e0c1a-2f4d-4c8e-9a61-3d2f7b9e0a14",
"market": {
"ref": "a2Fsc2hpOm1hcmtldDpLWE1MQkdBTUUtMjZPQ1QxNDIwMDBNSUxMQUQtTUlM",
"contract": "a2Fsc2hpOm1hcmtldDpLWE1MQkdBTUUtMjZPQ1QxNDIwMDBNSUxMQUQtTUlM",
"title": "Milwaukee wins",
"venue": "kalshi",
"category": "sports",
"kind": "mlb"
},
"outcome": "Yes",
"action": "buy",
"contracts": 284,
"avgPrice": 0.8796,
"cost": 249.81,
"unfilledContracts": 0,
"filledAt": "2026-10-15T02:31:07.412Z"
}
],
"nextCursor": null
}
}
}Response fields
dataobjectThe paper account.
Show 3 data fields
totalsobjectTotals for the whole account. Filters do not change them.
Show 4 totals fields
openUsdnumberWhat your open holdings are worth now, in USD.
unrealizednumberThe profit on your open holdings, in USD.
realizednumberThe profit from settled holdings and sales, in USD.
winRatenumber or nullThe share of settled holdings that won, from 0 to 1. It is
nulluntil a holding settles.
positionsobjectOne page of positions.
Show 2 positions 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 holding is on.
contractsnumberThe number of contracts held.
entryPricenumberThe average price paid, from 0 to 1.
pricenumberThe side's price now, or its payout once the market settles.
costnumberThe contracts multiplied by
entryPrice, in USD.valuenumberWhat the holding is worth now, in USD.
profitnumberThe profit in USD, which is
valueminuscost.statusstringWhether the holding is
openorsettled.resultstring or nullThe result once the market settles:
win,lossorvoid.sourcestringWhere the holding came from.
handmeans you placed it with a paper order, andbotmeans a paper bot holds it.botobject or nullThe bot that holds this position. It is
nullfor a holding you placed by hand.Show 2 bot fields
idstringThe bot's id, as List Bots returns it.
namestringThe bot's name.
openedAtstringWhen the holding opened, in ISO 8601 UTC.
settledAtstring or nullWhen the holding settled, in ISO 8601 UTC.
nextCursorstring or nullPass this as
cursorto read the next page. It isnullon the last page.
ordersobjectOne page of the paper orders you placed by hand, when you ask for
include=orders.Show 2 orders fields
dataobject[]The orders on this page, newest first.
Show 10 data fields
idstringThe paper order's id.
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 traded, using the name that Get Market gives it.
actionstringWhether the order bought or sold:
buyorsell.contractsnumberThe number of contracts that filled.
avgPricenumberThe average price for each contract, from 0 to 1, with the venue's fee included.
costnumberWhat the buy cost, or what the sale brought in, in USD with the fee included.
unfilledContractsnumberThe contracts the book could not fill right away. Paper orders never rest on the book, so Rivo drops this part.
filledAtstringWhen the order filled, in ISO 8601 UTC.
profitnumber or nullOn a sale, the profit measured against the average cost of what you held.
nextCursorstring or nullPass this as
ordersCursorto read the next page. It isnullon the last page.
Rivo prices open holdings from the prices it already holds for each market. A holding settles once Rivo records the market's result.
Errors
| Code | When |
|---|---|
VALIDATION | A parameter is out of range or unknown, or a cursor came from another listing. |