Search the docs

Find a page, a section, or an endpoint.

Events

Creating, changing and removing what is on a calendar.

title, start and end are the whole of what is required. Everything else has a default worth having.

curl https://pidgeon.ai/api/v1/identities/idn_4f2a1/calendar/events \
-H "Authorization: Bearer $PIDGEON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
  "title": "Invoice 4471",
  "start": "2026-11-03T09:00:00",
  "end": "2026-11-03T09:30:00",
  "timezone": "Europe/London",
  "location": "A call",
  "attendees": [{ "email": "priya@example.com", "name": "Priya Raman" }]
}'

timezone is optional and you should send it. Without one the calendar's default is used, which is right for an event somebody is adding to their own day and wrong for one you are scheduling on their behalf from a server somewhere else.

Inviting people

attendees is a list of addresses, up to 200. Adding them does not send anything: send_invites does, and it is a separate field because putting a meeting on a calendar and telling five people about it are different acts, and only one of them is undoable.

json
{
"title": "Invoice 4471",
"attendees": [{ "email": "priya@example.com" }],
"send_invites": true
}

With it, Pidgeon sends a real REQUEST from the mailbox — the kind Gmail and Outlook put an Accept button on. Invitations has what arrives and what comes back.

Changing one

PATCH the event. An omitted field survives, so a change to the title is a body with a title in it and nothing else.

sh
PATCH /v1/identities/{id}/calendar/events/{eventId}

Two things are worth knowing before you write.

sequence rises only when the change is one attendees see — the time, the title, the place, the status, the list of people. Editing metadata is yours and does not bump it, so it does not make everybody's calendar client announce an update about nothing.

If-Match makes the write conditional. Every event carries an etag; send it back and the write is refused if somebody changed the event in between rather than silently overwriting them.

curl -X PATCH https://pidgeon.ai/api/v1/identities/idn_4f2a1/calendar/events/evt_8c21 \
-H "Authorization: Bearer $PIDGEON_API_KEY" \
-H 'If-Match: "7c2ae104"' \
-H "Content-Type: application/json" \
-d '{ "location": "Moved to the big room" }'

A mismatch answers 412. Read the event again, decide what to do with the change somebody else made, and write again — the same shape as any other optimistic write.

Taking it off

DELETE removes the event. For one date of a repeating series it does something subtler, because the rule would simply generate that date again — Recurring events has mode and what each value means.