# Migrate from v1

> v1 is deprecated and stops answering on December 14, 2026. This guide shows where each v1 route went and what to change.

Source: https://rivo.markets/docs/migrate-from-v1

> **v1 stops answering:** Rivo deprecated v1 on October 15, 2026, and v1 stops answering on December 14, 2026. Your existing keys already work on v2.

We built v2 around what the API does best: reading trades and market moves, looking up markets and traders, testing ideas and running them on paper. Most v1 calls have a direct replacement in v2, and several v1 calls now share a single v2 route.

## What changes in every call

|  | v1 | v2 |
| --- | --- | --- |
| Base | `/v1` | `/v2` |
| Success body | `{ "success": true, "data": ... }` | `{ "data": ... }`, plus `nextCursor` on a list |
| Failure body | `{ "success": false, "error", "code" }` | The same, with the same codes |
| Paging | Offsets on some routes | `limit` and `cursor` everywhere |
| Traders | `/{platform}/{traderId}` in the path | A trader ref, like markets |
| Several values | Comma lists or arrays in a body | Repeat the query key |
| Scopes | `read`, `write`, `trade` | `read` and `write`; a `trade` key works as `write` |

## Where each v1 route went

| v1 | v2 |
| --- | --- |
| `GET /v1/feed`, `POST /v1/events` | [`GET /v2/trades`](https://rivo.markets/docs/reference/list-trades) |
| `GET /v1/stream` | [`GET /v2/stream`](https://rivo.markets/docs/reference/stream) |
| `GET /v1/markets/search` | [`GET /v2/markets`](https://rivo.markets/docs/reference/list-markets) |
| `GET /v1/markets/{marketRef}` | [`GET /v2/markets/{ref}`](https://rivo.markets/docs/reference/get-market) |
| `GET /v1/traders` | [`GET /v2/traders`](https://rivo.markets/docs/reference/list-traders) |
| `GET /v1/traders/{platform}/{traderId}`, `POST /v1/traders/compare` | [`GET /v2/traders/{ref}`](https://rivo.markets/docs/reference/get-trader), called once for each trader |
| `GET /v1/universe`, `POST /v1/backtest`, `/sweep`, `/compare`, `/breakdown` | [`POST /v2/backtest`](https://rivo.markets/docs/reference/backtest) with `holdout`, `sweep` or `breakdown` |
| `/v1/strategies`, follows and paper autopilot | [`/v2/bots`](https://rivo.markets/docs/reference/list-bots): trader, signal and market bots on paper |
| `POST /v1/paper-orders`, `GET /v1/portfolio` (paper) | [`POST /v2/paper-orders`](https://rivo.markets/docs/reference/place-paper-order), [`GET /v2/paper`](https://rivo.markets/docs/reference/get-paper-account) |
| `GET /v1/alerts`, market alerts | Alerts stay in the app. Through the API, filter [trades](https://rivo.markets/docs/reference/list-trades) and [moves](https://rivo.markets/docs/reference/list-moves), or open the [stream](https://rivo.markets/docs/reference/stream). |
| `POST /v1/orders`, `/v1/positions/sell`, `/v1/exits`, live autopilot, `/v1/copy-executions` | v2 does not include these. Live trading happens in the app, where you can switch a bot to live once it has proved itself on paper. |
| `/v1/webhooks` | v2 does not include webhooks. The [stream](https://rivo.markets/docs/streaming) sends you trades and moves instead. |

## Find the v1 calls you missed

Every v1 response includes a `Deprecation` header with the date Rivo deprecated v1, a `Sunset` header with the date v1 stops answering, and a `Link` header that points to this page. Log these headers or alert on them to find any v1 calls you missed.

```bash
curl -sI "https://api.rivo.markets/v1/universe" -H "Authorization: Bearer $RIVO_API_KEY" | grep -iE "deprecation|sunset|link"
```

## A worked example

v1:

```bash
curl "https://api.rivo.markets/v1/feed?platform=kalshi&limit=50&offset=100" \
  -H "Authorization: Bearer $RIVO_API_KEY"
```

v2:

```bash
curl "https://api.rivo.markets/v2/trades?venue=kalshi&limit=50&cursor=<nextCursor>" \
  -H "Authorization: Bearer $RIVO_API_KEY"
```

The v1 reference stays available under [v1 (legacy)](https://rivo.markets/docs/api/universe) until v1 stops answering.
