Calendar API
One API for Google Calendar, Outlook and Zoom
Events, calendars, free time, meeting links and changes, in one shape for every provider. Your users connect through Pyas Auth, which Google, Microsoft and Zoom have already verified, and you write each feature once.
import { Pyas } from '@pyas/sdk'
const pyas = new Pyas({ apiKey: process.env.PYAS_API_KEY })
const event = await pyas.events.create({
accountId,
title: 'Intro call',
startsAt: '2026-11-03T15:00:00Z',
endsAt: '2026-11-03T15:30:00Z',
attendees: [{ email: 'maya.chen@gmail.com' }],
conferencing: { provider: 'zoom', accountId: zoomAccountId }, // the host's connected Zoom account
})- EventsCreate, read, update and delete, recurring series and their occurrences included. Respond to invitations and move events between calendars.
- CalendarsList calendars, read their settings and colors, and group them. Pyas calendars give people without Google or Outlook a calendar of their own.
- AvailabilityFree/busy for one account or several, and the first meeting times everyone has free inside their working hours, across Google and Outlook.
- Meeting linksGoogle Meet, Microsoft Teams or Zoom from one field on the event. Pyas creates the meeting and puts the link on the event.
- Changes and webhooksSigned webhooks that name the exact event that changed, retried and replayable. Webhooks stream to your laptop while you develop.
- Accounts and healthEach connected account's status, what it can do and why it broke. Users reconnect inside your own product with PyasConnect.
Production
Built for the day after launch
The details that decide whether a calendar integration holds up once real people use it.
- Writes you can retry
- Send an Idempotency-Key with a write and a retry returns the first result instead of doing the work twice. Keys are kept for 24 hours.
- Conflicts when you want them
- Every event has a version. Send it as If-Match and the update is refused if someone changed the event first; leave it out and the write goes through.
- Times in one shape
- Every event has UTC times, local times and an IANA time zone, whatever the provider stored, Windows zone names and all-day events included.
- Your own data on every event
- Save up to 50 values of your own on any event or calendar, such as a booking or deal ID, and find events by them. The same on Google and Outlook, with no extended properties to manage.
- Errors that say what to do
- Every error has a code, a message, a hint and a trace ID. The request logs show what Pyas did for each request and why it failed.
Every operation
101 operations, the same on every provider where the provider supports it. A few (calendar sharing, rooms, Google file uploads) need Native Auth at launch; the reference says which, with every field and error.
Events18
- GET/v2/eventsList events
- POST/v2/eventsCreate an event
- DELETE/v2/events/{eventId}Delete an event
- GET/v2/events/{eventId}Get an event
- PATCH/v2/events/{eventId}Update an event
- GET/v2/events/{eventId}/attachmentsList an event's attachments
- POST/v2/events/{eventId}/attachmentsAttach a link
- DELETE/v2/events/{eventId}/attachments/{attachmentId}Delete an attachment
- GET/v2/events/{eventId}/attachments/{attachmentId}/contentDownload an attachment
- POST/v2/events/{eventId}/attachments/fileUpload a file to an event
- POST/v2/events/{eventId}/forwardForward an invitation
- GET/v2/events/{eventId}/instancesList occurrences of a recurring event
- POST/v2/events/{eventId}/moveMove an event to another calendar
- POST/v2/events/{eventId}/reminder/dismissDismiss a reminder
- POST/v2/events/{eventId}/reminder/snoozeSnooze a reminder
- POST/v2/events/{eventId}/respondRespond to an invitation
- POST/v2/events/importImport an event
- POST/v2/events/quickCreate an event from text
Calendars24
- GET/v2/calendar-groupsList calendar groups
- POST/v2/calendar-groupsCreate a calendar group
- DELETE/v2/calendar-groups/{groupId}Delete a calendar group
- PATCH/v2/calendar-groups/{groupId}Rename a calendar group
- GET/v2/calendarsList calendars
- POST/v2/calendarsCreate a calendar
- DELETE/v2/calendars/{calendarRef}Delete a calendar
- GET/v2/calendars/{calendarRef}Get a calendar
- PATCH/v2/calendars/{calendarRef}Update a calendar
- GET/v2/calendars/{calendarRef}/categoriesList categories
- POST/v2/calendars/{calendarRef}/categoriesCreate a category
- DELETE/v2/calendars/{calendarRef}/categories/{categoryId}Delete a category
- PATCH/v2/calendars/{calendarRef}/categories/{categoryId}Update a category
- DELETE/v2/calendars/{calendarRef}/feedDisable a calendar's feed
- GET/v2/calendars/{calendarRef}/feedGet a calendar's feed
- PUT/v2/calendars/{calendarRef}/feedEnable a calendar's feed
- POST/v2/calendars/{calendarRef}/feed/rotateRotate a feed's link
- GET/v2/calendars/{calendarRef}/permissionsList calendar permissions
- POST/v2/calendars/{calendarRef}/permissionsShare a calendar
- DELETE/v2/calendars/{calendarRef}/permissions/{permissionId}Delete a calendar permission
- PATCH/v2/calendars/{calendarRef}/permissions/{permissionId}Update a calendar permission
- DELETE/v2/calendars/{calendarRef}/subscriptionUnsubscribe from a calendar
- POST/v2/calendars/subscribeSubscribe to a calendar
- GET/v2/colorsGet color palettes
Availability4
- GET/v2/free-busyGet free/busy for one account
- POST/v2/free-busyGet free/busy for several accounts
- POST/v2/meeting-timesFind meeting times
- GET/v2/roomsList rooms and resources
Invitations2
- GET/v2/invitationsList invitations
- GET/v2/invitations/{invitationId}Get an invitation
Accounts14
- GET/v2/accountsList accounts
- POST/v2/accountsCreate a virtual account
- DELETE/v2/accounts/{accountId}Delete an account
- GET/v2/accounts/{accountId}Get an account
- PATCH/v2/accounts/{accountId}Update an account
- GET/v2/accounts/{accountId}/settingsGet calendar settings
- PATCH/v2/accounts/{accountId}/settingsUpdate calendar settings
- GET/v2/accounts/{accountId}/statusGet the status of an account
- GET/v2/accounts/{accountId}/working-locationsList working locations
- POST/v2/accounts/importImport accounts
- GET/v2/accounts/importsList account imports
- GET/v2/accounts/imports/{importId}Get an account import
- POST/v2/accounts/imports/{importId}/retryRetry an account import
- GET/v2/accounts/statusGet the status of several accounts
Connecting accounts8
- POST/v2/connect/accountsConnect an account with a code
- POST/v2/connect/authorizeGet the consent URL (popup mode)
- POST/v2/connect/completeComplete a connection
- GET/v2/connect/goStart a connection (redirect mode)
- POST/v2/connect/infoGet connect widget details
- GET/v2/connect/oauthGet a sign-in URL
- POST/v2/connect/sessionsCreate a connect session
- GET/v2/connect/sessions/{id}Get a connect session
Webhooks and changes16
- GET/v2/webhooksList webhook endpoints
- POST/v2/webhooksCreate a webhook endpoint
- DELETE/v2/webhooks/{webhookId}Delete a webhook endpoint
- GET/v2/webhooks/{webhookId}Get a webhook endpoint
- PATCH/v2/webhooks/{webhookId}Update a webhook endpoint
- POST/v2/webhooks/{webhookId}/replayReplay failed webhook deliveries
- GET/v2/webhooks/{webhookId}/secretRetrieve the signing secret
- POST/v2/webhooks/{webhookId}/secret/rotateRotate the signing secret
- POST/v2/webhooks/{webhookId}/testSend a test delivery
- GET/v2/webhooks/deliveriesList webhook deliveries
- GET/v2/webhooks/deliveries/{deliveryId}Get a webhook delivery
- POST/v2/webhooks/deliveries/{deliveryId}/replayReplay a webhook delivery
- GET/v2/webhooks/event-typesList webhook event types
- GET/v2/webhooks/eventsList webhook events
- GET/v2/webhooks/events/{eventId}Get a webhook event
- GET/v2/webhooks/listenStream sandbox webhook events
Metadata4
- POST/v2/metadata/importImport extended properties into metadata
- GET/v2/metadata/importsList metadata imports
- DELETE/v2/metadata/imports/{importId}Cancel a metadata import
- GET/v2/metadata/imports/{importId}Get a metadata import
Sandbox5
- GET/v2/sandboxGet the sandbox
- POST/v2/sandbox/resetReset the sandbox
- POST/v2/sandbox/simulate-changeSimulate an external change
- POST/v2/sandbox/simulate-meetingSimulate a Zoom meeting event
- POST/v2/sandbox/simulate-replySimulate an invitation response
Keys, logs and usage6
- GET/v2/keysList API keys
- GET/v2/keys/{keyId}Get an API key
- POST/v2/keys/{keyId}/rotateRotate an API key
- GET/v2/logsList request logs
- GET/v2/logs/{traceId}Get a request log
- GET/v2/usageGet usage by day