Skip to content
Documentation
Open app
Documentation/Webhooks

Events and payloads

The nine available events, their envelope and business data.

On this pageCommon envelopeAppointmentscustomer.createdvehicle.createdrepair.status_changedcall.completedcallback.requestedquote.requestedGET /events/sample

Common envelope

Webhook 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.

Reservation 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.

Customer data
{
  "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.

Vehicle data
{
  "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.

Repair status change 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": "ready",
  "previousRepairStatus": "in-repair"
}

call.completed

Call data
{
  "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

Callback data
{
  "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.

Request
curl 'https://app.kawlya.com/api/integrations/v1/events/sample?event=reservation.created&limit=3' \
  -H "Authorization: Bearer $KAWLYA_API_KEY"
200 OK
[
  {
    "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.

Updated