Read the diary
Appointment types, and the diary filtered by window, type, status, staff, role, team or record.
An appointment is a diary entry: a Sales visit, a Survey, a Fitting, a Service call, a Holiday
or a plain Standard entry. Each has a type, a status (provisional, confirmed or
cancelled), a start and an end, the staff it is for (participants, shown as "For" in the
CRM: users, teams, or both) and, usually, the lead or contract it belongs to. To add to the
diary, see booking; to find a free person first,
availability.
GET Appointment types
/v1/appointments/typesThe types your organisation has switched on, in its own order. roles says who a type is
booked for, the way the CRM's booking form narrows its "For" list; pass them to
availability to find a free person. An empty roles means
anyone. Wherever a type is expected, send its name, its value or its id; all three work
and matching ignores case. value is the safe choice for names with spaces: type=showroom
rather than type=Showroom%20Appointment. No parameters. Cached for five minutes.
curl https://api.evacrm.co.uk/v1/appointments/types \
-H "Authorization: Bearer sk_..."{
"object": "list",
"data": [
{ "id": "ab6e78a0-4e85-405f-ba19-4753beac8445", "name": "Sales", "value": "sales", "roles": ["salesman"], "color": "#ddd6fe", "textColor": "#374151" },
{ "id": "5d1f0c2e-1b7a-4c0e-9c1d-2a6f3b8e9d10", "name": "Surveyor", "value": "surveyor", "roles": ["surveyor"], "color": "#c7d2fe", "textColor": "#374151" },
{ "id": "0c4b9a7e-6d2f-4e8a-b1c3-7f9e2d5a6b41", "name": "Standard", "value": "standard", "roles": [], "color": "#fbcfe8", "textColor": "#374151" }
]
}GET List appointments
/v1/appointmentsA window of the diary, earliest first. A recurring series appears as its occurrences, one per date, as in the CRM's diary.
fromstring · date or date-timeStart of the window; anything overlapping it is returned.
todaytostring · date or date-timeEnd of the window. A date-only to covers that whole day, a date-time is exact. At most 366
days after from.
31 days after fromtypestring · listOne or more types by name, value or id: type=Sales,Surveyor.
statusstring · listOne or several. All of them by default, cancelled included.
provisional, confirmed, cancelleduserstring · listOne or more users by id or email: appointments they are on directly, or through a team they belong to.
rolestring · listOne or more roles: appointments with at least one participant holding the role.
teamstring · listOne or more teams by id or name.
leadIdstring · uuidAppointments on one lead. Not with contractId.
contractIdstring · uuidAppointments on one contract.
appstring · listWhat the appointment hangs off; none is a diary entry on nothing.
lead, contract, aftercare, noneupdatedSincestring · date or date-timeEverything changed since then, oldest change first and no window: for keeping a mirror.
Implies order=updatedAt:asc.
orderstringstart:asc, start:desc, updatedAt:ascstart:asclimitinteger · 1 to 10050cursorstringFrom a previous nextCursor. Paging works exactly as for leads.
# confirmed sales visits in a given week
curl "https://api.evacrm.co.uk/v1/appointments?from=2026-10-13&to=2026-10-17&type=Sales&status=confirmed" \
-H "Authorization: Bearer sk_..."
# showroom appointments in the next 31 days — the type's value, or its name URL-encoded
curl "https://api.evacrm.co.uk/v1/appointments?type=showroom" \
-H "Authorization: Bearer sk_..."
# one person's diary for a day, whether booked directly or through their team
curl "https://api.evacrm.co.uk/v1/appointments?user=jo@example.com&from=2026-10-13&to=2026-10-13" \
-H "Authorization: Bearer sk_..."
# keep a mirror: every change since your last run, oldest first
curl "https://api.evacrm.co.uk/v1/appointments?updatedSince=2026-10-12T22:00&limit=100" \
-H "Authorization: Bearer sk_..."{
"object": "list",
"data": [
{
"id": "cff5e8d2-bd17-4546-bbc6-0376a41596c3",
"title": "NN4 8LN - Smith",
"eventName": null,
"description": "Customer asked for a morning visit",
"location": "6 Briar Hill Walk Northampton NN4 8LN",
"type": { "id": "ab6e78a0-4e85-405f-ba19-4753beac8445", "name": "Sales", "value": "sales" },
"status": "confirmed",
"outcome": null,
"start": "2026-10-13T10:00:00.000+01:00",
"end": "2026-10-13T11:00:00.000+01:00",
"allDay": false,
"participants": [
{ "kind": "user", "id": "50f716dc-c202-4d27-bc60-a1697533e03b", "name": "Jo Savant", "email": "jo@example.com" }
],
"linkedTo": { "kind": "lead", "id": "8bd8e096-dd31-44cf-8373-3a00db14dfd3", "code": "L013885" },
"locked": false,
"createdBy": { "id": "50f716dc-c202-4d27-bc60-a1697533e03b", "name": "Jo Savant" },
"createdAt": "2026-10-01T14:14:54.527+01:00",
"updatedAt": "2026-10-01T14:14:54.527+01:00"
}
],
"hasMore": false,
"nextCursor": null
}start,endandallDay: in your timezone. An all-day entry covers its calendar days.participants: who it is for.kindisuser(withemail) orteam. Empty when unassigned.linkedTo: the record it belongs to.kindislead,contract,aftercare(a service call),holiday-booking(an approved absence) or whatever else the CRM files it under, with the record'sidandcodewhere it has them.nullfor a diary entry on nothing.statusandoutcome: the status as one of the three values, and the outcome staff recorded afterwards, if any.locked: set by the CRM on fittings that must not be moved.titleandeventName:titleis what the diary shows;eventNameis the label staff typed, when they did.
GET Get an appointment
/v1/appointments/{id}One appointment, in the same shape.
idstring · uuidRequiredThe appointment's id.
curl https://api.evacrm.co.uk/v1/appointments/cff5e8d2-bd17-4546-bbc6-0376a41596c3 \
-H "Authorization: Bearer sk_..."{
"id": "cff5e8d2-bd17-4546-bbc6-0376a41596c3",
"title": "NN4 8LN - Smith",
"eventName": null,
"description": "Customer asked for a morning visit",
"location": "6 Briar Hill Walk Northampton NN4 8LN",
"type": {
"id": "ab6e78a0-4e85-405f-ba19-4753beac8445",
"name": "Sales",
"value": "sales"
},
"status": "confirmed",
"outcome": null,
"start": "2026-10-13T10:00:00.000+01:00",
"end": "2026-10-13T11:00:00.000+01:00",
"allDay": false,
"participants": [
{
"kind": "user",
"id": "50f716dc-c202-4d27-bc60-a1697533e03b",
"name": "Jo Savant",
"email": "jo@example.com"
}
],
"linkedTo": {
"kind": "lead",
"id": "8bd8e096-dd31-44cf-8373-3a00db14dfd3",
"code": "L013885"
},
"locked": false,
"createdBy": {
"id": "50f716dc-c202-4d27-bc60-a1697533e03b",
"name": "Jo Savant"
},
"createdAt": "2026-10-01T14:14:54.527+01:00",
"updatedAt": "2026-10-01T14:14:54.527+01:00"
}