Dilu

Para programas de gestión

Conecta tu programa con el registro de jornada de Dilu

Dilu registra quién entra y quién sale. Tu programa recibe esos fichajes y, si quiere, nos envía su plantilla de centros y personas. Sin copiar datos a mano y sin tocar el registro.

Qué ofrece

Tres cosas, bien hechas

Dilu es siempre el registro oficial. Tu programa no escribe fichajes: los recibe, y a cambio puede mantener al día la plantilla.

Recibe tu plantilla

Tu programa envía sus centros y sus personas, completos la primera vez y solo los cambios después. Repetir un envío no duplica nada, y cada registro se acepta o se rechaza por separado, con el motivo.

Entrega los fichajes

Una lista ordenada de entradas, salidas, correcciones y cierres de día de tus centros. Pides «lo nuevo desde aquí» y, aunque pases días sin preguntar, te pones al día sin perder nada.

Jornadas ya emparejadas

Si prefieres no emparejar entradas y salidas tú, pides un día de un centro y recibes los intervalos de cada persona y su total, calculado al momento.

Lo que nunca hace

  • No deja a tu programa escribir ni cambiar fichajes: las correcciones las hace el cliente en Dilu y llegan como un fichaje nuevo.
  • No recibe ni entrega PIN, contraseñas, roles ni horarios.
  • No enseña a tu programa nada de otros centros ni de otras empresas.
  • No entrega datos personales de quien tu programa no gestiona: sus horas salen sin nombre ni documento.
  • No da de baja a nadie porque falte en un envío: lo deja «para revisar» y el cliente decide.
  • No borra nada si el cliente quita el enlace: los datos se quedan y se editan a mano.

Cómo se conecta

Un código, un token, y ya está

No hay cuentas de desarrollador ni claves que copiar y pegar. Cada empresa conecta cada programa por su cuenta, y puede desconectarlo cuando quiera.

  1. El dueño crea el enlace

    Desde su móvil, en Ajustes → Enlaces → Nuevo enlace, y con su PIN. Le sale un código de 12 caracteres que vale 15 minutos y una sola vez.

  2. Tu programa lo canjea

    Alguien escribe el código en tu programa, que lo cambia por un token. El token se ve una única vez: guárdalo cifrado. Solo abre los datos de esa empresa.

  3. Envía y lee

    Tu programa envía su plantilla y, cada pocos minutos o cada día, pide los fichajes nuevos con un cursor. El dueño ve en Dilu qué se ha recibido y qué hay que revisar.

Si se pierde el token o se reinstala el programa, el dueño pide un código nuevo y el anterior deja de valer al instante. El código no debe mandarse nunca por correo: es una llave durante 15 minutos.

Cómo se usa

Una API sencilla: HTTPS y JSON

Todas las rutas empiezan por /v1/. Las claves van en inglés y en snake_case, las fechas en formato ISO 8601 con su zona horaria, y los identificadores que tú nos das (external_id) son siempre texto. Después del canje, cada llamada lleva Authorization: Bearer <token>.

LlamadaPara qué sirve
POST /v1/linkCambia el código del dueño por tu token (sin token todavía).
GET /v1/linkComprueba la conexión y lista tus centros.
POST /v1/rosterEnvía centros y personas: completo, o solo lo que cambió.
GET /v1/imports/{id}Consulta el resultado de un envío grande.
GET /v1/events?since=&limit=Fichajes, correcciones y cierres de día de tus centros, con cursor.
GET /v1/workdays?site=&business_date=Un día de un centro con los intervalos emparejados y el total de cada persona.
GET /v1/schemas/rosterLos esquemas JSON públicos (roster, events, workdays), sin token.

1. Vincular: canjear el código

POST /v1/link
{ "code": "K7QM-2XD9-RW4T", "system": "Mi programa 1.0" }

201 Created
{
  "schema_version": "1.0",
  "token": "17|aB3dE5gH7jK9mN1pQ3sT5vW7yZ9bD1fG3hJ5kL7n",
  "link": { "id": "0b6f1c1e-…", "name": "Mi programa" },
  "company": { "legal_name": "Bar La Plaza S.L." }
}

