| Event | Sent when |
|---|---|
connection.created | A connection is created, including one that is still waiting for its credentials. |
connection.updated | A connection changes: new credentials, a new name or metadata, a reconnect. |
connection.deleted | A connection is deleted. data.deleted is soft or force. |
connection.deactivated | A connection is switched off. It stops syncing and serving data until it is switched on again. |
connection.reactivated | A switched-off connection is switched on again. |
connection.credentials_expired | The connected system refused the stored credentials. Syncing has stopped until new credentials are supplied. Sent once, on the first refusal. |
sync.completed | A sync run finishes. data.status is success or failed, so you can alert on either. |
entity.detected | A sync brought in records Makini has not seen before. |
entity.updated | A sync brought in changes to records Makini already had. |
entityTypes, such as WorkOrder and Asset); connection and sync events are never filtered by it.| Field | Meaning |
|---|---|
id | The event's unique id. It is also the X-Makini-Delivery header, and it stays the same on every retry. |
type | The event name, such as sync.completed. Also sent as the X-Makini-Event header. |
occurredAt | When Makini recorded the event (RFC 3339, UTC). |
source | Always management-api. |
data | The event's payload, shown below. |
connection.deleted adds deleted.{
"id": "5b0d7c52-2f9e-4d0b-9a57-1c3e8f6a2d41",
"type": "connection.updated",
"occurredAt": "2026-09-25T09:41:07.512Z",
"source": "management-api",
"data": {
"connection": {
"id": "0192f3a1-7c2e-7b10-9d4e-5f1a2b3c4d5e",
"clientId": "9e8d7c6b-5a49-4382-a1b0-c9d8e7f6a5b4",
"name": "Plant 4 fleet",
"email": "ops@customer.example",
"platform": "fleetio",
"adapterSlug": "fleetio",
"userMetadata": { "customerId": "cus_8812" },
"connectedAt": "2026-09-20T14:02:11.000Z",
"deactivatedAt": null,
"credentialsExpiredAt": null,
"mcpUserId": null,
"egressProfileId": null,
"createdAt": "2026-09-20T13:58:40.000Z",
"updatedAt": "2026-09-25T09:41:07.000Z"
}
}
}userMetadata holds the metadata you attached when the connection was created, so you can tie the event back to your own customer.entityType is its schema name in the API Reference, and id is the Makini id: pass it to GET /v4/<entity>/{id} for the full record.https:// URL. Plain http:// is accepted for localhost while you develop. Makini checks the address when you save and again before every delivery, and never sends to private or reserved network addresses.data.entities. Fewer requests for a busy sync.data.entity. Simplest when each record drives its own job.sync.completed with firstSuccess: true and no entity events. Read that first load straight from the API instead: it's faster and it's complete.sync.completed with status: "success" and firstSuccess: true, page through each list endpoint you need, such as GET /v4/work-orders, without updatedSince. Use a connection-scoped token for data.connectionId (see Access tokens).startedAt as that connection's cursor.sync.completed, read each list with updatedSince=<cursor>, then move the cursor to this event's startedAt.id never changes, so you upsert by it.updatedSince read is your complete, ordered record of every change. Most integrations use both.