Webhooks API
Use webhooks to receive near real-time event change notifications from connected calendar providers.
When a user modifies an event in Google, Microsoft, Apple, or CalDAV, Connect can forward the normalized change payload to your configured project webhook URL after you subscribe the calendar via POST /subscribe-webhook.
This API lets you:
- Subscribe a calendar to provider notifications
- Unsubscribe an existing webhook channel
- Receive normalized webhook payloads at your application webhook URL
Supported providers
- Google Calendar (
google) - Microsoft Outlook (
microsoft) - Apple Calendar (
apple) - CalDAV (
caldav)
Subscribe webhook
Creates a webhook subscription for a specific calendar.
Endpoint: POST /subscribe-webhook
Authentication
Requires Bearer token authentication:
Authorization: Bearer YOUR_ACCESS_TOKEN
Request parameters
Provider name. Supported values: google, microsoft, apple, caldav.
Calendar ID to subscribe.
Optional custom subscription channel ID.
Optional Unix timestamp in milliseconds. Provider-specific subscription expiration.
Response
true when subscription is created.
Provider associated with this subscription.
Provider subscription details.
Unique webhook channel/subscription identifier.
Provider resource identifier when available.
ISO 8601 expiration timestamp when available.
Provider callback URL used by the subscription.
Mobiscroll Connect callback endpoint registered with the provider.
Channel ID used for the subscription.
Error responses
- 400 - Missing required parameters, unsupported provider, or project webhook URL not configured
- 401 - Unauthorized (invalid or missing Bearer token)
- 500 - Internal server error
Example
curl -X POST "https://connect.mobiscroll.com/api/subscribe-webhook" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"provider": "google",
"calendarId": "work@company.com",
"channelId": "my-channel-123"
}'
{
"success": true,
"provider": "google",
"subscription": {
"channelId": "my-channel-123",
"resourceId": "resource-abc",
"expiration": "2026-03-19T10:00:00.000Z",
"webhookUrl": "https://your-connect-server/api/webhook-receiver/google"
},
"serverWebhookUrl": "https://your-connect-server/api/webhook-receiver/google",
"channelId": "my-channel-123"
}
Unsubscribe webhook
Removes an existing webhook subscription channel.
Endpoint: POST /unsubscribe-webhook
Authentication
Requires Bearer token authentication.
Request parameters
Provider name. Supported values: google, microsoft, apple, caldav.
Channel/subscription ID to remove.
Optional provider resource ID when applicable.
undefinedResponse
true when request is accepted and local mapping cleanup is completed.
Additional status detail.
Error responses
- 400 - Missing parameters or unsupported provider
- 401 - Unauthorized (invalid or missing Bearer token)
- 500 - Internal server error
Example
curl -X POST "https://connect.mobiscroll.com/api/unsubscribe-webhook" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"provider": "google",
"channelId": "my-channel-123",
"resourceId": "resource-abc"
}'
{
"success": true,
"message": "Webhook unsubscribed successfully"
}
Client webhook payload
When a provider notification is processed, Mobiscroll Connect forwards a normalized payload to your configured project webhook URL.
Notification source provider.
User ID in your system.
Calendar ID where changes were detected.
Changed events list.
Calendar ID where the event belongs.
Event ID.
Event provider.
Event title.
Event description/notes (optional).
ISO 8601 timestamp of the last provider-side modification (optional).
Event start date/time.
Event end date/time.
Indicates all-day event.
Recurring series master ID when this event is an instance (optional).
One of created, updated, deleted.
Optional event color.
Optional event location.
Optional attendee list.
Attendee email.
Response status: accepted, declined, tentative, or none.
Indicates if attendee is organizer.
Optional custom key-value pairs.
Optional conference metadata.
Conference meeting URL.
If true, provider may auto-generate an online meeting link.
Conference provider identifier.
Provider-specific conference payload.
Optional availability: busy or free.
Optional privacy: public, private, or confidential.
Optional event status: confirmed, tentative, or cancelled.
Optional provider event link.
Provider-native event object.
Overall change summary: created, updated, deleted, or mixed.
ISO 8601 processing timestamp.
Additional webhook metadata.
Subscription channel ID.
Number of events in this delivery.
Indicates initial/sync-state delivery when applicable.
Example delivery
{
"provider": "google",
"userId": "user-123",
"calendarId": "work@company.com",
"events": [
{
"id": "event-abc",
"provider": "google",
"calendarId": "work@company.com",
"title": "Product review",
"description": "Quarterly review",
"lastModified": "2026-03-10T09:00:00.000Z",
"start": "2026-03-12T09:00:00.000Z",
"end": "2026-03-12T10:00:00.000Z",
"allDay": false,
"recurringEventId": "series-master-id",
"color": "#9fc6e7",
"location": "Office / Meeting room",
"attendees": [
{
"email": "user@example.com",
"status": "accepted",
"organizer": true
}
],
"custom": {
"yourCustomKey": "yourCustomValue"
},
"conference": {
"url": "https://meet.example.com/abc",
"provider": "google-meet"
},
"availability": "busy",
"privacy": "private",
"status": "confirmed",
"link": "https://provider-event-link",
"changeType": "updated",
"original": {}
}
],
"changeType": "updated",
"timestamp": "2026-03-12T09:01:12.000Z",
"metadata": {
"channelId": "sub-123",
"eventCount": 1,
"isInitialSync": false
}
}
Setup requirements
- Configure Webhook URL in your Connect application settings. See Application setup.
- Ensure your webhook endpoint is public, reachable, and returns
2xxquickly. - Keep endpoint handling idempotent and tolerant of out-of-order notifications.
Operational notes
- Delivery forwarding to your webhook URL is best-effort and should be handled with idempotent processing on your side.
- Provider-side notifications may be emitted for changes regardless of where the change originated.
- Connect applies built-in echo/loop filtering for very recent API-originated changes (short-lived in-memory dedup window, currently 30 seconds), so webhook echoes for your own immediate
POST /event/PUT /eventupdates are suppressed in the common case. - In distributed or multi-instance setups, add an application-level origin marker in
custom(for examplecustom.source = "my-system") and ignore matching webhook events as an additional loop-prevention safeguard. - For Apple, event change detection is based on periodic synchronization (polled every 5 minutes) rather than provider-native push.
- For CalDAV, event change detection is based on periodic synchronization rather than provider-native push.
- A single delivery may contain multiple event changes and return
changeType: "mixed". - When notifications are filtered out, no events may be delivered in that callback cycle.