eva crm Public API
Appointments

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

GET/v1/appointments/types

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

Responses
200
`data`, the types.
Example request
curl https://api.evacrm.co.uk/v1/appointments/types \
  -H "Authorization: Bearer sk_..."
Example response · 200
{
  "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

GET/v1/appointments

A window of the diary, earliest first. A recurring series appears as its occurrences, one per date, as in the CRM's diary.

Query parameters
fromstring · date or date-time

Start of the window; anything overlapping it is returned.

Default: today
tostring · date or date-time

End of the window. A date-only to covers that whole day, a date-time is exact. At most 366 days after from.

Default: 31 days after from
typestring · list

One or more types by name, value or id: type=Sales,Surveyor.

statusstring · list

One or several. All of them by default, cancelled included.

Valid values: provisional, confirmed, cancelled
userstring · list

One or more users by id or email: appointments they are on directly, or through a team they belong to.

rolestring · list

One or more roles: appointments with at least one participant holding the role.

teamstring · list

One or more teams by id or name.

leadIdstring · uuid

Appointments on one lead. Not with contractId.

contractIdstring · uuid

Appointments on one contract.

appstring · list

What the appointment hangs off; none is a diary entry on nothing.

Valid values: lead, contract, aftercare, none
updatedSincestring · date or date-time

Everything changed since then, oldest change first and no window: for keeping a mirror. Implies order=updatedAt:asc.

orderstring
Valid values: start:asc, start:desc, updatedAt:asc
Default: start:asc
limitinteger · 1 to 100
Default: 50
cursorstring

From a previous nextCursor. Paging works exactly as for leads.

Responses
200
A page of appointments, `hasMore` and `nextCursor`.
422
An unknown parameter, a backwards or oversized window, both `leadId` and `contractId`, or a stale cursor. `fields` names it.
Example request
# 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_..."
Example response · 200
{
  "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, end and allDay: in your timezone. An all-day entry covers its calendar days.
  • participants: who it is for. kind is user (with email) or team. Empty when unassigned.
  • linkedTo: the record it belongs to. kind is lead, contract, aftercare (a service call), holiday-booking (an approved absence) or whatever else the CRM files it under, with the record's id and code where it has them. null for a diary entry on nothing.
  • status and outcome: 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.
  • title and eventName: title is what the diary shows; eventName is the label staff typed, when they did.

GET Get an appointment

GET/v1/appointments/{id}

One appointment, in the same shape.

Path parameters
idstring · uuidRequired

The appointment's id.

Responses
200
The appointment.
404
No such appointment in your organisation.
Example request
curl https://api.evacrm.co.uk/v1/appointments/cff5e8d2-bd17-4546-bbc6-0376a41596c3 \
  -H "Authorization: Bearer sk_..."
Example response · 200
{
  "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"
}

On this page