Calendar webhook

postpress can notify your server in real time when a calendar event is created, updated, or deleted. Calendar webhooks allow you to synchronize events, trigger automation workflows, or maintain a local cache of calendar data without polling.

Available events

  • calendar_event_created → a calendar event is created.
  • calendar_event_updated → a calendar event is updated.
  • calendar_event_deleted → a calendar event is deleted.

Create a calendar webhook

curl --request POST \
     --url https://api.postpress.ai/v1/webhooks \
     --header 'X-API-KEY: <YOUR_API_KEY>' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '{
  "source": "calendar_event",
  "events": [
    "calendar_event_created",
    "calendar_event_updated",
    "calendar_event_deleted"
  ],
  "request_url": "https://webhook.site/53e1cfca-35e7-4fd6-8790-78e03d03daaa",
  "name": "CALENDAR_EVENTS_WEBHOOK"
}'

request_url must be a public HTTPS endpoint able to receive POST requests.

Webhook payloads

All calendar webhook payloads include at least:

  • event: the event type.
  • webhook_name.
  • account_id.
  • calendar_id (calendar owner email or identifier).
  • id (calendar event id).

Payload: calendar_event_created

{
  "event": "calendar_event_created",
  "webhook_name": "CALENDAR_EVENTS_WEBHOOK",
  "account_id": "a4qFy0liRAGo-oZ2YFpirQ",
  "id": "5m8lnvb64dt2uuaq99k4685eeq",
  "master_event_id": "",
  "calendar_id": "xxxxxxxxxn@gmail.com",
  "created_at": "2026-01-16T16:14:01.000Z",
  "updated_at": "2026-01-16T16:14:02.021Z",
  "title": "Meeting with customer",
  "is_cancelled": false,
  "is_all_day": false,
  "is_attendees_list_hidden": false,
  "attendees": [],
  "start": {
    "date_time": "2026-01-20T14:30:00+01:00",
    "time_zone": "Europe/Paris"
  },
  "end": {
    "date_time": "2026-01-20T15:30:00+01:00",
    "time_zone": "Europe/Paris"
  },
  "organizer": {
    "email": "pierre.nice.sun@gmail.com",
    "display_name": ""
  },
  "visibility": "private",
  "transparency": "transparent",
  "event_type": "default",
  "color": "#039BE5"
}

Payload: calendar_event_updated

{
  "event": "calendar_event_updated",
  "webhook_name": "CALENDAR_EVENTS_WEBHOOK",
  "account_id": "a4qFy0liRAGo-oZ2YFpirQ",
  "id": "5m8lnvb64dt2uuaq99k4685eeq",
  "master_event_id": "",
  "calendar_id": "xxxxxxxxxxx@gmail.com",
  "created_at": "2026-01-16T16:14:01.000Z",
  "updated_at": "2026-01-16T16:15:41.115Z",
  "title": "Meeting with customer",
  "body": "Important",
  "location": "Meets",
  "is_cancelled": false,
  "is_all_day": false,
  "is_attendees_list_hidden": false,
  "attendees": [],
  "start": {
    "date_time": "2026-01-20T14:30:00+01:00",
    "time_zone": "Europe/Paris"
  },
  "end": {
    "date_time": "2026-01-20T15:30:00+01:00",
    "time_zone": "Europe/Paris"
  },
  "organizer": {
    "email": "pierre.nice.sun@gmail.com",
    "display_name": ""
  },
  "visibility": "private",
  "transparency": "transparent",
  "event_type": "default",
  "color": "#039BE5"
}

Payload: calendar_event_deleted

{
  "event": "calendar_event_deleted",
  "webhook_name": "CALENDAR_EVENTS_WEBHOOK",
  "account_id": "a4qFy0liRAGo-oZ2YFpirQ",
  "id": "5m8lnvb64dt2uuaq99k4685eeq",
  "calendar_id": "xxxxxxxxxxx@gmail.com"
}

Common fields

FieldTypeDescription
eventstringWebhook event name.
webhook_namestringName given when creating the webhook.
account_idstringpostpress account id.
calendar_idstringCalendar identifier (often the calendar email).
idstringCalendar event id.

Event-specific fields

These fields may be present depending on the event type:

FieldTypeNotes
titlestringEvent title.
bodystringEvent description.
locationstringEvent location.
is_cancelledbooleanEvent cancellation status.
is_all_daybooleantrue if all-day event.
is_attendees_list_hiddenbooleanAttendee list visibility.
attendeesarrayList of attendees.
start.date_timestringStart datetime with offset.
start.time_zonestringStart timezone.
end.date_timestringEnd datetime with offset.
end.time_zonestringEnd timezone.
organizer.emailstringOrganizer email.
recurrencestringRecurrence rules (RRULE). Present only for recurring events.
organizer.display_namestringOrganizer display name.
visibilitystringprivate, and so on.
transparencystringopaque or transparent.
event_typestringdefault, and so on.
colorstringEvent color (hex).
created_atstringISO timestamp.
updated_atstringISO timestamp.
master_event_idstringPresent in payload but often empty (provider-dependent).

Best practices

  • Always respond quickly with HTTP 2xx (within a few seconds).
  • Process the payload asynchronously (queue).
Updated May 2026