---
title: Webhook event catalogue
description: Every event a webhook can receive, family by family, with what triggers it and the fields of its message.
url: "https://illizeo.com/en/centre-aide/webhooks-event-catalogue/"
updated: "2026-11-05"
category: Platform / Webhooks
---

# Webhook event catalogue

This article lists every event a webhook can receive, family by family, with what triggers it and the fields of its `data`. It is for administrators choosing subscriptions and for developers writing the receiver.

## Before you start

- Events are chosen when creating or editing a webhook, under **Settings › Manage Illizeo › Webhooks** (see [Creating and managing a webhook](https://illizeo.com/en/centre-aide/webhooks-creating-and-managing/)).
- The Scheduling, Annualised working time, Budget & payroll costs, BDESE, Swiss payroll and Flex Office families only exist if the module is enabled in your space: otherwise they are neither offered nor emitted.
- Every message has the same envelope (`id`, `event`, `occurred_at`, `tenant`, `data`), described in [Receiving and verifying a webhook](https://illizeo.com/en/centre-aide/webhooks-receiving-and-verifying/).

## Subscribing to a family

In the webhook window, each family has its own box, with its code (for example `absence.*`). Ticking it subscribes the webhook to all the family's events, including those added to it later; the event boxes are then greyed out. Otherwise, tick events one by one.

![Choosing events in the New webhook window: one card per family (Employees, Absences, Time and attendance, Scheduling…) with the family box and its code, then one box per event with its label and code](https://i0.wp.com/illizeo.com/wp-content/uploads/2026/11/webhooks-event-catalogue-01.en_.png?resize=622%2C798&quality=80&ssl=1)
Events, family by family.

## The events

### Employees (`employee.*`)

| Code | Label | Triggered when |
| --- | --- | --- |
| `employee.created` | Employee created | An employee is created, through the screen, an import, the API or a connector. A hire still in draft emits nothing: the event goes out when it is finalised. |
| `employee.updated` | Employee updated | A field of the employee record changes. `changed` gives the names of the fields changed, never their values. |
| `employee.contract_ended` | Contract ended | A contract receives an end date (departure, or end of a parallel job); `ended_at` may be in the future. |

Fields: `employee_id`, and depending on the event `contract_id`, `changed`, `ended_at`.

### Absences (`absence.*`)

| Code | Label |
| --- | --- |
| `absence.requested` | Absence requested |
| `absence.approved` | Absence approved |
| `absence.rejected` | Absence rejected |
| `absence.cancelled` | Absence cancelled |

Fields: `absence_id`, `employee_id`, `absence_type_id`, `from`, `to`, `status`.

### Time and attendance (`attendance.*`)

`attendance.day_closed`, “Attendance day closed”: sent every night for the previous day, once per employee who clocked that day. A later correction to that day is not sent again: read the period back through the API if needed. Fields: `employee_id`, `date`, `worked_minutes`, `status`.

### Scheduling (`scheduling.*`)

| Code | Label |
| --- | --- |
| `shift.published` | Shift published |
| `shift.updated` | Published shift updated |
| `shift.deleted` | Published shift deleted |
| `shift.unpublished` | Shift unpublished |
| `shift.confirmed` | Shift confirmed by the employee |
| `shift.rejected` | Shift declined by the employee |
| `open_shift.claimed` | Open shift claimed |
| `shift.replacement_completed` | Shift replacement completed (new assignee) |
| `shift.checked_in` | Shift checked in |
| `shift.completed` | Shift completed |

Drafts emit nothing. Common fields: `shift_id`, `employee_id`, `employment_id`, `date`, `start_time`, `end_time`, `all_day`, `office_id`, `status`, `is_open`, `open_shift_id`; depending on the event, `publication_id`, `changed`, `responded_at`, `application_id` and `source`, the replacement fields (`replacement_id`, `replacement_type`, `previous_employee_id`, `previous_employment_id`), or `checked_in_at` / `completed_at`, `outside_zone` and `mode` are added.

### Annualised working time (`annualisation.*`)

| Code | Label |
| --- | --- |
| `annualisation.period.ended` | Annualisation period ended (review established) |
| `annualisation.review.closed` | Annualisation review closed |
| `annualisation.review.reopened` | Annualisation review reopened |

Fields: `bilan_id`, `employee_id`, `employment_id`, `regime_id`, `debut`, `fin`, `unite`, `statut`, and the review quantities in hours or days (`objectif`, `realise`, `absences`, `heures_sup_hebdo`, `heures_fin_de_periode`, `deficit`, then on closing `excedent`, `traitement_du_deficit`, `cloture_le`); `reouvertures` for a reopening.

### Documents and signatures (`document.*`, `signature.*`)

| Code | Label | Fields |
| --- | --- | --- |
| `document.uploaded` | Document uploaded | `document_id`, `employee_id`, `category_id` |
| `document.generated` | Document generated | `document_id`, `employee_id` |
| `signature.completed` | Signature completed | `signature_id`, `employee_id`, `provider` |
| `signature.declined` | Signature declined | same |
| `signature.cancelled` | Signature cancelled | same |

### Scheduled exports (`export.*`)

`export.ready`, “Export file ready”: the file of a report scheduled on the “Pickup via API” channel has just been produced; the receiver can download it straight away through the API. Fields: `export_id`, `report_id`, `schedule_id`, `file_name`, `format`, `size_bytes`, `expires_at`.

### Budget & payroll costs (`budget.*`)

| Code | Label |
| --- | --- |
| `budget.overrun` | Projected budget overrun of a unit |
| `budget.equality.recorded` | Pay equity analysis recorded |
| `budget.review_phase` | Salary review: new phase |
| `budget.proposal.submitted` | Salary review: proposal submitted |
| `budget.proposal.validated` | Salary review: proposal approved |
| `budget.proposal.sent_back` | Salary review: proposal sent back |
| `budget.review_decided` | Salary review: validation file decided |
| `budget.campaign.closed` | Salary review closed |

Fields follow the object: the unit and the gap for an overrun, the analysis and its result for pay equity, the campaign and its phase, or the proposal (employee, contract, status, raise percentage, grade, step, effective date) for the salary review.

### BDESE (`bdese.*`)

| Code | Label |
| --- | --- |
| `bdese.published` | BDESE fiscal year version published |
| `bdese.equality_index.published` | Gender equality index published |
| `bdese.consultation.opened` | Works council consultation opened |
| `bdese.consultation.opinion_recorded` | Works council opinion recorded |
| `bdese.consultation.deemed_negative` | Works council opinion deemed negative at the deadline |

Fields: `base_id` and `annee`, then `version` and `publie_le`, `note`, or `consultation_id`, `type`, `echeance` and `avis`.

### Swiss payroll (`swiss_payroll.*`)

| Code | Label |
| --- | --- |
| `swiss_payroll.payroll.closing_pending` | Payroll closing awaiting approval |
| `swiss_payroll.payroll.closed` | Payroll closed |
| `swiss_payroll.payslips.ready` | Payslips ready |
| `swiss_payroll.declaration.pending_approval` | Declaration awaiting approval |
| `swiss_payroll.declaration.sent` | Declaration sent to Swissdec |
| `swiss_payroll.declaration.completed` | Declaration completed |
| `swiss_payroll.declaration.failed` | Declaration failed |
| `swiss_payroll.declaration.refused` | Declaration refused |
| `swiss_payroll.recipient.maintenance` | Recipient under maintenance |
| `swiss_payroll.case.closed` | Case closed by a recipient |

Fields: the payroll (`payroll_id`, `perimeter`, `year`, `month`, with `contracts`, `payslips` or `approval_id`), the declaration (`declaration_id`, `nature`, `test`, `status`, `recipients`) or the recipient (`recipient_id`, `domain`, `institution`, `case_state`).

### Flex Office (`office.*`)

| Codes | Subject |
| --- | --- |
| `office.booking.created`, `.updated`, `.approved`, `.rejected`, `.cancelled`, `.released` | Desk booking created, updated, approved, rejected, cancelled, or desk released (no check-in) |
| `office.visit.created`, `.updated`, `.approved`, `.rejected`, `.cancelled` | Visit created, updated, approved, rejected, cancelled |
| `office.visitor.arrived`, `.departed` | Visitor arrived, departed |
| `office.room_booking.created`, `.updated`, `.cancelled` | Meeting room booked, meeting room booking updated, cancelled |
| `office.check_in.created` | On-site check-in recorded |

These events go out whatever the origin of the change: screen, API or the effect of another action (a site closure, an absence, an archived desk). They only carry identifiers, dates and states. Parking and catering emit none.

![The Webhook events card of the API documentation: the first events (employees, absences, attendance, scheduling), each with the POST mention, its code, its label and the data fields](https://i0.wp.com/illizeo.com/wp-content/uploads/2026/11/webhooks-event-catalogue-02.en_.png?resize=800%2C520&quality=80&ssl=1)
Events in the API documentation.

## Good to know

- The **Webhook events** card of the API documentation repeats this list, with the fields of each event.
- Each event goes out once to each webhook listening to it: two webhooks subscribed to the same event each receive their own message, with the same event identifier.

### *Similaire*
