Ship calendar features.
Skip the OAuth review.
Your users connect Google Calendar, Outlook and Zoom through Pyas Auth, which Google, Microsoft and Zoom have already verified. Then one API reads and writes their events, adds meeting links, finds free time and tells you what changed.


{
"provider": "microsoft",
"title": "Design review",
"startsAt": "2026-11-03T19:30:00Z",
"startsAtLocal": "2026-11-03T14:30:00-05:00",
"timezone": "America/New_York",
"conferencing": { "provider": "teams" }
}Google Calendar
Outlook and Microsoft 365
Zoom
Google Meet
Microsoft Teams
The OAuth review is the slow part. We already passed it.
Calendar scopes are sensitive, so Google reviews every app that reads them, and developers report waits of five weeks to four months. On Microsoft 365, the default policy now lets only an administrator approve calendar access for any app, so work accounts need an admin's approval on top.
With Pyas Auth, your users approve Pyas on Google's, Microsoft's and Zoom's own consent screens, on every plan. When you want your name there instead, switch that provider to Native Auth.

One shape for every provider
An Outlook event and a Google event come back the same way, with UTC and local times and an IANA time zone. You write each feature once.
Create an event with a meeting link
Ask for Meet, Teams or Zoom on any event. On an Outlook.com account, where Teams links can't be made, you get an error that says so instead of an event without one.
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: 'meet' },
})Find a time that works for everyone
Across Google and Outlook calendars at once, inside working hours, lined up with the time zone you choose.
const slots = await pyas.meetingTimes.find({
accountIds: [maya, sam],
from: '2026-11-02T00:00:00Z',
to: '2026-11-07T00:00:00Z',
durationMinutes: 30,
timezone: 'America/New_York',
})Hear about every change
Signed webhooks that name the exact event or calendar that changed, with a recurring series reported once. The event ID stays the same on every retry, so you process each change once.
const raw = express.raw({ type: 'application/json' })
app.post('/pyas/webhooks', raw, async (req, res) => {
const signature = req.header('Pyas-Signature')
const event = await pyas.webhooks.constructEvent(req.body, signature, secret)
// event.type: 'event.updated', event.data.object: the event's ID and calendar
res.sendStatus(200)
})See what your users' calendars are doing
The dashboard is built for the day after launch: who can't sync, which webhook failed, and what a request did.

Your agent can book the meeting
The Pyas MCP server gives Claude, Cursor, VS Code or your own agent the calendar: events, free time, meeting links and account health. Each tool says whether it reads or changes data, so the agent can ask you first.
- find_meeting_times
- create_event
- respond_to_event
- accounts_needing_attention
- explain_error
$ claude mcp add pyas --env PYAS_API_KEY=pyas_sk_test_... -- npx -y @pyas/mcp › Find 30 minutes with Sam Patel next week and send Avery an invite with a Meet link. pyas find_meeting_times 2 people, 30 min, working hours pyas create_event on Avery's Google calendar Tuesday at 15:00 in London, 10:00 in New York, is free for both. The invite is sent, with a Google Meet link.

Build against calendars that aren't real
Every app has a sandbox: sample people on Pyas calendars, each with a week of everyday events, plus simulated Google, Outlook and Zoom accounts that answer the way those providers do. Test keys reach only the sandbox.
How the sandbox works →Priced by connected account
Verified sign-in, every provider, webhooks and the sandbox come with every plan. You pay as more of your users connect.