# Uso diario por credencial

> GET /api/configuracion/api-externa/uso

`GET /api/configuracion/api-externa/uso`

Pedidos por día (hora de Argentina) y credencial: lecturas, escrituras, reservas creadas y rechazos por límite. Por defecto, los últimos 30 días; hasta 92.

> Autenticación: sesión del panel de Turnova (dueña o administradora). No se llama con una clave de la API.

## Parámetros

| Nombre | En | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- | --- |
| `desde` | query | string (date) | No |  |
| `hasta` | query | string (date) | No | Por defecto, hoy. |

## Ejemplo

```js
// Desde el panel de Turnova, con la sesión iniciada (cookie).
const res = await fetch("/api/configuracion/api-externa/uso?desde=2030-01-01", {
  method: "GET",
});
const r = await res.json();
```

## Respuestas

| HTTP | Qué significa |
| --- | --- |
| 200 | Uso |
| 400 | Datos inválidos: mirá `error.campos` (`ENTRADA_INVALIDA`, `IDEMPOTENCY_KEY_FALTANTE`…). |
| 401 | Clave faltante, inválida o revocada. |
| 403 | Origen no permitido, permiso faltante, clave secreta desde un navegador o plan sin la API (`PLAN_SIN_API`). |
| 404 | No existe o no es de este negocio. |

### Respuesta 200

```json
{
  "version": 1,
  "ok": true,
  "progreso": {
    "principal": "CONSULTADO"
  },
  "requiereRevision": false,
  "datos": {
    "desde": "2030-01-01",
    "hasta": "2030-01-31",
    "total": 25000,
    "porCredencial": [
      {
        "credencialId": "cmh4k1z7q0000",
        "nombre": "Masaje descontracturante",
        "prefijo": "tnv_pk_ab12cd34",
        "tipo": "PUBLICA",
        "revocadaEn": null,
        "lecturas": 340,
        "escrituras": 12,
        "reservasCreadas": 9,
        "limitados": 0
      }
    ],
    "dias": [
      {
        "dia": "2030-01-10",
        "lecturas": 340,
        "escrituras": 12,
        "reservasCreadas": 9,
        "limitados": 0
      }
    ]
  }
}
```

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `datos.desde` | string (date) | No |  |
| `datos.hasta` | string (date) | No |  |
| `datos.total` | object | No |  |
| `datos.total.lecturas` | integer | No |  |
| `datos.total.escrituras` | integer | No |  |
| `datos.total.reservasCreadas` | integer | No |  |
| `datos.total.limitados` | integer | No | Pedidos rechazados con 429. |
| `datos.porCredencial` | array de object | No |  |
| `datos.porCredencial[].credencialId` | string | No |  |
| `datos.porCredencial[].nombre` | string | No |  |
| `datos.porCredencial[].prefijo` | string | No |  |
| `datos.porCredencial[].tipo` | `PUBLICA`, `SECRETA` | No |  |
| `datos.porCredencial[].revocadaEn` | string (date-time) o null | No |  |
| `datos.porCredencial[].lecturas` | integer | No |  |
| `datos.porCredencial[].escrituras` | integer | No |  |
| `datos.porCredencial[].reservasCreadas` | integer | No |  |
| `datos.porCredencial[].limitados` | integer | No | Pedidos rechazados con 429. |
| `datos.dias` | array de object | No |  |
| `datos.dias[].dia` | string (date) | No |  |
| `datos.dias[].lecturas` | integer | No |  |
| `datos.dias[].escrituras` | integer | No |  |
| `datos.dias[].reservasCreadas` | integer | No |  |
| `datos.dias[].limitados` | integer | No | Pedidos rechazados con 429. |

Los errores siguen el formato común: ver [Errores](https://turnovapp.com/docs/errores.md).
