> ## Documentation Index
> Fetch the complete documentation index at: https://docs.laozhang.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# API журнала вызовов: выгрузка записей и списаний из кода

> Вызовите /api/log/self с AccessToken, чтобы отфильтровать записи расходов и пополнений по времени, модели или API-ключу и постранично сверить их.

API журнала вызовов возвращает те же записи, что страница «Журнал» в консоли: модель, API-ключ, число токенов и стоимость каждого вызова. Он подходит для ежедневной сверки, отчётов по ключам и загрузки списаний в собственную биллинговую систему.

| Параметр | Значение |
| - | - |
| Эндпоинт | `GET https://api.laozhang.ai/api/log/self` |
| Аутентификация | AccessToken аккаунта; см. [API баланса](https://docs.laozhang.ai/ru/api-capabilities/balance-query.md) |
| Пагинация | 10 записей на страницу; `p` начинается с 0 |
| Квота | 500 000 квоты = 1 USD |

> [!WARNING]
>
> **Неверный токен тоже возвращает HTTP 200.**
>
> * Тело ответа: `{"success": false, "message": "...access token is invalid."}`, поля `data` нет.
> * Проверяйте `success` в скрипте. Если смотреть только на код статуса, сбой аутентификации выглядит как пустой журнал.

## Параметры запроса

| Параметр | Описание |
| - | - |
| `p` | Номер страницы, начиная с `0` |
| `type` | Тип записи: `2` — расход, `1` — пополнение. Без параметра возвращаются все типы. |
| `model_name` | Вернуть записи только одной модели, например `gpt-5.4-mini` |
| `token_name` | Вернуть записи только одного API-ключа по его имени |
| `start_timestamp` | Начало периода в секундах Unix |
| `end_timestamp` | Конец периода в секундах Unix |

Размер страницы фиксирован; параметры `page_size` и `size` игнорируются. Общего числа записей в ответе нет, поэтому запрашивайте следующую страницу, пока не придёт страница из менее чем 10 записей.

## Отправка запроса

Сохраните AccessToken в переменной окружения:

```bash theme={null}
export LAOZHANG_ACCESS_TOKEN="ваш AccessToken"
```

Получите расходы по `gpt-5.4-mini` за последний час:

```bash theme={null}
END=$(date +%s)
START=$((END - 3600))

curl --compressed -s -G "https://api.laozhang.ai/api/log/self" \
  -H "Authorization: ${LAOZHANG_ACCESS_TOKEN}" \
  --data-urlencode "p=0" \
  --data-urlencode "type=2" \
  --data-urlencode "model_name=gpt-5.4-mini" \
  --data-urlencode "start_timestamp=${START}" \
  --data-urlencode "end_timestamp=${END}"
```

Передавайте AccessToken в `Authorization` как есть; префикс `Bearer ` тоже работает.

## Поля ответа

```json theme={null}
{
  "success": true,
  "message": "",
  "data": [
    {
      "created_at": 1791992057,
      "type": 2,
      "model_name": "gpt-5.4-mini",
      "token_name": "prod-backend",
      "quota": 1531,
      "prompt_tokens": 1348,
      "completion_tokens": 456,
      "is_stream": false,
      "request_id": "20261014153321000000000000000000example",
      "other": "{\"model_ratio\":0.375,\"completion_ratio\":6,...}"
    }
  ]
}
```

| Поле | Описание |
| - | - |
| `created_at` | Время записи в секундах Unix |
| `type` | `2` — расход, `1` — пополнение |
| `model_name` | ID вызванной модели |
| `token_name` | Имя API-ключа, с которым сделан вызов |
| `quota` | Стоимость записи; разделите на 500 000, чтобы получить доллары США |
| `prompt_tokens`, `completion_tokens` | Входные и выходные токены; для моделей с оплатой за вызов могут быть равны 0 |
| `is_stream` | Передавался ли ответ потоком |
| `request_id` | ID запроса, который нужно назвать при обращении в поддержку |
| `other` | Детали списания в виде JSON-**строки**; разберите её вторым проходом |

В `other` лежат коэффициенты, попадания в кэш и платные инструменты. Для запросов с [веб-поиском](https://docs.laozhang.ai/en/api-capabilities/web-search.md) поле `web_search_billing` содержит число поисков и их стоимость. Если нужна только итоговая сумма, читайте `quota`. В ответе могут быть и другие поля; ненужные игнорируйте.

## Выгрузка за сутки с итогом по моделям

Скрипт проходит по всем страницам и суммирует стоимость по моделям. Нужны Python 3.9 или новее и `requests` (`python -m pip install requests`).

```python theme={null}
import os
import time
from collections import defaultdict

import requests

TOKEN = os.environ["LAOZHANG_ACCESS_TOKEN"]
URL = "https://api.laozhang.ai/api/log/self"
QUOTA_PER_USD = 500_000

end = int(time.time())
start = end - 24 * 3600
totals = defaultdict(int)
page = 0

while True:
    response = requests.get(
        URL,
        headers={"Authorization": TOKEN},
        params={"p": page, "type": 2, "start_timestamp": start, "end_timestamp": end},
        timeout=60,
    )
    response.raise_for_status()
    payload = response.json()
    if not payload.get("success"):
        raise RuntimeError(payload.get("message"))

    rows = payload["data"] or []
    for row in rows:
        totals[row["model_name"]] += row["quota"]
    if len(rows) < 10:
        break
    page += 1
    time.sleep(0.2)

for model, quota in sorted(totals.items(), key=lambda item: -item[1]):
    print(f"{model}: ${quota / QUOTA_PER_USD:.4f}")
```

У нагруженного аккаунта за сутки могут набраться тысячи страниц. Запрашивайте более короткие интервалы или сужайте выборку через `model_name` и `token_name`.

## Ошибки

| Симптом | Причина и решение |
| - | - |
| HTTP 401 с `AUTH_REQUIRED` | Нет заголовка `Authorization` |
| HTTP 200 с `success: false` и сообщением "access token is invalid" | AccessToken неверен или был перевыпущен; получите новый в консоли |
| Пустой массив | Нет записей за указанный период; проверьте, что метки времени заданы в секундах, а не в миллисекундах |
| Нечитаемый вывод или ошибка `jq` | Ответ сжат gzip; добавьте к cURL флаг `--compressed` |

## Связанные материалы

* Получение AccessToken и проверка баланса: [API баланса](https://docs.laozhang.ai/ru/api-capabilities/balance-query.md)
* Создание, отключение и удаление API-ключей из кода: [API управления токенами](https://docs.laozhang.ai/ru/api-capabilities/token-management.md)
* Списания на странице «Журнал» в консоли: [Как читать журнал вызовов](https://docs.laozhang.ai/en/faq/call-logs.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.