El token solo sale en esta respuesta. El código se puede escribir en minúsculas, con espacios o sin guiones.

2. Enviar la plantilla

POST /v1/roster
Idempotency-Key: 6f1c8a2e-9b0d-4a77-8b5e-1d2c3b4a5f60

{
  "schema_version": "1.0",
  "sync_type": "full",
  "sites": [
    { "external_id": "C-01", "name": "Local Centro", "address": "Calle Ejemplo 1, Gijón",
      "timezone": "Europe/Madrid", "cutoff_time": "09:00" }
  ],
  "employees": [
    { "external_id": "123", "first_name": "Nombre", "last_name": "Apellidos",
      "id_document": "12345678Z", "site_external_ids": ["C-01"] }
  ]
}

200 OK
{ "schema_version": "1.0",
  "import": { "id": "5d1c0b12-…", "status": "done", "sync_type": "full",
    "counts": { "created": 2, "updated": 0, "unchanged": 0, "rejected": 0, "needs_review": 0 },
    "sites":     [ { "external_id": "C-01", "result": "created" } ],
    "employees": [ { "external_id": "123",  "result": "created" } ] } }

Cada registro responde por separado: created, updated, unchanged o rejected (con motivo). Con más de 100 registros la respuesta es 202 y el resultado se consulta después. Si una persona ya trabajaba en Dilu con el mismo DNI o NIE, se enlaza esa en lugar de crear otra.

3. Leer los fichajes

GET /v1/events?since=1&limit=500

200 OK
{
  "schema_version": "1.0",
  "events": [
    { "sequence": 4813, "id": "7c1f4b9e-…", "event_type": "clock_event.recorded",
      "site_external_id": "C-01", "employee_external_id": "123",
      "business_date": "2026-10-10", "type": "in",
      "time": "2026-10-10T20:01:12+02:00", "method": "pin",
      "offline": false, "forgotten": false, "corrects_id": null },
    { "sequence": 4814, "id": "2a9d3c6e-…", "event_type": "business_day.closed",
      "site_external_id": "C-01", "business_date": "2026-10-10",
      "closure_type": "manual", "time": "2026-10-11T03:12:40+02:00", "open_count": 0 }
  ],
  "next": 4815,
  "has_more": false
}
  • Guarda el next de la última respuesta y pídelo como since la próxima vez. Si has_more es verdadero, pide la siguiente página enseguida.
  • La entrega es «al menos una vez»: descarta por id lo que ya viste. Los números de sequence tienen huecos; úsalos para ordenar, no para contar.
  • Una salida olvidada llega con time: null: no suma horas hasta que alguien dé la real, y entonces llega una corrección que apunta al fichaje original.
  • business_date es el día de trabajo del centro, no la fecha de la hora: un turno de las 20:00 a las 02:00 es un solo día.

Reglas del juego

Para que la integración sea fiable

Hecha para reintentar

Repetir un envío no duplica nada, y con Idempotency-Key un corte de red no se convierte en un envío doble. Los errores tienen todos la misma forma y un code que no cambia.

Con límites razonables

60 lecturas y 10 envíos por minuto en cada enlace, hasta 5 000 registros y 2 MB por envío. Si te pasas, la respuesta dice cuándo volver a intentarlo.

Estable

Todo lo que ves aquí es la versión 1. Añadir campos no la rompe (ignora los que no conozcas); un cambio que rompa algo será la versión 2.

Lo que todavía no hay

Los esquemas JSON de lo que la API acepta y devuelve son públicos: https://app.dilu.es/v1/schemas/roster, …/events y …/workdays. La guía paso a paso y un cliente de ejemplo en Python se entregan con el acceso de pruebas.

Hablemos

¿Quieres conectar tu programa?

Cuéntanos cuál es y qué necesitas (recibir fichajes, enviar plantilla, o las dos cosas). Te damos acceso de pruebas y resolvemos las dudas técnicas.

Dilu es un registro de jornada: no gestiona horarios, saldos de horas, vacaciones ni nóminas. Eso lo hace tu programa; nosotros nos ocupamos de que lo fichado sea fiable.