API reference

Appointments

Visits, calls and fittings. Appointments created through the API are marked with source "api".

Endpoints

GET/api/v1/appointmentsList, newest first
POST/api/v1/appointmentsCreate · write key
GET/api/v1/appointments/{id}Get one
PATCH/api/v1/appointments/{id}Change · write key
DELETE/api/v1/appointments/{id}Delete · write key · owners, admins, managers

Fields

Every record also has object = "appointment".

FieldTypeDescription
id
read only
uuidUnique ID.
brand_id
required on create
set on create only
uuidThe brand this belongs to (see GET /brands). Required when creating; cannot be changed.
client_iduuidThe client it belongs to (optional).
title
required on create
string, max 200What the appointment is.
starts_at
required on create
date-timeStart, ISO 8601 with time zone.
ends_atdate-timeEnd, ISO 8601 with time zone.
statusone of: active, cancelled, completed, no_showDefault: active.
source
read only
stringWhere it came from: quilo, calendly, google or api.
created_at
read only
date-timeWhen it was created (UTC, ISO 8601).

List filters

Add to GET /api/v1/appointments as query parameters. Also limit (1–200, default 50) and cursor. See Pagination.

ParameterTypeMeaning
brand_iduuidOnly this brand.
client_iduuidOnly this client.
starts_afterdate-timeStarts at or after this time.
starts_beforedate-timeStarts before this time.
statusone of: active, cancelled, completed, no_showOnly this status.

List

Terminal
curl "$QUILO_URL/api/v1/appointments?limit=20&status=active" \
  -H "Authorization: Bearer $QUILO_API_KEY"
JSON
{
  "object": "list",
  "data": [
    {
      "object": "appointment",
      "id": "6f1c2a90-3b4d-4e5f-8a7b-9c0d1e2f3a4b",
      "brand_id": "0b7e9a52-1c3d-4f6e-9a8b-7c6d5e4f3a2b",
      "client_id": "5d2c1b0a-9e8f-4a7b-8c6d-5e4f3a2b1c0d",
      "title": "Ring fitting",
      "starts_at": "2026-10-20T14:00:00+02:00",
      "ends_at": "2026-10-20T14:45:00+02:00",
      "status": "active",
      "source": null,
      "created_at": "2026-10-17T09:30:00Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Create

Answers 201 Created with the new appointment. Send an Idempotency-Key to retry safely. Quilo sets source = "api".

Terminal
curl -X POST "$QUILO_URL/api/v1/appointments" \
  -H "Authorization: Bearer $QUILO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: my-unique-id-123" \
  -d '{
  "brand_id": "0b7e9a52-1c3d-4f6e-9a8b-7c6d5e4f3a2b",
  "client_id": "5d2c1b0a-9e8f-4a7b-8c6d-5e4f3a2b1c0d",
  "title": "Ring fitting",
  "starts_at": "2026-10-20T14:00:00+02:00",
  "ends_at": "2026-10-20T14:45:00+02:00"
}'

Get one

Terminal
curl "$QUILO_URL/api/v1/appointments/ID" -H "Authorization: Bearer $QUILO_API_KEY"
JSON
{
  "object": "appointment",
  "id": "6f1c2a90-3b4d-4e5f-8a7b-9c0d1e2f3a4b",
  "brand_id": "0b7e9a52-1c3d-4f6e-9a8b-7c6d5e4f3a2b",
  "client_id": "5d2c1b0a-9e8f-4a7b-8c6d-5e4f3a2b1c0d",
  "title": "Ring fitting",
  "starts_at": "2026-10-20T14:00:00+02:00",
  "ends_at": "2026-10-20T14:45:00+02:00",
  "status": "active",
  "source": null,
  "created_at": "2026-10-17T09:30:00Z"
}

Unknown IDs, IDs from other companies and records you cannot access all answer 404 not_found.

Change

Send only the fields to change. brand_id cannot be changed after creation.

Terminal
curl -X PATCH "$QUILO_URL/api/v1/appointments/ID" \
  -H "Authorization: Bearer $QUILO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Ring fitting"}'

Delete

Owners, admins and managers only, with a Read and write key. Deleting cannot be undone.

Terminal
curl -X DELETE "$QUILO_URL/api/v1/appointments/ID" -H "Authorization: Bearer $QUILO_API_KEY"
JSON
{
  "object": "appointment",
  "id": "6f1c2a90-3b4d-4e5f-8a7b-9c0d1e2f3a4b",
  "deleted": true
}