Desarrolladores
Documentación de la API
Con esta API, un programa lee las jornadas, los fichajes, las ausencias y los empleados de una empresa que usa MiJornada. Cada clave pertenece a una empresa y solo ve esa empresa.
Primeros pasos
- El propietario de la empresa crea una clave en Empresa › Integraciones. Se ve una sola vez.
- Envía la clave en la cabecera
Authorizationde cada petición. - Pide
/mepara comprobar que funciona y después/workdayspara sacar las jornadas.
curl
curl "https://api.mijornada.app/v1/me" \
-H "Authorization: Bearer mj_live_…" Dirección base
https://api.mijornada.app/v1
Recursos
-
Cuenta
La empresa y la clave de cada petición.
-
Empleados y centros
Las personas de la empresa, sus centros y las invitaciones.
-
Jornadas y fichajes
Las cifras de cada día y el registro en bruto.
-
Ausencias
Vacaciones y otras ausencias.
-
Eventos y webhooks
Qué ha pasado, en lista o avisándote al momento.
Claves y permisos
Las claves que se crean hoy en la app son de solo lectura: employees:read, time:read y absences:read. Invitar, crear ausencias y los webhooks piden permisos que llegarán con la conexión de Zapier. Si tu programa los necesita, escríbenos.
Fechas y días
Los instantes van en UTC con la letra Z. dayKey es el día laboral en la zona horaria de la empresa, así que un turno que acaba después de medianoche pertenece al día en que empezó.
Paginación
Las listas devuelven data y nextCursor. Pasa nextCursor como cursor hasta que llegue vacío. El tamaño por defecto es 50 y el máximo, 100.
Límites
- 120 peticiones por minuto por clave. Al pasarte, la API responde 429 con
Retry-After. - Las consultas por fechas abarcan como mucho 93 días, y un año en las ausencias.
- 60 invitaciones por hora y clave.
Errores
Los errores usan application/problem+json con un code estable, un detail legible y un requestId para soporte.
| Estado | Código | Qué es |
|---|---|---|
| 401 | invalid_key | La clave falta, es incorrecta o está revocada. |
| 403 | missing_scope | La clave no tiene ese permiso. |
| 403 | organization_closed | La empresa está cerrada. |
| 404 | not_found | No existe en esta empresa. |
| 405 | method_not_allowed | Esa dirección no admite ese método. |
| 409 | conflict | Choca con algo que ya existe: una ausencia solapada, un plan lleno. |
| 409 | idempotency_conflict | Esa Idempotency-Key ya se usó para otra petición. |
| 422 | invalid_parameter | Falta un dato o no es válido. |
| 429 | rate_limited | Demasiadas peticiones. |
| 503 | maintenance | MiJornada está en mantenimiento. |
Comprobar la firma de un webhook
Cada entrega lleva X-MiJornada-Signature: t=<unix>,v1=<hmac>, el HMAC-SHA256 de <t>.<cuerpo> con el secret que devolvió la creación del webhook.
Node.js
import crypto from "node:crypto";
export function isValid(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(",").map((part) => part.split("=")));
const expected = crypto
.createHmac("sha256", secret)
.update(`${parts.t}.${rawBody}`)
.digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
return fresh && crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected));
} Versiones
/v1 puede ganar campos y direcciones nuevas. Quitar o redefinir algo exige /v2.
Última actualización de esta página: .