# Credits API

> GET /v1/credits возвращает баланс организации, а также расход и бюджеты ключа, с которым вы вызываете.


Проверяйте баланс, ничего не тратя. Вызов бесплатный и ничего не резервирует.

```endpoint
GET https://api.notholy.com/v1/credits
```

```bash test
curl https://api.notholy.com/v1/credits -H "Authorization: Bearer $NOTHOLY_API_KEY"
```

## Ответ

```json
{
  "object": "credits",
  "currency": "USD",
  "balance": "24.913402",
  "reserved": "0.004000",
  "available": "24.909402",
  "key": { "spent": "0.086598", "daily_budget": "5.000000" }
}
```

| Поле | Тип | Примечания |
|---|---|---|
| `object` | string | Всегда `credits` |
| `currency` | string | Всегда `USD` |
| `balance` | string | Кредиты минус уже списанный расход |
| `reserved` | string | Зарезервировано прямо сейчас выполняющимися запросами. Каждый резерв — это стоимость запроса в худшем случае; неиспользованная часть возвращается после расчёта |
| `available` | string | Сколько может зарезервировать новый запрос: `balance` минус `reserved` |
| `key.spent` | string | Всего потрачено с этим ключом |
| `key.total_budget`, `key.daily_budget` | string | Есть, если у ключа заданы бюджеты |

Суммы — десятичные строки с 6 знаками после точки. Внутри NotHoly это целые числа в миллиардных долях доллара, поэтому между запросами ничего не округляется.

> [!NOTE]
> Каждый запрос перед стартом резервирует стоимость в худшем случае (промпт плюс `max_tokens`). Если `available` меньше, лимит выхода уменьшается, чтобы поместиться, а при значении ниже 16 токенов запрос возвращает `402 insufficient_credits`. Проверяйте `available` перед долгими генерациями.

```js test
const r = await fetch('https://api.notholy.com/v1/credits', { headers: { Authorization: `Bearer ${process.env.NOTHOLY_API_KEY}` } });
const c = await r.json();
console.log(c.available);
```

## Ошибки

| Статус | Код | Значение |
|---|---|---|
| 401 | `invalid_api_key` | Ключ отсутствует, неверен, отозван или истёк |
| 403 | `account_suspended`, `consent_required` | См. [Аутентификация](/ru/getting-started/authentication) |
| 500 | `internal_error` | Не удалось прочитать баланс. Повторите с задержкой |
