Ir al contenido

Autenticación, Límites de Tasa y Exportaciones

Hola Doc expone su API a públicos muy distintos —el portal interno, el POS de venta, las terminales de cabina, el acceso móvil y otro microservicio— y cada uno entra por una frontera de autenticación separada, con su propia resolución de inquilino y su propio límite de tasa. Mantener esas fronteras claras es una regla central del servicio. Esta página las describe; los permisos del portal interno están en Permisos y navegación.

FronteraCredencialInquilinoEndpointsLímite de tasa
Sesión de portalJWT del portalClaims del tokenTodas las rutas protegidas del portal
API key externa (POS)Encabezado X-Api-KeyMetadatos de la API keyIngesta de transacciones, lookup de registro, agente de exportación60 req/min por API key
Servicio a servicioX-Api-Key + X-Tenant-IdEncabezado X-Tenant-IdDescarga interna de exportaciones (alcance hola-doc.exports.read)
Token de cabinaBearer cab_… (token largo, almacenado con hash)Registro de la cabinaInfo y verificación de cabina10 req/min por cabina
QR móvil (público)Ninguna; el ID de cabina va en la URLRegistro de la cabinaInfo y verificación móvil2 req/min por IP+cabina y 3 intentos fallidos / 15 min

Notas de comportamiento:

  • La frontera del token de cabina valida además una lista de IP/CIDR permitidas por sitio: si el sitio define allowed_cidrs, se rechaza el acceso desde fuera del rango.
  • En el límite móvil de intentos fallidos, solo las verificaciones fallidas consumen cupo; una verificación exitosa no descuenta.
  • Los límites de tasa usan Redis cuando está disponible y, si no, un cubo de fichas en memoria. En modo no productivo el limitador está desactivado salvo que se fuerce.
  • En cada petición autenticada con token de cabina se actualiza last_seen_at de la cabina de forma asíncrona (latido / heartbeat).

Toda consulta queda acotada por tenant_id, sin importar la frontera: el portal lo toma de los claims, la API key de sus metadatos, el servicio a servicio del encabezado X-Tenant-Id y la cabina de su registro. No se cruzan datos entre inquilinos.

Las exportaciones de tipo agente funcionan por extracción (pull): un proceso externo, autenticado con API key externa, pide y descarga los archivos.

graph TD
    A[GET /export-agent/config] --> B[POST /export-agent/runs]
    B --> C[GET /export-agent/runs/:id/file]
    C --> D[POST /export-agent/runs/:id/ack]
    D --> E[Se confirman los hashes<br/>y se marca descargado]
Método y rutaAcción
GET /export-agent/configConfiguración del proveedor (formato, modo de entrega).
POST /export-agent/runsDisparar una corrida (idempotente por clientRunId).
GET /export-agent/runs/:id/fileDescargar el archivo (XLSX) cuando la corrida fue exitosa.
POST /export-agent/runs/:id/ackConfirmar la descarga con el SHA-256 del archivo.

Los modos de entrega son dos: correo (publica un evento para que Comunicaciones lo envíe) y agente (deja los hashes en preparación y los confirma solo tras el ack). El programador que dispara las corridas según el horario del proveedor se describe en Trabajos programados.

Retención: el contenido del archivo se conserva como máximo 24 horas; el ciclo diario borra el file_data más antiguo y deja solo los metadatos para auditoría.

  • Una API key externa supera su cupo y recibe el rechazo por límite de tasa a los 60 req/min.
  • Una cabina fuera de la lista de CIDR permitidos se rechaza aunque el token sea válido.
  • En el móvil, los intentos fallidos consumen cupo; uno exitoso no.
  • Una corrida de exportación repetida con el mismo clientRunId no se duplica.
  • El contenido de una exportación de más de 24 horas queda sin file_data.