Events and payloads
The nine available events, their envelope and business data.
On this page
Common envelopeAppointmentscustomer.createdvehicle.createdrepair.status_changedcall.completedcallback.requestedquote.requestedGET /events/sampleCommon envelope
{
"id": "evt_3f2504e0-...",
"event": "reservation.created",
"createdAt": "2026-07-04T10:00:00.000Z",
"data": {
"reservationId": 101
}
}
id identifies the delivery and remains the same for retries. createdAt is the message build/delivery time, not necessarily the time of the business change.
Appointments
reservation.created signals creation; reservation.modified a time or detail change; reservation.cancelled a cancellation. All three use the following data.
{
"reservationId": 101,
"status": "confirmed",
"startTime": "2026-07-06T08:00:00.000Z",
"startLocal": "2026-07-06T10:00:00.000+02:00",
"endTime": "2026-07-06T08:30:00.000Z",
"fullDay": false,
"service": {
"id": 11,
"name": "Vidange",
"durationType": "fixed"
},
"resource": {
"id": 21,
"name": "Pont 1"
},
"customer": {
"id": 31,
"name": "Jean",
"lastName": "Dupont",
"email": "jean.dupont@example.com",
"phone": "+33612345678"
},
"guest": null,
"guestCount": 1,
"notes": null,
"cancellationReason": null,
"vehicle": {
"id": 41,
"plate": "AB123CD",
"make": "Renault",
"model": "Clio",
"year": 2019,
"mileage": "80 000 km",
"displayName": "Renault Clio AB-123-CD"
},
"repairStatus": "in-repair"
}
vehicle contains the booking’s vehicle, or null when no vehicle is linked. repairStatus is separate from the booking status: its possible values are in-repair, ready, delivered or null (unset).
reservation.modified additionally includes previousStartTime (UTC) and previousStartLocal. For cancellations, status is cancelled and cancellationReason contains the reason. For full-day services, fullDay is true, endTime is null and startLocal is a date-only ISO value in the workspace’s timezone, such as 2026-07-06.
customer.created
Emitted when a customer is created.
{
"customerId": 31,
"name": "Jean",
"lastName": "Dupont",
"civility": "Monsieur",
"email": "jean.dupont@example.com",
"phone": "+33612345678",
"metadata": {
"vehicule": "Renault Clio"
}
}
vehicle.created
Emitted when a new vehicle is added to a customer. vehicleId identifies the vehicle; customer contains the associated customer’s contact details.
{
"vehicleId": 41,
"plate": "AB123CD",
"make": "Renault",
"model": "Clio",
"year": 2019,
"mileage": "80 000 km",
"displayName": "Renault Clio AB-123-CD",
"customer": {
"id": 31,
"name": "Jean",
"lastName": "Dupont",
"email": "jean.dupont@example.com",
"phone": "+33612345678"
}
}
Plates are stored in uppercase without separators, for example AB123CD. displayName is the human-readable label shown in the dashboard. mileage is a string, such as 80 000 km; do not assume it is numeric.
repair.status_changed
Emitted when a booking’s repair status changes. The payload contains the full reservation data, with repairStatus for the new value and previousRepairStatus for the value before the change. previousRepairStatus is null when the status was previously unset. This example shows a change from in-repair to ready.
{
"reservationId": 101,
"status": "confirmed",
"startTime": "2026-07-06T08:00:00.000Z",
"startLocal": "2026-07-06T10:00:00.000+02:00",
"endTime": "2026-07-06T08:30:00.000Z",
"fullDay": false,
"service": {
"id": 11,
"name": "Vidange",
"durationType": "fixed"
},
"resource": {
"id": 21,
"name": "Pont 1"
},
"customer": {
"id": 31,
"name": "Jean",
"lastName": "Dupont",
"email": "jean.dupont@example.com",
"phone": "+33612345678"
},
"guest": null,
"guestCount": 1,
"notes": null,
"cancellationReason": null,
"vehicle": {
"id": 41,
"plate": "AB123CD",
"make": "Renault",
"model": "Clio",
"year": 2019,
"mileage": "80 000 km",
"displayName": "Renault Clio AB-123-CD"
},
"repairStatus": "ready",
"previousRepairStatus": "in-repair"
}
call.completed
{
"callRecordId": 51,
"callId": "demo-call-1",
"direction": "inbound",
"startedAt": "2026-07-06T07:58:00.000Z",
"endedAt": "2026-07-06T08:01:00.000Z",
"durationSeconds": 180,
"outcome": "booked",
"callerNumber": "+33612345678",
"calledNumber": "+33987654321",
"reservationId": 101,
"callbackRequested": false
}
callback.requested
{
"callRecordId": 52,
"reason": "Demande de rappel pour un devis",
"urgency": "urgent",
"callerNumber": "+33612345678",
"customer": {
"id": 31,
"name": "Jean",
"lastName": "Dupont",
"phone": "+33612345678"
}
}
quote.requested
Data is passed through from the voice tool with no fixed schema or backing record. Possible fields include customerName, verifiedCallerPhone, vehicle, requestedServices, plate, mileage and notes. Do not assume they are all required.
GET /events/sample
event is required and must name one of the nine events, including vehicle.created and repair.status_changed. limit ranges from 1 to 10 and defaults to 3. The response is a bare JSON array, with no docs wrapper.
curl 'https://app.kawlya.com/api/integrations/v1/events/sample?event=reservation.created&limit=3' \
-H "Authorization: Bearer $KAWLYA_API_KEY"
[
{
"id": "evt_sample_a1b2c3d4",
"event": "reservation.created",
"createdAt": "2026-07-04T10:00:00.000Z",
"data": {
"reservationId": 101,
"status": "confirmed",
"startTime": "2026-07-06T08:00:00.000Z",
"startLocal": "2026-07-06T10:00:00.000+02:00",
"endTime": "2026-07-06T08:30:00.000Z",
"fullDay": false,
"service": {
"id": 11,
"name": "Vidange",
"durationType": "fixed"
},
"resource": {
"id": 21,
"name": "Pont 1"
},
"customer": {
"id": 31,
"name": "Jean",
"lastName": "Dupont",
"email": "jean.dupont@example.com",
"phone": "+33612345678"
},
"guest": null,
"guestCount": 1,
"notes": null,
"cancellationReason": null,
"vehicle": {
"id": 41,
"plate": "AB123CD",
"make": "Renault",
"model": "Clio",
"year": 2019,
"mileage": "80 000 km",
"displayName": "Renault Clio AB-123-CD"
},
"repairStatus": "in-repair"
}
}
]
Samples use your workspace’s recent records and the same builders as real deliveries. Demo data is used when no records exist, and always for quote.requested. Errors: 400 unknown event or 401 for an invalid key.