# Credenciales del negocio (panel, con sesión)

> GET /api/configuracion/api-externa/credenciales

`GET /api/configuracion/api-externa/credenciales`

Dueña o administradora (la Super Recepción no pasa). Nunca devuelve la clave ni su hash.

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

## Ejemplo

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

## Respuestas

| HTTP | Qué significa |
| --- | --- |
| 200 | Lista |
| 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
{
  "ok": true,
  "datos": {
    "plan": {
      "incluyeApi": false
    },
    "credenciales": [
      {
        "id": "cmh4k2n9x0001",
        "nombre": "Masaje descontracturante",
        "tipo": "PUBLICA",
        "prefijo": "tnv_pk_ab12cd34",
        "scopes": [
          "catalogo:leer",
          "disponibilidad:leer",
          "reservas:crear"
        ],
        "origenes": [
          "https://mi-spa.com"
        ],
        "createdAt": "2026-11-01T13:00:00.000Z",
        "ultimoUsoEn": "2026-11-01T13:05:00.000Z",
        "revocadaEn": null
      }
    ]
  }
}
```

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `datos.plan` | object | No |  |
| `datos.plan.incluyeApi` | boolean | No | false: el plan no incluye la API; las claves existentes no funcionan. |
| `datos.credenciales` | array de object | No |  |
| `datos.credenciales[].id` | string | No |  |
| `datos.credenciales[].nombre` | string | No |  |
| `datos.credenciales[].tipo` | `PUBLICA`, `SECRETA` | No |  |
| `datos.credenciales[].prefijo` | string | No |  |
| `datos.credenciales[].scopes` | array de string | No |  |
| `datos.credenciales[].origenes` | array de string | No |  |
| `datos.credenciales[].createdAt` | string (date-time) | No |  |
| `datos.credenciales[].ultimoUsoEn` | string (date-time) o null | No |  |
| `datos.credenciales[].revocadaEn` | string (date-time) o null | No |  |

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