Поиск по документации...

Начните вводить, чтобы искать по документации

Руководство по платформе

API платформы

Читайте каталог, цены, свой баланс и свое потребление прямо из кода.

Здесь собрано всё, кроме отправки самого запроса к модели: какие модели существуют, сколько берёт каждый провайдер, сколько вы потратили и какие ключи у вас есть. Всё это отвечает JSON на том же хосте api, куда вы отправляете запросы на генерацию.

Эндпоинты каталога и цен публичные, им вообще не нужны учётные данные. Для всего, что касается вашего аккаунта, они нужны, и бывают они двух видов.

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

Учетные данныеКак выглядитЧто открывает
API-ключsk-...Инференс, список моделей и счётчик использования именно этого ключа.
Токен доступаОт 29 до 32 символов, без префиксаВаш аккаунт: баланс, управление ключами, журналы использования.

Оба передаются в одном и том же заголовке: Authorization: Bearer и следом значение. Ничего другого не читается. В старых примерах добавляют заголовок New-Api-User, он игнорируется, и запасного варианта с cookie нет.

Отправляйте этот заголовок даже там, где эндпоинт ответил бы и без него. Запрос к маршруту аккаунта без учётных данных может быть отсеян проверкой ещё до того, как дойдет до нас, а проверка отвечает HTML, а не JSON.

Откройте Настройки, найдите пункт Доступ к API в разделе Безопасность и создайте токен. Он показывается один раз. Создать его можно только при выполненном входе в аккаунт, поэтому скрипт не выпустит себе токен сам.

Одновременно у вас может быть только один токен доступа. Создание нового молча делает старый недействительным, и всё, что ещё им пользуется, перестает работать.

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

Один публичный запрос возвращает все модели с ценами, уже пересчитанными в доллары за миллион токенов. Без ключа и без регистрации.

bash
curl https://api.unorouter.com/api/pricing/catalog
json
{
  "counts": { "models": 239, "free": 134, "paid": 105, "vendors": 50 },
  "first_free_model": "glm-5.3:free",
  "vendors": [{ "vendor_id": 4, "vendor_name": "Zhipu", "icon": "Zhipu.Color" }],
  "models": [
    {
      "model_name": "glm-5.3",
      "vendor": "Zhipu",
      "type": "text",
      "is_free": false,
      "online": true,
      "input_price": 0.05103,
      "output_price": 0.160382187,
      "original_input_price": 1.26,
      "original_output_price": 3.960054,
      "tags": "Text,Reasoning,Tools,Cache",
      "supported_endpoint_types": ["openai", "anthropic"],
      "uptime_24h": 99.965,
      "success_rate": 95,
      "avg_latency_ms": 11062
    }
  ]
}

Поля input_price и output_price показывают, сколько вы действительно заплатили бы сегодня у самого дешёвого провайдера, который сейчас обслуживает эту модель. Поля original_input_price и original_output_price содержат прейскурантную цену самого вендора, так что разрыв между ними и есть скидка. Поле is_free отмечает модели, которые никогда не тарифицируются, а online отмечает те, у которых прямо сейчас есть работающий провайдер.

Два родственных эндпоинта поменьше: /api/pricing/counts возвращает только итоговые количества и достаточно дёшев, чтобы опрашивать его часто, а /api/pricing/vendors возвращает список вендоров. Более старый эндпоинт /api/pricing возвращает сырые коэффициенты вместо долларов и в несколько раз объёмнее.

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

bash
curl "https://api.unorouter.com/api/pricing/catalog/model?model=glm-5.3"
json
{
  "model_name": "glm-5.3",
  "model_ratio": 0.63,
  "completion_ratio": 3.1429,
  "cache_ratio": 0.1857,
  "input_price": 0.05103,
  "output_price": 0.160382187,
  "grid_min_ratio": 0.0405,
  "auto_chain": ["a7-bbgt-2846-glm-5.3", "a7-kkl-3731-glm-5.3", "a7-4069-glm-5.3"],
  "group_ratio": {
    "a7-bbgt-2846-glm-5.3": 0.0405,
    "a7-kkl-3731-glm-5.3": 0.0911,
    "a7-4069-glm-5.3": 0.1214
  },
  "enable_groups": ["a7-bbgt-2846-glm-5.3", "a7-kkl-3731-glm-5.3"]
}

Поле auto_chain задаёт порядок, в котором маршрутизация их перебирает, начиная с самого дешёвого. Поле group_ratio даёт множитель каждого провайдера, и цена выводится из него:

text
input  $/1M = model_ratio * 2 * group_ratio
output $/1M = input * completion_ratio
cached $/1M = input * cache_ratio

glm-5.3 on a7-bbgt-2846: 0.63 * 2 * 0.0405 = $0.05103 / 1M in
                          0.05103 * 3.1429  = $0.16038 / 1M out

