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 around it is the same for every event.
| Event type | Sent when |
|---|---|
MachineStopCreated | A machine stop starts. |
MachineStopEnded | A machine stop ends. |
MachineStopClassificationCreated | A machine stop is classified. |
MachineStopClassificationUpdated | A stop's classification changes. |
MachineStopClassificationDeleted | A stop's classification is removed. |
Ping | Pulsar tests your endpoint. |
Machine stops
When a machine stops, Pulsar records the stop. The stop events tell you about it as it happens: MachineStopCreated when it starts and MachineStopEnded when it ends, whether or not anyone has classified it yet. To also hear about its cause, subscribe to the classification events below.
Turned on per company
Stop events are enabled company by company. Ask your Pulsar contact to turn them on for yours before you register an endpoint for them.
Both stop events carry the same event object. It has the same fields as the classification events, but the cause fields are null while the stop is unclassified:
| 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. null while the stop is still open. |
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. null while the stop is unclassified. |
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 | null | true if the classification was applied automatically by a rule, false if a person entered it. null while the stop is unclassified. |
As with classifications, a stop is identified by its machine and its start. Use that pair to match a MachineStopEnded to the MachineStopCreated you already received, and to a later classification event for the same stop.
Stop created
MachineStopCreated is sent when Pulsar records a new stop. The cause fields are null until someone classifies it.
{
"eventId": "2a7c9e14-6b3d-4f81-a5c2-9d0e7f3b1a68",
"eventTimestamp": "2026-09-25T13:41:52.306Z",
"eventType": "MachineStopCreated",
"event": {
"machine": "Injection molder 4",
"machineExternalName": "INJ-004",
"start": "2026-09-25T13:41:07.000Z",
"end": null,
"operator": "Ana Torres",
"generalCause": null,
"specificCause": null,
"component": null,
"description": null,
"isAutomated": null
}
}Stop ended
MachineStopEnded is sent when a stop gets its end time. A stop that Pulsar records already closed is sent as both MachineStopCreated and MachineStopEnded.
{
"eventId": "e6b13f80-4c2a-4d97-8e5b-1f9a7c3d0b24",
"eventTimestamp": "2026-09-25T13:59:04.751Z",
"eventType": "MachineStopEnded",
"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": null,
"specificCause": null,
"component": null,
"description": null,
"isAutomated": null
}
}If the stop was classified before the event was delivered, the cause fields carry that classification.
What to expect
- Shift changes split stops. A stop still open when a shift ends is closed at the shift change, and a new stop starts in the next shift. You receive a
MachineStopEndedfor the first and aMachineStopCreatedfor the second. - A stop's start can move. Pulsar can adjust a stop's start time after recording it. Because a stop is identified by its
start, you then receive aMachineStopCreatedfor the new start and nothing more for the old one. - Only detected stops. Stops that someone adds or splits by hand in Pulsar don't send stop events yet.
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.
Names, not IDs
Machines, causes, components and operators are sent by name. If one is renamed in Pulsar, later events carry the new name.
Created
MachineStopClassificationCreated is sent when a stop is classified for the first time.
{
"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
MachineStopClassificationUpdated is sent when an existing classification changes, for example when someone corrects the cause. The event object carries the classification's current values.
{
"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
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.
{
"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
For stop events and for classification created and updated events, Pulsar reads the stop or 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, and a MachineStopCreated that's delivered late can already include end. Treat each event as "this stop now looks like this", not as a record of one particular edit.
If a stop no longer exists when Pulsar prepares its stop event, for example because its start moved, the event isn't sent.
A retry or replay resends exactly the same body as the first attempt, so it never picks up later changes.