# API de créditos

> GET /v1/credits devuelve el saldo de la organización, y el gasto y los presupuestos de la clave con la que llamas.


Consulta tu saldo sin gastar nada. La llamada es gratuita y no retiene nada.

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

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

## Respuesta

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

| Campo | Tipo | Notas |
|---|---|---|
| `object` | string | Siempre `credits` |
| `currency` | string | Siempre `USD` |
| `balance` | string | Créditos menos el uso ya cobrado |
| `reserved` | string | Retenido en este momento por las solicitudes en curso. Cada retención es el costo en el peor caso de su solicitud; la parte que no se usa vuelve cuando se liquida |
| `available` | string | Lo que puede reservar una solicitud nueva: `balance` menos `reserved` |
| `key.spent` | string | Total gastado con esta clave |
| `key.total_budget`, `key.daily_budget` | string | Aparecen cuando la clave tiene presupuestos |

Los montos son strings decimales con 6 decimales. Dentro de NotHoly son enteros en milmillonésimas de dólar, así que no hay redondeo entre solicitudes.

> [!NOTE]
> Cada solicitud reserva su peor caso (prompt más `max_tokens`) antes de empezar. Cuando `available` es menor que eso, el límite de salida se reduce para caber, y por debajo de 16 tokens la solicitud devuelve `402 insufficient_credits`. Revisa `available` antes de generaciones largas.

```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);
```

## Errores

| Estado | Código | Significado |
|---|---|---|
| 401 | `invalid_api_key` | Clave ausente, inválida, revocada o vencida |
| 500 | `internal_error` | No se pudo leer el saldo. Reintenta con backoff |
