Быстрый старт

От нуля до живого подписчика примерно за пять минут. Вы создадите поток, опубликуете в него пакет, подпишетесь и увидите, как он приходит, затем отключитесь и возобновите с курсора, ничего не потеряв.

Получите API-ключ

Каждому запросу, кроме эндпоинтов health и version, нужен ключ в заголовке Authorization. Для этого прохождения можно использовать публичный демо-ключ (только для чтения и с ограничением частоты) либо ваш собственный ключ из панели управления, когда у вас появится аккаунт.

bash
# ваш собственный ключ из панели управления
export RUNNEV_API_KEY="rnv_live_00112233445566778899aabbccddeeff"

# проверка связи — авторизация не нужна
curl https://runnev.dev/v1/health
# {"status":"ok","uptime_s":1843302}

1. Создайте поток

Потоки идентифицируются по base62-идентификатору. Пусть сервер назначит его сам:

bash
curl https://runnev.dev/v1/streams \
  -H "Authorization: Bearer $RUNNEV_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"quickstart","retention_seconds":3600}'
201 Created
{
  "id": "RqrkHXc9bOQs9VlDT836jx",
  "name": "quickstart",
  "created_at": "2026-08-04T11:00:00Z",
  "retention_seconds": 3600,
  "max_bytes": 268435456,
  "cursor": 0,
  "bytes_stored": 0,
  "mode": "json"
}

Сохраните этот id; его использует любой другой вызов. Экспортируйте его для удобства:

bash
export STREAM="RqrkHXc9bOQs9VlDT836jx"

2. Опубликуйте пакет

Основной путь записи помещает номер в URL. Начните с 1. Именно то, что номер выбираете вы сами, делает публикации идемпотентными — подробно об этом на странице Публикация.

bash
curl https://runnev.dev/v1/streams/$STREAM/1 \
  -H "Authorization: Bearer $RUNNEV_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"events":[{"type":"hello","msg":"first batch"}]}'
202 Accepted
{"stream_id":"RqrkHXc9bOQs9VlDT836jx","seq":1,"accepted":1,"cursor":1,"duplicate":false}

3. Подпишитесь

Откройте второй терминал и держите подписку открытой. Флаг -N говорит curl не буферизовать, поэтому вы видите пакеты по мере поступления. По умолчанию подписка начинается с головы, так что опубликуйте снова из первого терминала и посмотрите, как это появится.

терминал 2 — подписка
curl -N "https://runnev.dev/v1/streams/$STREAM?cursor=0" \
  -H "Accept: text/event-stream" \
  -H "Authorization: Bearer $RUNNEV_API_KEY"
server-sent events
: runnev

id: 1
event: batch
data: {"seq":1,"ts":"2026-08-04T11:00:12.418Z","events":[{"type":"hello","msg":"first batch"}]}

: keepalive

Строка, начинающаяся с двоеточия, — это кадр-комментарий. Runnev отправляет такой каждые 15 секунд, когда поток простаивает, чтобы посредники и клиенты могли отличить здоровое тихое соединение от мёртвого.

4. Возобновите с курсора

Остановите подписчика по Ctrl-C. Опубликуйте ещё пару пакетов, пока он отключён:

терминал 1
curl https://runnev.dev/v1/streams/$STREAM/2 \
  -H "Authorization: Bearer $RUNNEV_API_KEY" \
  -d '{"events":[{"type":"tick","n":2}]}'
curl https://runnev.dev/v1/streams/$STREAM/3 \
  -H "Authorization: Bearer $RUNNEV_API_KEY" \
  -d '{"events":[{"type":"tick","n":3}]}'

Теперь переподключитесь, начав после номера 1. Вы сразу получите 2 и 3, а затем — вживую:

терминал 2 — возобновление
curl -N "https://runnev.dev/v1/streams/$STREAM?cursor=1" \
  -H "Accept: text/event-stream" \
  -H "Authorization: Bearer $RUNNEV_API_KEY"

Это весь цикл: публикуете под номером, читаете с курсора, возобновляете с курсора после любого разрыва. SDK делают переподключение за вас.

То же самое с SDK

subscribe.mjs
import { Runnev } from "@runnev/client";

const runnev = new Runnev({ apiKey: process.env.RUNNEV_API_KEY });

const stream = await runnev.createStream({ name: "quickstart", retentionSeconds: 3600 });
await runnev.publish(stream.id, 1, [{ type: "hello", msg: "first batch" }]);

for await (const batch of runnev.subscribe(stream.id, { cursor: 0 })) {
  console.log(batch.seq, batch.events);
}

Дальнейшие шаги

  • Аутентификация — форматы ключей и режимы отказа.
  • Публикация — номера, идемпотентность, режим raw, группировка в пакеты.
  • Подписка — формат передачи SSE и долгоживущие соединения.