API Reference
API REFERENCE

GET /v1/usage

Расход по API-ключу за выбранный период. Удобно для дашбордов и алертов.

Возвращает итоговый расход (рубли, копейки, токены, число запросов) по тому API-ключу, которым сделан запрос. Расход других ключей того же аккаунта сюда не попадёт — это специально, чтобы один скомпрометированный ключ не показывал общий бюджет.

По умолчанию — последние 24 часа. Период задаётся либо шорткатом ?period=, либо явными ?from=&to= (ISO 8601, UTC). Опциональный ?granularity=hour|day добавит массив buckets для построения графика.

Эндпоинт

GEThttps://api.hubris.pw/v1/usage

Заголовки:

HeaderЗначение
AuthorizationBearer sk-gw-... (обязательно)

Query-параметры

ПараметрТипПо умолчаниюОписание
period"today" | "24h" | "7d" | "30d" | "mtd""24h"Шорткат периода. Взаимоисключающий с from/to.
fromstring (ISO 8601, UTC)Начало периода включительно. Требует to.
tostring (ISO 8601, UTC)Конец периода включительно. Требует from.
granularity"hour" | "day"Если задано — в ответе появится buckets[] с поминутной разбивкой. Без granularity ответ только totals.

period и from/to нельзя передавать одновременно — будет 400 invalid_request. Максимальный диапазон при явных датах — 365 дней.

Шорткаты периода

periodЧто считается
todayС 00:00 UTC текущих суток до сейчас.
24hПоследние 24 часа (по умолчанию).
7dПоследние 7 суток.
30dПоследние 30 суток.
mtdС 1-го числа текущего месяца (UTC).

Минимальный пример

curl -s https://api.hubris.pw/v1/usage \-H "Authorization: Bearer $HUBRIS_API_KEY"
import os, requestsr = requests.get(  "https://api.hubris.pw/v1/usage",  params={"period": "7d", "granularity": "day"},  headers={"Authorization": f"Bearer {os.environ['HUBRIS_API_KEY']}"},)data = r.json()print(f"Расход за 7 дней: {data['totals']['cost_rub']} ₽")
const r = await fetch("https://api.hubris.pw/v1/usage?period=7d&granularity=day",{ headers: { Authorization: `Bearer ${process.env.HUBRIS_API_KEY}` } },);const data = await r.json();console.log(`Расход за 7 дней: ${data.totals.cost_rub} ₽`);

Ответ

{
  "object": "usage",
  "period": {
    "from": "2026-05-13T09:29:31.192Z",
    "to": "2026-05-14T09:29:31.192Z",
    "shortcut": null
  },
  "scope": {
    "key_id": "31fb0d0d-ac86-4f72-815b-bdefd5978747",
    "key_prefix": "sk-gw-758f...d4e3"
  },
  "totals": {
    "requests": 2,
    "prompt_tokens": 6000,
    "completion_tokens": 130,
    "total_tokens": 6130,
    "cache_read_tokens": 198000,
    "cache_write_tokens": 0,
    "reasoning_tokens": 0,
    "cache_hit_rate": 0.97,
    "cache_savings_kopecks": "48150",
    "cache_savings_rub": 481.5,
    "cost_rub": 54.76,
    "cost_kopecks": "5476"
  },
  "granularity": null,
  "buckets": null
}

Поля ответа

ПолеТипОписание
object"usage"Тип объекта.
period.fromstring (ISO 8601 UTC)Начало периода включительно.
period.tostring (ISO 8601 UTC)Конец периода включительно.
period.shortcutstring | nullЕсли использовался шорткат — его имя; иначе null.
scope.key_idstring (UUID)ID ключа, по которому собирается расход.
scope.key_prefixstringВидимый префикс ключа для логов.
totals.requestsintegerКол-во запросов за период.
totals.prompt_tokensintegerСумма входных токенов.
totals.completion_tokensintegerСумма выходных токенов.
totals.total_tokensintegerСумма обоих.
totals.cache_read_tokensintegerТокены, прочитанные из кеша (дешевле обычного входа).
totals.cache_write_tokensintegerТокены записи кеша (дороже обычного входа).
totals.reasoning_tokensintegerТокены рассуждения — подмножество completion_tokens, не прибавляйте их отдельно.
totals.cache_hit_ratenumber (0..1)Доля попаданий в кеш за период.
totals.cache_savings_kopecksstringСколько кеш сэкономил за период (нетто), в копейках.
totals.cache_savings_rubnumberТо же значение в рублях.
totals.cost_rubnumberИтоговая стоимость в рублях. Эквивалент cost_kopecks / 100.
totals.cost_kopecksstringИтоговая стоимость в копейках. Строка — чтобы не терять точность на больших суммах (BigInt).
granularity"hour" | "day" | nullЕсли в запросе был задан — повторяется здесь.
buckets[]array | nullЕсли granularity задан — массив значений по интервалам.
buckets[].bucketstring (ISO 8601)Начало интервала.
buckets[].cost_rubnumberСтоимость интервала.
buckets[].cost_kopecksstringСтоимость в копейках.
buckets[].requestsintegerКол-во запросов в интервале.

Всего входных токенов = prompt_tokens + cache_read_tokens + cache_write_tokens. reasoning_tokens входят в completion_tokens, не прибавляйте их отдельно.

С разбивкой по дням

С granularity в ответе появится buckets:

curl -s -H "Authorization: Bearer $HUBRIS_API_KEY" \
  "https://api.hubris.pw/v1/usage?period=7d&granularity=day"
{
  "granularity": "day",
  "buckets": [
    { "bucket": "2026-05-07T00:00:00.000Z", "cost_rub": 0,     "cost_kopecks": "0",    "requests": 0 },
    { "bucket": "2026-05-08T00:00:00.000Z", "cost_rub": 0,     "cost_kopecks": "0",    "requests": 0 },
    { "bucket": "2026-05-14T00:00:00.000Z", "cost_rub": 54.76, "cost_kopecks": "5476", "requests": 2 }
  ]
}

Произвольный диапазон

curl -s -H "Authorization: Bearer $HUBRIS_API_KEY" \
  "https://api.hubris.pw/v1/usage?from=2026-04-01T00:00:00Z&to=2026-05-01T00:00:00Z"

Точность

  • cost_kopecksстрока, чтобы не терять точность на больших суммах (JavaScript Number не выдержит, если когда-нибудь биллим сильно дорогих агентов). Парсить через BigInt.
  • cost_rub — то же значение, делённое на 100, для удобства отображения.
  • Время в UTC. Если нужно «сутки по Москве» — пришлите явные from/to, конвертированные на стороне клиента.

HTTP-коды

КодКогда
200Успешный ответ.
400Конфликт period + from/to, диапазон > 365 дней, неверный формат даты.
401Ключ отсутствует / отозван / невалиден.
429Превышен дневной лимит на ключе.

Что дальше

  • Биллинг — как формируется итоговая стоимость и из чего складываются токены.
  • Цены — формула расчёта.
  • В UI: страница /usage в дашборде с фильтрами по модели, ключу и статусу + CSV-экспорт.

Обновлено:

GET /v1/usage · Hubris