Turnaly

Recursos para integradores

API de Turnaly

Para que los sistemas de tu empresa lean los datos que Turnaly ya tiene: el contable, un tablero, un reporte que se arma solo cada lunes. Se entra con una llave que creas tú desde el panel, solo lee y la revocas cuando quieras.

Actualizado el 17 de septiembre de 2026.

Qué es y qué no

La API de Turnaly es de solo lectura. Sirve para sacar datos: las personas de la empresa, los reportes de asistencia y de horas extra, las sedes, las áreas, los cargos, las reglas laborales que está aplicando tu empresa y el historial de envíos a nómina.

No sirve para escribir. No se pueden crear personas, registrar marcaciones, aprobar ausencias ni cambiar configuración desde fuera. Cualquier petición que no sea una consulta se rechaza, y eso es a propósito: la llave que le das a un tablero no debería poder tocar la nómina de nadie.

Cada empresa administra sus propias llaves y cada llave ve solamente los datos de su empresa. No hay forma de que una llave lea datos de otra: el aislamiento lo aplica la base de datos, no el código de la aplicación.

Consigue tu llave

  1. Entra al panel en app.turnaly.co con una cuenta de administrador.
  2. Ve a Integraciones y baja hasta Acceso por API.
  3. Escribe un nombre que diga para qué es la llave, como «Contabilidad» o «Tablero interno», y pulsa Crear llave.
  4. Copia la llave en ese momento y guárdala en el sistema que la va a usar. Empieza por tk_ y no se vuelve a mostrar: después solo se ve su prefijo, que sirve para reconocerla en la lista. Si se pierde, se revoca y se crea otra.

En la misma tabla ves cuándo se creó cada llave, quién la creó y cuándo se usó por última vez. El botón Revocar la anula en el acto: lo que la estuviera usando deja de funcionar de inmediato, sin esperar a que caduque nada.

Una empresa puede tener hasta diez llaves activas a la vez. Conviene una por sistema, no una compartida entre todos: así se revoca la de un proveedor sin dejar sin servicio a los demás.

Autenticación

La llave va en la cabecera Authorization, con el prefijo Bearer. No hay que pedir un token antes ni renovar nada: la llave misma es la credencial y no caduca hasta que la revocas.

curl https://api.turnaly.co/v1/summary \
  -H "Authorization: Bearer tk_tu_llave_aqui"

Todas las rutas cuelgan de https://api.turnaly.co/v1. La consulta de arriba es la más corta que existe y sirve para comprobar que la llave quedó bien: devuelve el conteo de personas, sedes, áreas y cargos de tu empresa.

Reglas del acceso

  • Solo consultas. Cualquier petición que intente crear, cambiar o borrar algo recibe un 403 con el mensaje «Una llave de API solo lee: no puede crear ni cambiar nada».
  • Solo lo de tu empresa. La llave sabe a qué empresa pertenece; no hay que mandar ningún identificador de empresa ni se puede cambiar.
  • Hasta 300 consultas por minuto. Al pasarse, la respuesta es un 429. Ese cupo lo comparte la llave con la persona que la creó, así que conviene espaciar los procesos pesados en vez de pedirlo todo de golpe.
  • Sin llave válida, 401. Es la misma respuesta para una llave inexistente y para una revocada, a propósito: desde fuera no se puede distinguir una de otra.
  • No todo lo que lee el panel lo lee una llave. Una llave tiene permisos de consulta, no los de un administrador. Lo que queda fuera está en lo que todavía no expone.
Guarda la llave donde guardas las demás contraseñas de tus sistemas, nunca en el código ni en un repositorio. Quien la tenga puede leer los datos de tu empresa, incluidos los salarios que aparecen en las fichas de contrato.

Formatos y errores

Fechas y horas

  • Las fechas de calendario van como AAAA-MM-DD: el día de trabajo, la vigencia de un contrato, el rango de un reporte.
  • Las marcas de tiempo van en ISO 8601 y en UTC, terminadas en Z, por ejemplo 2026-09-17T15:04:05.123Z.
  • Los cálculos están hechos en hora de Colombia, America/Bogota. Un reporte del 1 al 30 de septiembre cubre esos días en hora colombiana, aunque los tiempos se entreguen en UTC. Si tu sistema muestra horas, conviértelas a la zona de Colombia o mostrará cinco horas de más.

