Referencia · Panel

Crear una credencial; la clave se muestra una sola vez

POST /api/configuracion/api-externa/credenciales

Ver en Markdown
POST/api/configuracion/api-externa/credenciales

Exige el plan Enterprise: sin él, 403 PLAN_SIN_API con upgrade_url.

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

Cuerpo

CampoTipoObligatorioDescripción
nombrestringSíHasta 80 caracteres.
tipoPUBLICA, SECRETASí
scopesarray de catalogo:leer, disponibilidad:leer, reservas:crear, reservas:leerSíreservas:leer solo para SECRETA. Entre 1 y N elementos.
origenesarray de stringNoObligatorio (1 a 10) para PUBLICA; prohibido para SECRETA. https, o http://localhost / 127.0.0.1. Entre 0 y 10 elementos.

Ejemplo

// Desde el panel de Turnova, con la sesión iniciada (cookie).
const res = await fetch("/api/configuracion/api-externa/credenciales", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    "nombre": "Masaje descontracturante",
    "tipo": "PUBLICA",
    "scopes": [
      "catalogo:leer",
      "disponibilidad:leer",
      "reservas:crear"
    ]
  }),
});
const r = await res.json();

Respuestas

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

Respuesta 201

{
  "ok": true,
  "datos": {
    "credencial": {
      "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
    },
    "clave": "tnv_pk_ab12cd34EjemploNoUsarEstaClave0123456789",
    "aviso": "Copiá la clave ahora: no se vuelve a mostrar."
  }
}
CampoTipoObligatorioDescripción
datos.credencialobjectNo
datos.credencial.idstringNo
datos.credencial.nombrestringNo
datos.credencial.tipoPUBLICA, SECRETANo
datos.credencial.prefijostringNo
datos.credencial.scopesarray de stringNo
datos.credencial.origenesarray de stringNo
datos.credencial.createdAtstring (date-time)No
datos.credencial.ultimoUsoEnstring (date-time) o nullNo
datos.credencial.revocadaEnstring (date-time) o nullNo
datos.clavestringNoÚnica vez que se devuelve.
datos.avisostringNo

Los errores siguen el formato común: ver Errores.