Calendar webhook

Unipile 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

curl --request POST \
     --url https://<YOUR_DSN>/api/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/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": "[email protected]",
  "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": "[email protected]",
    "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": "[email protected]",
  "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": "[email protected]",
    "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": "[email protected]"
}

Common fields

FieldTypeDescription
eventstringWebhook event name
webhook_namestringName given when creating the webhook
account_idstringUnipile 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, etc.
transparencystringopaque or transparent
event_typestringdefault, etc.
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).