# Get Bot

> Reads one bot's settings, record and profit curve. On request it adds the bot's trades and how busy its trigger has been.

Source: https://rivo.markets/docs/reference/get-bot

`GET /v2/bots/{id}`

Scope: `read`

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:

```bash
curl "https://api.rivo.markets/v2/bots/signal%3A2c91e7d4-5a3b-4f08-b6e2-91d04f7a3c55?include=trades%2Cactivity&limit=1" \
  -H "Authorization: Bearer rivo_live_..."
```

Python:

```python
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())
```

TypeScript:

```typescript
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

- `id` (string, required): The bot's id, as [List Bots](https://rivo.markets/docs/reference/list-bots) returns it: `trader:<id>`, `signal:<id>` or `market:<id>`.

## Query parameters

- `include` (string, optional): The extra sections to add: `trades` or `activity`. Separate them with commas, or repeat the key.
- `since` (string, optional): With `include=trades`, returns trades opened at or after this time, in ISO 8601 with an offset.
- `result` (string, optional): With `include=trades`, returns trades with this result: `open`, `win` or `loss`.
- `limit` (integer, optional, default `50`): Applies with `include=trades`. The number of rows on each page, from 1 to 200.
- `cursor` (string, optional): Applies with `include=trades`. Pass the `nextCursor` from the previous page to read the next one. A cursor works only on the listing that made it. See [Paging](https://rivo.markets/docs/concepts#paging).

## Example response

```json
{
  "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

- `data` (object): The bot you asked for. You can find its trade count in `record.trades`.
  - `id` (string): The bot's id: `trader:<id>`, `signal:<id>` or `market:<id>`.
  - `name` (string): The bot's name. A trader bot takes its trader's name, and a market bot takes the name of its market or series.
  - `kind` (string): The kind of bot. A `trader` bot copies one trader, a `signal` bot runs a signal, and a `market` bot runs a price rule on one market.
  - `mode` (string): Whether the bot trades on `paper` or `live`. A live bot trades real money. You set it up in the app, and the API can only read it.
  - `summary` (string): What the bot does, in one line.
  - `status` (string): The bot's status: `running`, `paused` or `ended`. A signal bot is never paused. It runs for as long as it exists.
  - `venues` (string[]): The venues the bot trades on.
  - `profit` (number): The bot's profit in USD, from both closed and open trades.
  - `winRate` (number or null): The share of the bot's settled trades that won, from 0 to 1.
  - `lastTradeAt` (string or null): When the bot last traded, in ISO 8601 UTC.
  - `settings` (object): What the bot runs. The response includes only the fields for the bot's kind.
    - `trader` (object): On a trader bot, the trader it copies.
      - `ref` (trader ref): The trader's ref.
      - `name` (string or null): The trader's public name.
    - `signal` (object or null): On a signal bot, the signal, with the same fields [Backtest](https://rivo.markets/docs/reference/backtest) takes. It is `null` when the bot holds settings that only the app can edit.
    - `market` (object): On a market bot, the contract and side it watches.
      - `ref` (market ref): The contract's ref.
      - `title` (string): The contract's title.
      - `outcome` (string): The side the bot trades: `Yes` or `No`.
      - `series` (boolean): Whether the bot follows the repeating series.
    - `rule` (object): On a market bot, the rule, with the same fields `POST /v2/bots` takes.
    - `sizing` (object or null): How much each trade stakes: `{ usd }` or `{ percent, maxUsd }`.
    - `mirrorExits` (boolean): On a trader bot, whether it sells when the trader sells.
    - `alerts` (boolean): Whether the bot sends in-app and Telegram messages.
  - `record` (object): The bot's record.
    - `trades` (integer): The number of trades the bot took.
    - `settled` (integer): The number of trades that settled or closed.
    - `wins` (integer): The number of wins.
    - `losses` (integer): The number of losses.
    - `open` (integer): The number of trades still open.
    - `winRate` (number or null): The share of settled trades that won, from 0 to 1.
    - `realized` (number): The profit from closed trades, in USD.
    - `unrealized` (number): The profit on open trades, in USD.
    - `profit` (number): The closed and open profit added together, in USD.
    - `staked` (number): The dollars the bot staked.
    - `return` (number or null): The profit divided by the dollars staked.
  - `curve` (object[]): The running total of closed profit, one point for each trade.
    - `time` (string): The time of this point, in ISO 8601 UTC.
    - `profit` (number): The total profit up to this point, in USD.
  - `trades` (object): One page of the bot's trades, newest first, when you ask for `include=trades`.
    - `data` (object[]): The trades on this page.
      - `market` (object or null): The market the trade is on. Here `category` and `kind` are always `null`.
        - `ref` (market ref): The market's ref. You can pass it to any `market` filter or to [Get Market](https://rivo.markets/docs/reference/get-market). On a market of several outcomes, it names the whole event.
        - `contract` (market ref or null): The ref of the exact contract. It is the same as `ref` on 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](https://rivo.markets/docs/reference/place-paper-order) or a market bot.
        - `title` (string): The market's title, as the venue writes it.
        - `venue` (string): The venue that lists the market: one of `kalshi`, `polymarket`, `polymarket_us` or `gemini`.
        - `category` (string or null): The market's category: one of `sports`, `politics`, `crypto`, `finance`, `culture`. It is `null` when Rivo has not classified the market.
        - `kind` (string or null): The kind of market, such as `nfl` or `bitcoin`. It is `null` when Rivo has not classified the market yet.
      - `outcome` (string): The side the bot bought.
      - `contracts` (number): The number of contracts bought.
      - `entryPrice` (number): The price paid, from 0 to 1.
      - `price` (number): The price now while the trade is open. Once it closes, this is the exit price or the payout.
      - `profit` (number): The profit in USD.
      - `status` (string): Whether the trade is `open` or `closed`.
      - `result` (string or null): The result once the trade closes: `win`, `loss` or `void`.
      - `openedAt` (string): When the trade opened, in ISO 8601 UTC.
      - `closedAt` (string or null): When the trade closed, in ISO 8601 UTC.
    - `nextCursor` (string or null): Pass this as `cursor` to read the next page. It is `null` on the last page.
  - `activity` (object or null): How busy the bot's trigger has been, when you ask for `include=activity`. It is `null` for a market bot.
    - `trades` (integer): The number of trades the trigger matched in the window.
    - `windowDays` (integer): The length of the window in days, which is 30.
    - `medianTradeUsd` (number or null): The middle trade size, in USD.
    - `lastTradeAt` (string or null): When 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. |