Cuántos datos vienen

El listado de personas es el único que se pagina, con limit (hasta 200, por defecto 50) y offset; su respuesta trae total para saber cuántas quedan. Los reportes y los catálogos devuelven el periodo completo de una vez. El historial de pagos y el de envíos a nómina devuelven las últimas cincuenta líneas.

Errores

Los errores llegan con el código HTTP que corresponde y un cuerpo con un message escrito en español para que se pueda mostrar tal cual a una persona. Cuando el problema es un parámetro mal escrito, viene además un arreglo issues que dice qué campo falla.

{
  "message": "Validación fallida",
  "issues": [ { "path": "from", "message": "Escribe la fecha como AAAA-MM-DD" } ]
}

Referencia

Todas las rutas son consultas y cuelgan de https://api.turnaly.co/v1. Los seis reportes comparten los mismos parámetros: from y to son obligatorios y siteId es opcional para limitar el resultado a una sede.

Personas y organización

GET /employees

Las personas de la empresa con su sede, su área y su cargo. Permite buscar por nombre, documento o código, y filtrar por estado. Es el único listado paginado.

Parámetros: q · siteId · areaId · status · limit · offset

GET /employees/{id}

La ficha completa de una persona con sus contratos, su cuenta de acceso y sus fechas. Incluye el salario y la tarifa de cada contrato.

GET /summary

Los conteos de la empresa: cuántas personas, sedes, áreas y cargos hay, y cuántas personas están sin cuenta, sin contrato o sin consentimiento firmado.

GET /sites

Las sedes con su dirección, sus coordenadas, el radio de la geocerca y si tienen kiosco activo.

GET /sites/nearby

Las cinco sedes más cercanas a un punto, con la distancia en metros.

Parámetros: lat · lng

GET /areas

Las áreas de la empresa, con su jerarquía.

GET /positions

Los cargos de la empresa.

Reportes

GET /reports/attendance

Asistencia del periodo por persona: días programados, días trabajados, días ausentes, minutos trabajados, minutos de retraso y cuántas marcas quedaron por verificar.

Parámetros: from · to · siteId

GET /reports/overtime

Las horas extra y los recargos por persona, desglosados por tipo de hora, con el monto de cada línea y los totales del periodo.

Parámetros: from · to · siteId

GET /reports/lateness

Quién llegó tarde, cuántas veces, cuántos minutos en total y cuál fue el peor retraso. Cuenta los retrasos de más de diez minutos.

Parámetros: from · to · siteId

GET /reports/absenteeism

Los días de ausencia del periodo, agrupados por sede y por tipo de ausencia.

Parámetros: from · to · siteId

GET /reports/contracts

El indicador por tipo de contrato: cuántas personas, cuántas horas trabajadas, cuántas extra y cuánto suman los recargos.

Parámetros: from · to · siteId

GET /reports/risk

Las señales de riesgo por sede: marcas sin verificar, fuera de la geocerca, con GPS simulado, desde un dispositivo compartido o hechas a mano, y el resumen de correcciones por persona.

Parámetros: from · to · siteId

Reglas laborales y calendario

GET /rules/mine

Las reglas que aplica tu empresa: jornada semanal, hora en que empieza y termina la noche, y los porcentajes de cada recargo, con la fecha desde la que rige cada versión.

GET /rules/catalog/colombia

El catálogo de la ley colombiana, con todas sus versiones y sus fechas de entrada en vigor.

GET /rules/version/{fecha}

Qué reglas estaban vigentes en una fecha. Útil para recalcular un periodo viejo con los porcentajes que aplicaban entonces.

GET /rules/holidays/{año}

Los festivos de ese año, como una lista de fechas.

GET /absence-types

Los tipos de ausencia configurados: si son remunerados, si descuentan del saldo, si piden soporte y con qué código salen a nómina.

Turnos

GET /shift-templates

Las plantillas de turno: hora de entrada y de salida, descansos, horas ordinarias y a qué sede o cargo pertenecen.

GET /shift-patterns

Los patrones de rotación, con el ciclo de plantillas que repiten.

Nómina y facturación

GET /payroll/exports

