Create an appointment

.md

Put something in a calendar, with guests, a video link and reminders.

Scopescalendar:write
POST/v1/me/calendar/events

Creates one appointment in a calendar this account may write in. Whether the guests are told is a field, not a side effect: correcting your own typo should not put mail in six inboxes.

Request

FieldRequiredDescription
calendar_idyesThe id of a calendar with write or manage access, such as cal_r4d8h2m6t9w3k7nb
titleyes
starts_atyesISO 8601
ends_atyesISO 8601, not before starts_at
all_dayno
descriptionno
locationno
colornoOverrides the calendar's own colour
recurrence_rulenoAn RRULE without the prefix, for example FREQ=WEEKLY;BYDAY=MO. FREQ, INTERVAL, BYDAY, COUNT and UNTIL are understood
conference_urlnoThe provider is worked out from the link, whatever you call it
guests[]noEmail addresses
reminders[]no{ "minutes_before": 10, "channel": "in_app" }, channel in_app or email, at most five
tag_ids[]noLabels of this workspace, by id from the label list, at most twenty. An id from another workspace is refused with validation_failed. The list comes back whole on every appointment
notifynoSend the guests a proper invitation. Needs a verified sending address on the environment

Send the same Idempotency-Key on a retry

Every POST needs an Idempotency-Key header, and a retry that carries the same one gets the first answer back rather than making a second appointment. See idempotency.

curl -X POST https://api.proppertrading.com/v1/me/calendar/events \
  -H "Authorization: Bearer ptat_9f2c1a44_3b8e7d2f5c9a1b4e6d8f0a2c4e6b8d1f" \
  -H "Idempotency-Key: 8f14e45f-ea0d-4d1f-9c4b-3e11f0f2c0a1" \
  -H "Content-Type: application/json" \
  -d '{
    "calendar_id": "cal_r4d8h2m6t9w3k7nb",
    "title": "Intro call",
    "starts_at": "2026-08-25T13:00:00Z",
    "ends_at": "2026-08-25T13:30:00Z",
    "guests": ["[email protected]"],
    "reminders": [{ "minutes_before": 10, "channel": "in_app" }],
    "tag_ids": ["ctag_f7k3w9n2b5r8m4tx"],
    "notify": true
  }'

Response

201, with the appointment as the list returns it.

{
    "data": {
        "id": "evt_w3n8c5h2r7d4j9ps",
        "object": "calendar_event",
        "occurrence_start": null,
        "calendar_id": "cal_r4d8h2m6t9w3k7nb",
        "title": "Intro call",
        "starts_at": "2026-08-25T13:00:00+00:00",
        "ends_at": "2026-08-25T13:30:00+00:00",
        "all_day": false,
        "status": "confirmed",
        "source": "manual",
        "is_recurring": false,
        "tags": [{ "id": "ctag_f7k3w9n2b5r8m4tx", "name": "Onboarding", "color": "emerald" }],
        "can_write": true
    },
    "meta": { "request_id": "req_01kz4bkr1aj1gv63d8fv3133ey" }
}

Errors

StatusCodeMeaning
400missing_idempotency_keyThe Idempotency-Key header was not sent
400validation_failedA field was missing or wrong. error.param names it
403insufficient_scopeThis device does not hold calendar:write
403calendar_read_onlyThe account may read that calendar but not write in it, or it is a followed calendar, which nobody writes in
404resource_not_foundNo such calendar here