Расход и использование
Сколько ключ потратил за период: запросы, рубли, токены, время ответа. С разбивкой по дням, часам, моделям и методам API. Метод AITUNNEL, не OpenAI.
Bearer, что для чатаКак вызвать
curl https://api.aitunnel.ru/v1/aitunnel/usage?period=7d&group_by=day \
-H "Authorization: Bearer sk-aitunnel-xxx"Параметры
Все необязательные. Без параметров — последние 30 дней в UTC, одной суммой.
| Параметр | Смысл |
|---|---|
period | today, yesterday, 7d, 30d (по умолчанию), 90d, month (с 1-го числа), last_month (прошлый месяц целиком). Это календарные дни в timezone, текущий день входит |
from, to | Свой период вместо period. Дата YYYY-MM-DD — целые сутки, to включительно. Время с поясом (2026-10-31T00:00:00Z) — to не включается. Без to — до текущего момента |
timezone | Часовой пояс IANA для границ дней и для group_by=day, по умолчанию UTC. Например Europe/Moscow |
group_by | day, hour, model, endpoint, user. Можно два через запятую: одно из day/hour и одно из model/endpoint/user, например day,model |
model | Только эта модель, имя целиком, например gpt-5-nano |
endpoint | Только этот метод API: /v1/chat/completions, /v1/embeddings, /v1/images/generations и так далее |
user | Только запросы с этим user (или metadata.user_id у Messages), значение целиком. В ответе появляется поле user. См. Расход по user |
period и from/to вместе не передаются. to без from не принимается.
Ответ
{
"object": "usage",
"period": {
"from": "2026-10-25T00:00:00.000Z",
"to": "2026-10-28T00:00:00.000Z",
"timezone": "UTC",
"preset": null
},
"group_by": ["day"],
"totals": {
"requests": 61,
"cost_rub": 14.37,
"tool_cost_rub": 0.5,
"cache_savings_rub": 1.92,
"discount_savings_rub": 0,
"avg_duration_ms": 2140,
"usage": {
"prompt_tokens": 182400,
"completion_tokens": 21350,
"cached_tokens": 96000,
"cache_write_tokens": 0,
"reasoning_tokens": 8120,
"audio_input_tokens": 0,
"audio_output_tokens": 0,
"video_input_tokens": 0,
"image_output_tokens": 0,
"web_search_requests": 5
}
},
"data": [
{ "date": "2026-10-25", "requests": 24, "cost_rub": 6.1, "...": "поля как в totals" },
{ "date": "2026-10-26", "requests": 0, "cost_rub": 0, "...": "нули, запросов не было" },
{ "date": "2026-10-27", "requests": 37, "cost_rub": 8.27, "...": "" }
]
}| Поле | Смысл |
|---|---|
period | Период, который посчитан на самом деле: границы после округления, пояс и preset (имя period или null для своего периода) |
group_by | Какие разбивки применены, пустой список — без разбивки |
totals | Итог за весь период |
data | Строки разбивки. Нет, если group_by не задан |
В totals и в каждой строке data одни и те же поля:
| Поле | Смысл |
|---|---|
requests | Число запросов |
cost_rub | Списано, ₽ |
tool_cost_rub | Из них за серверные инструменты, например веб-поиск, ₽ |
cache_savings_rub | Сколько сэкономил кэш промпта, ₽ |
discount_savings_rub | Сколько сэкономила персональная скидка, ₽ |
avg_duration_ms | Среднее время запроса, мс, или null, если запросов нет |
usage | Токены и единицы: prompt_tokens, completion_tokens, cached_tokens, cache_write_tokens, reasoning_tokens, audio_input_tokens, audio_output_tokens, video_input_tokens, image_output_tokens, web_search_requests. Все поля есть всегда, если не было — 0 |
К строкам добавляется ключ разбивки: date (2026-10-25, день в timezone), start (час в UTC, 2026-10-25T14:00:00Z), model, endpoint (/v1/chat/completions), user.
- Строки идут по порядку: по времени, затем по убыванию расхода. Только
modelилиendpoint— самые затратные первыми. group_by=dayиgroup_by=hourбез второй разбивки возвращают каждый день или час периода, пустые — нулями. Удобно строить график без заполнения дыр.
Что нужно знать
- Точность до часа. Данные собраны по часам, поэтому
fromокругляется вниз до часа,toвверх. Фактический период — вperiod. - Пояса. Поддерживаются пояса со сдвигом, кратным часу (
Europe/Moscow,Asia/Dubai). ДляAsia/Kolkataи подобных — ближайший. - Лимиты. Период — до 366 дней,
group_by=hour— до 31 дня, в ответе — до 5000 строк. Если не помещается, ответ400с подсказкой. - Будущее не считается:
toобрезается текущим часом.
Расход по user
Подробно, с примерами и счётом клиенту — Пользователи вашего сервиса. Если в запросах вы передаёте свой идентификатор пользователя (user в теле любого платного метода, metadata.user_id в Messages), расход можно считать по нему: group_by=user — строка на каждого, user=customer-42 — только один.
- Считаются только запросы, где
userбыл передан. Остальные в такой выборке не участвуют, поэтому итог может быть меньше общего расхода. - Данные берутся из журнала запросов, он хранится около трёх месяцев, а поле пишется только с момента его появления. Период — до 92 дней, иначе
400. - Если пользователей больше 5000 или запрос слишком тяжёлый, ответ
400: сузьте период или добавьте фильтрmodelилиendpoint.
Примеры
Сколько потрачено в этом месяце
curl "https://api.aitunnel.ru/v1/aitunnel/usage?period=month" \
-H "Authorization: Bearer sk-aitunnel-xxx"Расход по моделям за прошлый месяц
curl "https://api.aitunnel.ru/v1/aitunnel/usage?period=last_month&group_by=model" \
-H "Authorization: Bearer sk-aitunnel-xxx"Расход по дням и моделям за период, по московскому времени
curl "https://api.aitunnel.ru/v1/aitunnel/usage?from=2026-10-01&to=2026-10-15&group_by=day,model&timezone=Europe/Moscow" \
-H "Authorization: Bearer sk-aitunnel-xxx"Расход по вашим пользователям за 30 дней
curl "https://api.aitunnel.ru/v1/aitunnel/usage?period=30d&group_by=user" \
-H "Authorization: Bearer sk-aitunnel-xxx"Python: топ моделей по расходу
import requests
usage = requests.get(
"https://api.aitunnel.ru/v1/aitunnel/usage",
params={"period": "30d", "group_by": "model"},
headers={"Authorization": "Bearer sk-aitunnel-xxx"},
).json()
for row in sorted(usage["data"], key=lambda r: -r["cost_rub"])[:5]:
print(f'{row["model"]}: {row["cost_rub"]} ₽, {row["requests"]} запросов')Ошибки
| Код | Когда |
|---|---|
400 | Неверный параметр: период, дата, пояс, group_by, endpoint; период пустой или слишком большой |
401 | Нет ключа или он неверный |
{
"error": {
"message": "Некорректный group_by «week». Допустимо одно значение из day, hour и одно из model, endpoint, user через запятую, например day,model.",
"code": 400
}
}