Qué se envió a nómina, cuándo, a qué proveedor, con cuántos empleados y conceptos, y con qué resultado. Las últimas cincuenta líneas.

GET /billing/status

El estado de la suscripción de tu empresa, con las facturas pendientes si las hay.

GET /billing/payments

Los últimos cincuenta intentos de cobro, con su estado y su referencia.

Estado del servicio

GET https://api.turnaly.co/health

El latido del servicio. No lleva el prefijo /v1 y no pide llave: sirve para vigilar desde fuera que la API responde.

Ejemplos completos

Las horas extra del mes pasado

curl -s "https://api.turnaly.co/v1/reports/overtime?from=2026-08-01&to=2026-08-31" \
  -H "Authorization: Bearer $TURNALY_LLAVE"

Devuelve periodo, una lista personas donde cada una trae sus lineas por tipo de hora, y totales con el gran total de horas y de dinero.

Todas las personas activas, página por página

# Primera página; sigue subiendo el offset mientras offset + limit < total.
curl -s "https://api.turnaly.co/v1/employees?status=ACTIVE&limit=200&offset=0" \
  -H "Authorization: Bearer $TURNALY_LLAVE"

Un reporte que se arma solo cada lunes

#!/usr/bin/env bash
# Asistencia de la semana pasada, guardada como JSON con la fecha en el nombre.
set -euo pipefail
desde=$(date -d 'last monday -7 days' +%F)
hasta=$(date -d 'last sunday' +%F)
curl -sf "https://api.turnaly.co/v1/reports/attendance?from=$desde&to=$hasta" \
  -H "Authorization: Bearer $TURNALY_LLAVE" \
  -o "asistencia-$desde.json"

La llave se lee de una variable de entorno; no se escribe dentro del archivo. Con -f, curl falla si la API responde con un error, así que el proceso no guarda un archivo con un mensaje de error dentro.

Lo que todavía no expone

Para que nadie construya encima de algo que no está: hoy una llave no puede leer el detalle de cada marcación, el calendario de turnos asignados, las ausencias de una persona, las hojas de horas individuales, los saldos de vacaciones ni la configuración de la empresa. Tampoco puede descargar los archivos de Excel o de PILA, que se generan desde el panel.

Lo que sí está son los reportes agregados, que cubren la mayoría de los casos: cuánto trabajó cada quien, cuántas extras hubo y cuánto cuestan. Si necesitas algo que no está en esta lista, escríbenos a [email protected] contando qué quieres construir.

No hay webhooks todavía: Turnaly no llama a tus sistemas cuando pasa algo. La integración se hace consultando cada cierto tiempo. Para un reporte diario o semanal alcanza de sobra.

Otras formas de integrar

Nómina, sin programar nada

Si usas Aleluya o Alegra, no necesitas la API: se conectan desde el panel, en Nómina → Conexión, con la cuenta de tu empresa en ese sistema. Turnaly manda las novedades del periodo y guarda el historial de cada envío.

Para los demás sistemas de nómina hay plantillas de archivo en Integraciones: se descarga el archivo del periodo y se sube en el importador de tu sistema, con los códigos que espera la nómina electrónica.

Cargar personas de una vez

Para crear muchas personas se usa el Importador del panel, que recibe una hoja de cálculo, muestra qué va a pasar antes de aplicarlo y señala las filas con problemas. Es la vía de escritura masiva del producto, y es a propósito que pase por una revisión humana.

Marcar desde una tableta en la entrada

El modo kiosco deja marcar a todo un turno desde una tableta fija en la sede, sin que cada persona use su celular. Se configura en Kioscos y la tableta se empareja con un código. Quien registró su rostro puede marcar con él en lugar del PIN (POST /v1/kiosk/punch sin pin, con faceVector, faceModel y challenges: ['BLINK']; si el servidor no lo reconoce responde 401 con codigo: 'USA_PIN'). Está explicado en el manual del panel.

Una tableta con proposito: 'REGISTRO' registra rostros con POST /v1/kiosk/enroll/start, …/consent, …/upload-urls y POST /v1/kiosk/enroll, atadas a un registroToken de diez minutos.

¿Te falta algo en este manual? Escríbenos a [email protected] y lo agregamos.