Operaciones
Eventos y webhooks
Qué ha pasado, en lista o avisándote al momento.
Listar eventos recientes
GET /v1/events
Eventos recientes de un tipo, del más nuevo al más antiguo, con la misma forma que los webhooks. Pide el permiso que lee esos datos.
Parámetros
type obligatorio | time_event.recorded | time_import.committed | workday.closed | absence.requested | absence.approved | absence.rejected | absence.cancelled | correction.approved | correction.rejected | employee.joined | |
since opcional | string (date-time) | Solo los eventos desde este momento. |
limit opcional | integer | |
cursor opcional | string | El nextCursor de la página anterior. |
Respuesta 200
Cada elemento de data:
id | string | Estable: el mismo evento tiene siempre el mismo id. |
type | time_event.recorded | time_import.committed | workday.closed | absence.requested | absence.approved | absence.rejected | absence.cancelled | correction.approved | correction.rejected | employee.joined | |
apiVersion | v1 | |
occurredAt | string (date-time) | |
data | object | El mismo objeto que devuelve la lista correspondiente. |
Errores posibles: 401, 403, 422, 429.
Ejemplo
curl "https://api.mijornada.app/v1/events?type=absence.approved" \
-H "Authorization: Bearer mj_live_…" Respuesta de ejemplo
{
"data": [
{
"id": "ab:abc123:APPROVED",
"type": "absence.approved",
"apiVersion": "v1",
"occurredAt": "2026-10-15T07:02:11Z",
"data": {
"id": "abc123",
"employeeId": "abc123",
"employeeName": "Ana García López",
"employeeCode": "E014",
"type": "VACATION",
"status": "APPROVED",
"startDate": "2026-10-15",
"endDate": "2026-10-15",
"requestedDays": 5,
"requestedHours": null,
"createdAt": "2026-10-15T07:02:11Z",
"updatedAt": "2026-10-15T07:02:11Z"
}
}
],
"nextCursor": null
} Listar webhooks
GET /v1/webhooks
Pide el permiso webhooks:manage.
Respuesta 200
Cada elemento de data:
id | string | |
targetUrl | string (uri) | |
events | time_event.recorded | time_import.committed | workday.closed | absence.requested | absence.approved | absence.rejected | absence.cancelled | correction.approved | correction.rejected | employee.joined[] | |
filters | object | Solo envía los eventos que coincidan. Se aplica a time_event.recorded. |
apiVersion | string | |
status | ACTIVE | DISABLED | |
disabledReason | KEY_REVOKED | TARGET_GONE | TOO_MANY_FAILURES | |
lastSuccessAt | string (date-time) | null | |
createdAt | string (date-time) |
Errores posibles: 401, 403, 429.
Ejemplo
curl "https://api.mijornada.app/v1/webhooks" \
-H "Authorization: Bearer mj_live_…" Respuesta de ejemplo
{
"data": [
{
"id": "abc123",
"targetUrl": "https://hooks.example.com/mijornada",
"events": [
"time_event.recorded"
],
"filters": {
"action": "IN",
"worksiteId": "centro-1"
},
"apiVersion": "v1",
"status": "ACTIVE",
"disabledReason": "KEY_REVOKED",
"lastSuccessAt": "2026-10-15T07:02:11Z",
"createdAt": "2026-10-15T07:02:11Z"
}
],
"nextCursor": null
} Crear un webhook
POST /v1/webhooks
MiJornada envía un POST firmado a targetUrl por cada evento, unos dos minutos después de que ocurra. Un fichaje se retiene 90 segundos porque todavía se puede deshacer.
Cada entrega lleva X-MiJornada-Signature: t=<unix>,v1=<hmac>, el HMAC-SHA256 de <t>.<cuerpo> con el secret que se devuelve aquí, y que solo se ve una vez.
Las entregas fallidas se reintentan hasta 12 veces, durante cerca de un día. Responder 410 para el webhook. También lo paran 20 fallos seguidos y tres días sin éxito, y se avisa al propietario. Pide el permiso webhooks:manage, más el que lee cada evento.
Cuerpo
targetUrl obligatorio | string (uri) | Una dirección https pública. |
events obligatorio | time_event.recorded | time_import.committed | workday.closed | absence.requested | absence.approved | absence.rejected | absence.cancelled | correction.approved | correction.rejected | employee.joined[] | |
filters opcional | object | Solo envía los eventos que coincidan. Se aplica a time_event.recorded. |
Respuesta 201
id | string | |
targetUrl | string (uri) | |
events | time_event.recorded | time_import.committed | workday.closed | absence.requested | absence.approved | absence.rejected | absence.cancelled | correction.approved | correction.rejected | employee.joined[] | |
filters | object | Solo envía los eventos que coincidan. Se aplica a time_event.recorded. |
apiVersion | string | |
status | ACTIVE | DISABLED | |
disabledReason | KEY_REVOKED | TARGET_GONE | TOO_MANY_FAILURES | |
lastSuccessAt | string (date-time) | null | |
createdAt | string (date-time) | |
secret | string |
Errores posibles: 401, 403, 409, 422, 429.
Ejemplo
curl -X POST "https://api.mijornada.app/v1/webhooks" \
-H "Authorization: Bearer mj_live_…" \
-H "Content-Type: application/json" \
-d '{"targetUrl":"https://hooks.example.com/mijornada","events":["time_event.recorded"]}' Respuesta de ejemplo
{
"id": "abc123",
"targetUrl": "https://hooks.example.com/mijornada",
"events": [
"time_event.recorded"
],
"filters": {
"action": "IN",
"worksiteId": "centro-1"
},
"apiVersion": "v1",
"status": "ACTIVE",
"disabledReason": "KEY_REVOKED",
"lastSuccessAt": "2026-10-15T07:02:11Z",
"createdAt": "2026-10-15T07:02:11Z",
"secret": "whsec_…"
} Borrar un webhook
DELETE /v1/webhooks/{id}
Borrar uno que ya no existe también devuelve 204.
Parámetros
id obligatorio | string |
Respuesta 204
Sin contenido.
Errores posibles: 401, 403, 429.
Ejemplo
curl -X DELETE "https://api.mijornada.app/v1/webhooks/abc123" \
-H "Authorization: Bearer mj_live_…" Última actualización de esta página: .