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.
Consigue tu llave
- Entra al panel en app.turnaly.co con una cuenta de administrador.
- Ve a Integraciones y baja hasta Acceso por API.
- Escribe un nombre que diga para qué es la llave, como «Contabilidad» o «Tablero interno», y pulsa Crear llave.
- 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.
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
403con 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.
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 ejemplo2026-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.
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.