Saltar al contenido
MiJornada

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: .