Skip to content

Ошибки и notices ​

Ошибки отклоняют команду или сообщают о сбое сервиса. Notices — асинхронные сообщения об открытом стриме.

Фрейм ошибки ​

Ошибка несёт id команды, которая её вызвала:

json
{
  "op": "error",
  "id": 1,
  "code": "not_on_plan",
  "feature": "detail_full",
  "message": "..."
}
CodeMeaningClient action
unauthorizedКлюч отсутствует, неизвестен или отозванОстановитесь и предоставьте валидный ключ
invalid_paramsНеизвестный/отсутствующий параметр или значение вне допустимого набораИсправьте команду; не повторяйте без изменений
invalid_addressmint или wallet не является адресом SolanaПроверьте адрес локально
invalid_mintАдрес существует, но это не mint токенаИспользуйте mint токена
unknown_streamИмя стрима не существуетИспользуйте одно из восьми документированных имён
duplicate_subscriptionИмя sub уже занято на этом соединенииВозьмите другое имя или используйте уже открытую подписку
subscription_limitИсчерпан лимит открытых подписок планаОтпишитесь или обновите план
connection_limitИсчерпан лимит одновременных соединений планаЗакройте другое соединение или обновите план
rate_limitedСлишком высокая частота командСделайте backoff перед повтором
not_on_planЗапрошенная функция вне планаСмотрите feature; уберите её или обновите план
internal_errorСервис не смог обработать командуПовторите с backoff; сообщайте о устойчивых сбоях

Фичи not_on_plan ​

feature — одно из:

  • stream
  • detail_full
  • include_raw
  • cursor
  • candles
  • candle_interval
  • quota

Человекочитаемое сообщение содержит ссылку на страницу цен. Ветвьте логику клиента по code и feature, а не по тексту сообщения.

Фрейм notice ​

Notice не привязан к команде. Он сообщает о состоянии стрима и обычно несёт затронутую подписку:

json
{
  "op": "notice",
  "code": "gap",
  "sub": "tt_1",
  "message": "..."
}

Notices делятся на два вида, и логике переподключения нужно от них только это различие: после первого вида соединение продолжает работать, после второго оно закрывается.

Соединение продолжает работать ​

CodeWhat happenedClient action
gapКурсор старше окна replay; доставка начинается с liveЗафиксируйте разрыв и продолжайте
replay_rate_limitedЛимит replay исчерпан; доставка начинается с liveПродолжайте без replay
droppedКлиент читал слишком медленно, события потеряны; cursor — первое потерянное событиеЗафиксируйте разрыв, сузьте фильтры или ускорьте потребление
quota_exceededИсчерпана месячная квота трафика FreeДождитесь следующего периода или обновите план

dropped эмитится один раз на серию потерь. Повторные notices означают, что подписку нужно сузить фильтрами или потреблять быстрее.

При quota_exceeded соединение и все подписки остаются открытыми — просто останавливается выдача до следующего периода, а новые подписки получают not_on_plan с feature: "quota". Предупреждения перед лимитом нет.

Соединение закрывается ​

Notice приходит прямо перед close-кадром, то есть это последнее, что вы получите. Прочитайте код, прежде чем решать, переподключаться ли.

CodeWhat happenedClient action
ping_timeoutВ пределах таймаута чтения не пришло ни pong, ни командыОтвечайте на пинги сервера или присылайте {"op":"ping"}, если их съедает прокси; затем переподключитесь
slow_consumerЧтение стабильно отстаётПереподключайтесь только после исправления скорости потребления
server_restartСервис перезапускаетсяПереподключитесь с backoff и последним обработанным курсором
plan_changedТариф на аккаунте изменилсяПереподключитесь: новые лимиты действуют со следующего соединения
key_revokedКлюч отозван при открытом соединенииПрекратите им пользоваться и смените его
account_bannedАккаунт заблокированНе переподключайтесь, напишите в поддержку
account_deletedАккаунта больше нетНе переподключайтесь

plan_changed стоит обработать осознанно: лимиты читаются при открытии соединения, поэтому апгрейд вступает в силу на следующем. Переподключились — получили новый тариф.

Политика повторов ​

Используйте экспоненциальный backoff с джиттером для internal_error, перезапусков и сетевых разрывов. Не повторяйте автоматически без изменений некорректные команды, невалидные ключи или отказы по плану.

Realtime Solana data API