# Events (https://docs.pulsarml.com/webhooks/events)

Every webhook event type, when it fires, and the fields it carries.



Each notification's `eventType` says what happened, and its `event` object carries the data. The [envelope](/webhooks#body) around it is the same for every event.

| Event type                                     | Sent when                           |
| ---------------------------------------------- | ----------------------------------- |
| [`MachineStopClassificationCreated`](#created) | A machine stop is classified.       |
| [`MachineStopClassificationUpdated`](#updated) | A stop's classification changes.    |
| [`MachineStopClassificationDeleted`](#deleted) | A stop's classification is removed. |
| [`Ping`](/webhooks#ping-events)                | Pulsar tests your endpoint.         |

## Machine stop classifications [#machine-stop-classifications]

When a machine stops, Pulsar records the stop. **Classifying** it means recording why it happened: a general cause, optionally a more specific cause and the component involved, and a free-text description. A classification is entered by a person or applied automatically by a rule.

All three classification events carry the same `event` object:

| Field                 | Type           | Description                                                                                       |
| --------------------- | -------------- | ------------------------------------------------------------------------------------------------- |
| `machine`             | string         | The machine's name in Pulsar.                                                                     |
| `machineExternalName` | string \| null | The machine's external name, for example its ID in your ERP. `null` if it has none.               |
| `start`               | string         | When the stop started, as an ISO 8601 UTC timestamp.                                              |
| `end`                 | string \| null | When the stop ended, as an ISO 8601 UTC timestamp. Can be `null`.                                 |
| `operator`            | string \| null | Full name of the operator on the machine when the stop started. `null` if nobody was logged in.   |
| `generalCause`        | string \| null | Name of the general cause.                                                                        |
| `specificCause`       | string \| null | Name of the specific cause.                                                                       |
| `component`           | string \| null | Name of the component involved.                                                                   |
| `description`         | string \| null | Free-text description of the stop.                                                                |
| `isAutomated`         | boolean        | `true` if the classification was applied automatically by a rule, `false` if a person entered it. |

A stop is identified by its machine and its `start`. Use that pair to match an update or deletion to a stop you already know about.

<Callout title="Names, not IDs">
  Machines, causes, components and operators are sent by name. If one is renamed in Pulsar, later events carry the new name.
</Callout>

### Created [#created]

`MachineStopClassificationCreated` is sent when a stop is classified for the first time.

```json
{
  "eventId": "8d2f6c1e-4b7a-4f0e-9a3c-5e1d7b9f2a64",
  "eventTimestamp": "2026-09-25T14:03:12.482Z",
  "eventType": "MachineStopClassificationCreated",
  "event": {
    "machine": "Injection molder 4",
    "machineExternalName": "INJ-004",
    "start": "2026-09-25T13:41:07.000Z",
    "end": "2026-09-25T13:58:30.000Z",
    "operator": "Ana Torres",
    "generalCause": "Mechanical failure",
    "specificCause": "Mold jam",
    "component": "Ejector pin",
    "description": "Part stuck in cavity 2, cleared manually",
    "isAutomated": false
  }
}
```

### Updated [#updated]

`MachineStopClassificationUpdated` is sent when an existing classification changes, for example when someone corrects the cause. The `event` object carries the classification's current values.

```json
{
  "eventId": "c41a7e09-2d6b-4f38-9e15-7b0c3a9d4f22",
  "eventTimestamp": "2026-09-25T14:20:45.117Z",
  "eventType": "MachineStopClassificationUpdated",
  "event": {
    "machine": "Injection molder 4",
    "machineExternalName": "INJ-004",
    "start": "2026-09-25T13:41:07.000Z",
    "end": "2026-09-25T13:58:30.000Z",
    "operator": "Ana Torres",
    "generalCause": "Mechanical failure",
    "specificCause": "Ejector failure",
    "component": "Ejector pin",
    "description": "Ejector pin bent, replaced",
    "isAutomated": false
  }
}
```

### Deleted [#deleted]

`MachineStopClassificationDeleted` is sent when a classification is removed, leaving the stop unclassified. The causes, component, description and `isAutomated` describe the classification **as it was before it was deleted**. The machine, stop times and operator come from Pulsar's current records.

```json
{
  "eventId": "5e93b0d7-8a14-4c6f-b2e8-1d7f0a3c9b56",
  "eventTimestamp": "2026-09-25T15:02:09.804Z",
  "eventType": "MachineStopClassificationDeleted",
  "event": {
    "machine": "Injection molder 4",
    "machineExternalName": "INJ-004",
    "start": "2026-09-25T13:41:07.000Z",
    "end": "2026-09-25T13:58:30.000Z",
    "operator": "Ana Torres",
    "generalCause": "Mechanical failure",
    "specificCause": "Ejector failure",
    "component": "Ejector pin",
    "description": "Ejector pin bent, replaced",
    "isAutomated": false
  }
}
```

## Event data is read at delivery time [#event-data-is-read-at-delivery-time]

For created and updated events, Pulsar reads the classification when it first prepares the notification, not at the instant of the change. If a classification changes twice in quick succession, both events can carry the newer values. Treat each event as "this stop's classification now looks like this", not as a record of one particular edit.

A retry or replay resends exactly the same body as the first attempt, so it never picks up later changes.
