Skip to content

Ошибки API v3 ​

Все ошибки приходят в одинаковом виде:

json
{
  "detail": "человекочитаемое описание"
}

Ошибки проверки схемы выглядят подробнее:

json
{
  "detail": [
    {"loc": ["body", "username"], "msg": "field required", "type": "value_error.missing"}
  ]
}

Коды ответов ​

КодЗначениеОбычная причина
200успехобычное чтение
201созданоPOST создал объект
204пустоуспешное удаление
400плохой запроскривое тело, неверный формат uuid, неизвестная область доступа
401не авторизованключа нет, он неверен или просрочен
403запрещеноключу не хватает области доступа
404не найденообъекта не существует
409конфликтдубликат имени, одновременное изменение
422не проходит проверкусхема запроса нарушена
429слишком частопревышен лимит, смотрите Retry-After
500ошибка серверанаша ошибка, сообщите о ней
502панель недоступнане отвечает Remnawave Panel
503сервис недоступеннет соединения с базой
504таймаутпанель не ответила вовремя

Ошибки авторизации ​

Заголовка нет:

http
HTTP/1.1 401 Unauthorized

{"detail": "Missing X-API-Key header"}

Ключ не подошёл:

http
HTTP/1.1 401 Unauthorized

{"detail": "Invalid or expired API key"}

Что проверить: ключ скопирован целиком, вместе с префиксом rwa_; он не выключен в интерфейсе; срок жизни не истёк.

Не хватает прав:

http
HTTP/1.1 403 Forbidden

{"detail": "Missing scope: users:write"}

Добавьте область доступа ключу или заведите новый с нужным набором.

Лимит запросов ​

http
HTTP/1.1 429 Too Many Requests
Retry-After: 17

{"detail": "Rate limit exceeded: 120 requests per minute"}

Окно фиксированное, 60 секунд; Retry-After — сколько секунд до его конца. Клиенту стоит этот заголовок уважать:

python
import time
import requests

def call(url, headers, max_retries=5):
    for _ in range(max_retries):
        r = requests.get(url, headers=headers)
        if r.status_code != 429:
            return r
        time.sleep(int(r.headers.get("Retry-After", "5")) + 1)
    r.raise_for_status()

Ошибки проверки схемы ​

http
HTTP/1.1 422 Unprocessable Entity

{
  "detail": [
    {
      "loc": ["body", "expire_at"],
      "msg": "not a valid datetime",
      "type": "value_error.datetime"
    }
  ]
}

Путь в loc указывает на конкретное поле, которое не прошло.

Ошибки панели ​

Часть эндпоинтов v3 обращается к API самой панели Remnawave. Если панель тормозит или недоступна, придут 502 или 504. Это временные ошибки — повторяйте запрос с нарастающей паузой.

Как сообщать об ошибке ​

К 500 полезно приложить:

  • время в UTC
  • метод и путь запроса
  • префикс ключа, первые 12 символов — но не сам ключ
  • тело ответа
  • значение заголовка X-Request-Id, если он есть

Issues на GitHub.

AGPL-3.0 с исключением для плагинов