Get Bot
This route returns one bot with its settings, its record and its profit curve.
include adds extra sections to the response. Each include counts as a request of its own against your 120 requests a minute, so ?include=trades,activity uses 3.
| include | Adds |
|---|---|
trades | Adds the bot's trades, newest first. You can page them with limit and cursor and filter them with since and result. |
activity | Adds how many trades the bot's trigger matched in the last 30 days, their middle size and the newest one. It is null for a market bot. |
Example request
curl "https://api.rivo.markets/v2/bots/signal%3A2c91e7d4-5a3b-4f08-b6e2-91d04f7a3c55?include=trades%2Cactivity&limit=1" \
-H "Authorization: Bearer rivo_live_..."import requests
url = "https://api.rivo.markets/v2/bots/signal%3A2c91e7d4-5a3b-4f08-b6e2-91d04f7a3c55"
headers = {
"Authorization": "Bearer rivo_live_...",
}
params = [
("include", "trades,activity"),
("limit", "1"),
]
res = requests.get(url, headers=headers, params=params)
res.raise_for_status()
print(res.json())const params = new URLSearchParams([
["include", "trades,activity"],
["limit", "1"],
]);
const res = await fetch(`https://api.rivo.markets/v2/bots/signal%3A2c91e7d4-5a3b-4f08-b6e2-91d04f7a3c55?${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();Path parameters
idstringrequiredThe bot's id, as List Bots returns it:
trader:<id>,signal:<id>ormarket:<id>.
Query parameters
includestringThe extra sections to add:
tradesoractivity. Separate them with commas, or repeat the key.sincestringWith
include=trades, returns trades opened at or after this time, in ISO 8601 with an offset.resultstringWith
include=trades, returns trades with this result:open,winorloss.limitintegerdefault50Applies with
include=trades. The number of rows on each page, from 1 to 200.cursorstringApplies with
include=trades. Pass thenextCursorfrom the previous page to read the next one. A cursor works only on the listing that made it. See Paging.
Example response
{
"data": {
"id": "signal:2c91e7d4-5a3b-4f08-b6e2-91d04f7a3c55",
"name": "Kalshi sports buys, 30¢ to 70¢, $5,000 or more",
"kind": "signal",
"mode": "paper",
"summary": "Kalshi sports buys, 30¢ to 70¢, $5,000 or more",
"status": "running",
"venues": ["kalshi"],
"profit": 523.17,
"winRate": 0.5521,
"lastTradeAt": "2026-10-15T01:58:12.000Z",
"settings": {
"signal": {
"entry": "all",
"venue": ["kalshi"],
"category": ["sports"],
"minUsd": 5000,
"priceMin": 0.3,
"priceMax": 0.7
},
"sizing": { "usd": 100 },
"alerts": true
},
"record": {
"trades": 212,
"settled": 192,
"wins": 106,
"losses": 86,
"open": 20,
"winRate": 0.5521,
"realized": 498.6,
"unrealized": 24.57,
"profit": 523.17,
"staked": 19200,
"return": 0.026
},
"curve": [
{ "time": "2026-09-22T19:04:51.000Z", "profit": -100 },
{ "time": "2026-09-23T01:12:08.000Z", "profit": 21.43 }
],
"trades": {
"data": [
{
"market": {
"ref": "a2Fsc2hpOm1hcmtldDpLWE1MQkdBTUUtMjZPQ1QxNDIwMDBNSUxMQUQtTUlM",
"contract": "a2Fsc2hpOm1hcmtldDpLWE1MQkdBTUUtMjZPQ1QxNDIwMDBNSUxMQUQtTUlM",
"title": "Milwaukee wins",
"venue": "kalshi",
"category": null,
"kind": null
},
"outcome": "Yes",
"contracts": 256.41,
"entryPrice": 0.39,
"price": 0.87,
"profit": 123.08,
"status": "open",
"result": null,
"openedAt": "2026-10-14T22:49:10.000Z",
"closedAt": null
}
],
"nextCursor": "eyJvIjoxfQ"
},
"activity": {
"trades": 241,
"windowDays": 30,
"medianTradeUsd": 8420.5,
"lastTradeAt": "2026-10-15T01:58:12.000Z"
}
}
}Response fields
dataobjectThe bot you asked for. You can find its trade count in
record.trades.Show 15 data fields
idstringThe bot's id:
trader:<id>,signal:<id>ormarket:<id>.namestringThe bot's name. A trader bot takes its trader's name, and a market bot takes the name of its market or series.
kindstringThe kind of bot. A
traderbot copies one trader, asignalbot runs a signal, and amarketbot runs a price rule on one market.modestringWhether the bot trades on
paperorlive. A live bot trades real money. You set it up in the app, and the API can only read it.summarystringWhat the bot does, in one line.
statusstringThe bot's status:
running,pausedorended. A signal bot is never paused. It runs for as long as it exists.venuesstring[]The venues the bot trades on.
profitnumberThe bot's profit in USD, from both closed and open trades.
winRatenumber or nullThe share of the bot's settled trades that won, from 0 to 1.
lastTradeAtstring or nullWhen the bot last traded, in ISO 8601 UTC.
settingsobjectWhat the bot runs. The response includes only the fields for the bot's kind.
Show 7 settings fields
traderobjectOn a trader bot, the trader it copies.
Show 2 trader fields
reftrader refThe trader's ref.
namestring or nullThe trader's public name.
signalobject or nullOn a signal bot, the signal, with the same fields Backtest takes. It is
nullwhen the bot holds settings that only the app can edit.marketobjectOn a market bot, the contract and side it watches.
Show 4 market fields
refmarket refThe contract's ref.
titlestringThe contract's title.
outcomestringThe side the bot trades:
YesorNo.seriesbooleanWhether the bot follows the repeating series.
ruleobjectOn a market bot, the rule, with the same fields
POST /v2/botstakes.sizingobject or nullHow much each trade stakes:
{ usd }or{ percent, maxUsd }.mirrorExitsbooleanOn a trader bot, whether it sells when the trader sells.
alertsbooleanWhether the bot sends in-app and Telegram messages.
recordobjectThe bot's record.
Show 11 record fields
tradesintegerThe number of trades the bot took.
settledintegerThe number of trades that settled or closed.
winsintegerThe number of wins.
lossesintegerThe number of losses.
openintegerThe number of trades still open.
winRatenumber or nullThe share of settled trades that won, from 0 to 1.
realizednumberThe profit from closed trades, in USD.
unrealizednumberThe profit on open trades, in USD.
profitnumberThe closed and open profit added together, in USD.
stakednumberThe dollars the bot staked.
returnnumber or nullThe profit divided by the dollars staked.
curveobject[]The running total of closed profit, one point for each trade.
Show 2 curve fields
timestringThe time of this point, in ISO 8601 UTC.
profitnumberThe total profit up to this point, in USD.
tradesobjectOne page of the bot's trades, newest first, when you ask for
include=trades.Show 2 trades fields
dataobject[]The trades on this page.
Show 10 data fields
marketobject or nullThe market the trade is on. Here
categoryandkindare alwaysnull.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 bot bought.
contractsnumberThe number of contracts bought.
entryPricenumberThe price paid, from 0 to 1.
pricenumberThe price now while the trade is open. Once it closes, this is the exit price or the payout.
profitnumberThe profit in USD.
statusstringWhether the trade is
openorclosed.resultstring or nullThe result once the trade closes:
win,lossorvoid.openedAtstringWhen the trade opened, in ISO 8601 UTC.
closedAtstring or nullWhen the trade closed, in ISO 8601 UTC.
nextCursorstring or nullPass this as
cursorto read the next page. It isnullon the last page.
activityobject or nullHow busy the bot's trigger has been, when you ask for
include=activity. It isnullfor a market bot.Show 4 activity fields
tradesintegerThe number of trades the trigger matched in the window.
windowDaysintegerThe length of the window in days, which is 30.
medianTradeUsdnumber or nullThe middle trade size, in USD.
lastTradeAtstring or nullWhen the newest matching trade happened, in ISO 8601 UTC.
Errors
| Code | When |
|---|---|
VALIDATION | A parameter is out of range or unknown, or the cursor came from another listing. |
NOT_FOUND | No bot has that id. |
QUOTA_EXCEEDED | The includes would take the key past its per-minute limit. |