Add Cal.com to your app
One button connects your users' Cal.com accounts. Your app then reads their availability and books on their behalf through API v2, with only the scopes they allow. Built it? List it in the Cal.com App Store.
- See your bookings
BOOKING_READ - Create, reschedule and cancel bookings
BOOKING_WRITE - See your scheduling links
EVENT_TYPE_READ
Trusted by fast-growing companies around the world
Continue with Cal.com
The official buttons, served from app.cal.com. Check each one on a light or a dark background, copy it as HTML, React, Markdown or its URL, then put in your client ID and redirect URI.
From the button to a booking
Standard OAuth 2.0 with the authorization code flow. The button sends people to Cal.com, they choose what your app may do, and you trade the code for tokens.
- Confidential clients keep a secret on the server; public clients use PKCE (S256).
- Access tokens last 30 minutes; refresh tokens get new ones.
- Up to 10 exact redirect URIs per client, no wildcards.
- A token calls only the endpoints its scopes cover.
Send people to Cal.com
The button's link. Cal.com shows the consent screen and redirects back with a code.
1GET https://app.cal.com/auth/oauth2/authorize2 ?client_id=YOUR_CLIENT_ID3 &redirect_uri=https://your-app.com/callback4 &state=YOUR_STATE5 &scope=BOOKING_READ%20BOOKING_WRITE67# back on your side8https://your-app.com/callback?code=AUTHORIZATION_CODE&state=YOUR_STATE
Three steps to the App Store
The OAuth client connects your app to people's accounts. The App Store listing is how Cal.com users find it.
01
Create an OAuth client
In Settings → Developer → OAuth, name your app, pick at least one scope and add your redirect URIs. The client starts as pending; Cal.com reviews it and emails you when it is accepted.
02
Add the button
Put a Continue with Cal.com button where your users connect tools. It opens Cal.com's consent screen, and your callback trades the code for tokens.
03
List it in the App Store
Cal.com is open source: create your app's listing in packages/app-store with yarn create-app, then open a pull request on calcom/cal.com. The guide walks through it.
Ask only for what your app needs
People see every scope on the consent screen before they allow it, and a token can only reach the endpoints its scopes cover.
01
User
A person's own account: BOOKING_*, EVENT_TYPE_*, SCHEDULE_*, APPS_*, PROFILE_*, WEBHOOK_* and INSIGHTS_READ.
02
Team
The teams they belong to, with the TEAM_* scopes: team scheduling links, bookings, schedules and memberships.
03
Organization
Organization-wide access with the ORG_* scopes. Each one grants the matching TEAM_* scope too.
You need white-label scheduling inside your app?
Use coss.com Scheduling, made by the team of Cal.com. The infrastructure that's powering millions of bookings, under your brand and for your own users.
coss.scheduling.bookings.create()
const result = await coss.scheduling.bookings.create({ event_type: eventTypeId, start: "2026-03-10T14:00:00Z", attendee: { uid: "customer_77", name: "Sam Lee", email: "[email protected]", time_zone: "America/New_York", }, }); if (result.error?.code === "slot_unavailable") { // Someone got there first: show the times again. }
Trial lesson with Ana Reyes
30 minutes, 10 minute buffer
| Time | Mon 9 | Tue 10 | Wed 11 | Thu 12 | Fri 13 |
|---|---|---|---|---|---|
| 09:00 | busy | open | booked | open | open |
| 10:00 | open | Sam | open | busy | open |
| 11:00 | open | open | busy | open | open |
| 13:00 | booked | open | open | booked | open |
| 14:00 | open | busy | open | booked | open |
| 15:00 | open | busy | open | open | busy |
- confirmedCalendar invitations to Sam and Ana
- scheduling.
booking. confirmed
Questions about building on Cal.com
The short ones are here. For anything else, ask below.
Ask a questionA new client is pending until Cal.com reviews it. You get an email with the result, and once it is accepted the client is ready to use.
It doesn't have to. Register it as a public client and use PKCE: send a code_challenge (S256) when you authorize and the code_verifier when you trade the code. No client secret is involved.
Access tokens expire after 30 minutes. Use the refresh token to get a new one without sending the person back through the consent screen.
An API key is for your own Cal.com account. OAuth is for acting on other people's accounts, with their consent and only the scopes they allow.
Build its listing in the open-source repo with yarn create-app under packages/app-store, then open a pull request on calcom/cal.com. Questions go to GitHub Discussions.
That's coss.com Scheduling, white-label scheduling infrastructure made by the team of Cal.com.
Cal.com Atoms are in maintenance mode: existing integrations keep getting fixes and new npm versions, but there will be no new atoms. The Atoms docs stay up.
Connect your app to Cal.com
Create an OAuth client, add the button, and put your app in front of every Cal.com user.
Create an OAuth clientRead the OAuth docs