Это те же названия групп, к которым вы привязываете ключ, смотрите Закрепление групп

Список в формате, совместимом с OpenAI, вызывает большинство клиентов при нажатии кнопки подключения. Для него нужен API-ключ.

bash
curl https://api.unorouter.com/v1/models \
  -H "Authorization: Bearer $UNOROUTER_API_KEY"

Он возвращает только то, что этот ключ действительно может использовать, поэтому ключ на бесплатном тарифе видит меньше моделей, чем оплаченный. В каждой записи также есть context_length и max_output_tokens, которых обычный OpenAI не отдаёт.

Нужный путь: /v1/models. Уберите /v1, и вы попадете на веб-страницу, а не в API, о чем клиенты сообщают как об ошибке разбора JSON с жалобой на неожиданный doctype.

Один вызов возвращает ваш аккаунт, включая остаток средств.

bash
curl https://api.unorouter.com/api/user/self \
  -H "Authorization: Bearer $UNOROUTER_ACCESS_TOKEN"
json
{
  "success": true,
  "message": "",
  "data": {
    "id": 12345,
    "username": "you",
    "group": "default",
    "quota": 265000,
    "used_quota": 4231900,
    "request_count": 1884,
    "aff_code": "ABC123"
  }
}

Суммы указаны в единицах квоты, а не в долларах. 500 000 единиц равны одному доллару США, поэтому баланс выше составляет 0,53 доллара США. Делите на 500 000, чтобы показывать деньги.

Поле quota показывает, сколько вы ещё можете потратить. Поля used_quota и request_count содержат итоги за всё время и только растут, поэтому used_quota не является разностью между чем-либо и вашим балансом.

Получите список своих ключей, а затем раскройте нужный по его id.

bash
curl "https://api.unorouter.com/api/token/?p=1&page_size=20" \
  -H "Authorization: Bearer $UNOROUTER_ACCESS_TOKEN"

curl -X POST https://api.unorouter.com/api/token/42/key \
  -H "Authorization: Bearer $UNOROUTER_ACCESS_TOKEN"

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

При создании ключа возвращается success, но не сам ключ. Создайте его, получите список, чтобы найти id, затем раскройте. Обновление возвращает обновлённый объект, но отправляйте объект целиком: пропуск переживают только cross_group_retry, group_mapping и auto_groups, а любое другое опущенное поле записывается пустым.

Ваша собственная история запросов разбита на страницы и поддаётся фильтрации.

bash
curl -G https://api.unorouter.com/api/log/self \
  -H "Authorization: Bearer $UNOROUTER_ACCESS_TOKEN" \
  -d p=1 \
  -d page_size=100 \
  -d type=2 \
  -d start_timestamp=1789344000 \
  -d model_name=glm-5.3
ПараметрЗначение
type1 пополнение, 2 расход, 3 управление, 5 ошибка, 6 возврат, 7 вход. Не указывайте его, чтобы получить всё.
start_timestamp, end_timestampСекунды Unix. Промежуток между ними не может превышать десять лет.
model_name, token_name, groupСузить до одной модели, одного ключа или одной группы провайдеров.
request_id, upstream_request_idНайти один запрос по нашему id или по id провайдера.

Добавьте p и page_size для постраничного вывода, размер страницы ограничен сотней. Соседний эндпоинт /api/log/self/stat возвращает только итоги по тем же фильтрам: траты, запросы в минуту и токены в минуту.

Чтобы узнать остаток по одному ключу без токена доступа, авторизуйтесь самим ключом:

bash
curl https://api.unorouter.com/api/usage/token/ \
  -H "Authorization: Bearer $UNOROUTER_API_KEY"
json
{
  "object": "token_usage",
  "name": "SillyTavern",
  "total_granted": 500000,
  "total_used": 231900,
  "total_available": 268100,
  "unlimited_quota": false,
  "model_limits_enabled": false,
  "expires_at": 0
}

Эндпоинты аккаунта оборачивают свою полезную нагрузку. Постраничные оборачивают её дважды.

json
{ "success": true, "message": "", "data": { ... } }

{ "success": true, "message": "", "data": {
    "page": 1, "page_size": 20, "total": 137, "items": [ ... ]
} }

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

Большинство сбоев всё равно отвечают HTTP 200, где success выставлено в false, и сообщением с объяснением причины. Проверяйте это поле, а не код статуса.

Исключение составляет аутентификация: она отвечает настоящим статусом. 401 с AUTH_UNAUTHORIZED для неверных учётных данных, AUTH_TOKEN_EXPIRED для устаревших, AUTH_SESSION_REVOKED после выхода из аккаунта и 403 с AUTH_INSUFFICIENT_PRIVILEGE, когда аккаунту не разрешено вызывать этот маршрут.