{"slug":"calendly","name":"Calendly","domain":"calendly.com","category":"Scheduling","summary":"Calendly is self-serve. You sign up for a developer account, create a Production OAuth app with an HTTPS redirect URI and the scopes you need, and any Calendly user can connect. Calendly's docs describe no app review step.","tier":"self-serve","tierReason":"Calendly's docs describe creating an OAuth app in the developer console and using it at once, with no review, verification or listing step.","quality":"researched","updatedAt":"2026-10-27","composio":{"status":"managed","note":"Composio has a managed Calendly OAuth app, so you can prototype without registering your own. Register your own Production app before launch so your app name is on the consent screen. The separate 'Calendly MCP' toolkit needs your own app.","toolkit":"calendly"},"totals":{"effort":{"min":20,"max":60,"unit":"minutes"},"wait":{"min":0,"max":0,"unit":"minutes"},"firstConnection":"Today, in about 20 to 30 minutes"},"stages":[{"id":"build","name":"Sandbox app","whoCanConnect":"You, plus any Calendly account you test with, through a Sandbox app that can use a localhost redirect URI.","userSees":"Calendly's standard consent screen showing your app name and the scopes you request.","effort":{"min":15,"max":30,"unit":"minutes"},"wait":{"min":0,"max":0,"unit":"minutes"},"unlock":"Create a second app with the Production environment and an HTTPS redirect URI.","evidence":{"kind":"docs","sources":["s1"],"confidence":"high"}},{"id":"launch","name":"Production app","whoCanConnect":"Any Calendly user on any plan, including Free. Webhooks need a paid plan on the user's account.","userSees":"Calendly's standard consent screen showing your app name and the scopes you request.","effort":{"min":10,"max":30,"unit":"minutes"},"wait":{"min":0,"max":0,"unit":"minutes"},"unlock":null,"evidence":{"kind":"docs","sources":["s1","s3"],"confidence":"medium"}}],"requirements":[{"id":"developer-account","label":"Calendly developer account","detail":"This is separate from a regular Calendly user account. You sign up at developer.calendly.com with GitHub or Google.","stage":"build","actor":"you","evidence":{"kind":"docs","sources":["s1"],"confidence":"high"}},{"id":"https-redirect","label":"HTTPS redirect URI","detail":"A Production app accepts only HTTPS redirect URIs. Sandbox apps also allow http://localhost.","stage":"launch","actor":"you","evidence":{"kind":"docs","sources":["s1"],"confidence":"high"}},{"id":"paid-plan-webhooks","label":"Paid Calendly plan for webhooks (only if you use them)","detail":"The connecting user's account needs a Standard, Teams or Enterprise plan before you can create webhook subscriptions. Regular GET and POST API calls work on any plan, including Free.","stage":"launch","actor":"you","evidence":{"kind":"docs","sources":["s3"],"confidence":"high"}}],"steps":[{"id":"sign-up","title":"Sign up for a Calendly developer account","actor":"you","stage":"build","time":{"min":2,"max":5,"unit":"minutes"},"detail":"At developer.calendly.com, click Sign Up in the top right and sign in with GitHub or Google. This account is separate from your Calendly user account.","actions":["Open developer.calendly.com","Click Sign Up","Sign in with GitHub or Google"],"agentNote":"A person has to complete the sign-in. After that, an agent can work in the console.","gotcha":"Signing in to calendly.com does not give you a developer console. The developer account is separate.","link":{"label":"Calendly developer portal","url":"https://developer.calendly.com/"},"evidence":{"kind":"docs","sources":["s1"],"confidence":"high"}},{"id":"create-sandbox-app","title":"Create a Sandbox OAuth app","actor":"agent","stage":"build","time":{"min":5,"max":10,"unit":"minutes"},"detail":"In My Apps, create an app. Set a name, Kind (Web or Native), Environment = Sandbox and your redirect URI, then select the scopes your integration needs.","actions":["Name: your app name (users see it on the consent screen)","Kind: Web for a server-side OAuth client, Native for a mobile or desktop app","Environment: Sandbox","Redirect URI: your OAuth client's callback URL (http://localhost is allowed in Sandbox)","Scopes: pick the minimum set, for example users:read scheduled_events:read event_types:read, plus webhooks:write if you use webhooks"],"agentNote":"An agent can fill the form. Stop when the credentials page appears and hand over to a person.","gotcha":"New apps get no API access to anything outside the scopes you select. A scope you request in the authorize URL that is not enabled on the app returns 'requested scope is invalid, unknown or malformed'.","link":{"label":"Calendly console: My Apps","url":"https://developer.calendly.com/console/apps"},"evidence":{"kind":"docs","sources":["s1","s2","s6"],"confidence":"high"}},{"id":"copy-credentials","title":"Save the client ID, client secret and signing key","actor":"you","stage":"build","time":{"min":2,"max":5,"unit":"minutes"},"detail":"Calendly shows the Client ID, Client Secret and Webhook signing key once. Store them in your secret manager or enter them into your OAuth client's settings yourself.","actions":["Copy Client ID","Copy Client Secret into secure storage","Copy Webhook signing key into secure storage"],"agentNote":"An agent can copy the Client ID. A person must handle the client secret and the signing key.","gotcha":"The secret and signing key are not shown again, even when you edit the app. If you lose them, you have to create a new app.","evidence":{"kind":"docs","sources":["s1"],"confidence":"high"}},{"id":"configure-client","title":"Configure your OAuth client with Calendly endpoints","actor":"agent","stage":"build","time":{"min":5,"max":10,"unit":"minutes"},"detail":"Authorize at https://auth.calendly.com/oauth/authorize and exchange the code at https://auth.calendly.com/oauth/token. Pass scopes space-separated and use PKCE with S256. Calendly recommends PKCE for all apps but does not enforce it for Web apps.","actions":["Authorization URL: https://auth.calendly.com/oauth/authorize","Token URL: https://auth.calendly.com/oauth/token","Scopes: space-separated, exactly matching the scopes enabled on the app","Enable PKCE (S256)"],"agentNote":"An agent can set the non-secret fields. A person enters the client secret.","gotcha":"If your OAuth client sends PKCE parameters inconsistently, Calendly returns 'missing required parameter code_verifier'.","link":{"label":"Creating an OAuth app","url":"https://developer.calendly.com/creating-an-oauth-app"},"evidence":{"kind":"docs","sources":["s1","s7"],"confidence":"medium"}},{"id":"test-connection","title":"Connect your own Calendly account","actor":"agent","stage":"build","time":{"min":3,"max":10,"unit":"minutes"},"detail":"Run the authorize flow, approve the consent screen, and call GET https://api.calendly.com/users/me to confirm the token works.","agentNote":"An agent can run the test once a person has signed in to Calendly.","evidence":{"kind":"docs","sources":["s1"],"confidence":"medium"}},{"id":"create-production-app","title":"Create a Production app with an HTTPS redirect","actor":"agent","stage":"launch","time":{"min":5,"max":15,"unit":"minutes"},"detail":"Create a second app with Environment = Production, your HTTPS redirect URI and the same scopes. Then save its new credentials and switch your OAuth client to them.","actions":["Environment: Production","Redirect URI: your HTTPS callback URL","Scopes: same as the Sandbox app","A person saves the new client secret and signing key"],"agentNote":"An agent fills the form. A person handles the new secret.","gotcha":"A Production app rejects HTTP redirect URIs, including localhost.","link":{"label":"Calendly console: My Apps","url":"https://developer.calendly.com/console/apps"},"evidence":{"kind":"docs","sources":["s1"],"confidence":"high"}}],"scopes":{"intro":"New OAuth apps get no API access until you select scopes. Calendly lists 23 scopes, and each :write scope includes the matching :read. The docs mention no scope that needs extra approval from Calendly. Apps created before scopes were introduced keep full access.","tiers":[{"scope":"users:read, scheduled_events:read, event_types:read","grants":"Read the user's profile, booked meetings and event types","level":"basic","consequence":"Nothing beyond user consent"},{"scope":"webhooks:write","grants":"Create webhook subscriptions","level":"basic","consequence":"No review, but it only works if the user has a Standard, Teams or Enterprise plan"},{"scope":"organizations:write, data_compliance:write, activity_log:read","grants":"Org admin, data deletion and audit log access","level":"basic","consequence":"No review is documented. Some of these endpoints are Enterprise-only or need an org admin"}]},"blockers":[{"symptom":"'An error has occurred: the requested scope is invalid, unknown or malformed'","cause":"The authorize URL asks for scope names that are not enabled on the app, or that are formatted wrongly (commas, dot-style names, stray characters).","fix":"Use exactly the scope names enabled on the app, separated by spaces.","evidence":{"kind":"community","sources":["s6"],"confidence":"medium"}},{"symptom":"Webhook subscription creation fails for some users","cause":"Webhooks need the user to be on a Standard, Teams or Enterprise plan.","fix":"Check the user's plan, or fall back to polling the API for users on Free.","evidence":{"kind":"docs","sources":["s3"],"confidence":"high"}},{"symptom":"Connected users suddenly get 401 errors","cause":"Calendly revokes tokens when the user changes their login email, password or login method.","fix":"Handle 401 errors by asking the user to reconnect.","evidence":{"kind":"docs","sources":["s3"],"confidence":"medium"}}],"unknowns":[{"question":"Does anyone at Calendly approve the scopes on a new app, or do they only need user consent?","why":"The scopes page says access needs scopes 'requested and approved' but does not name the approver. No source describes a Calendly review.","resolve":"Create a Production app with your scopes and check that a different Calendly account can connect right away."},{"question":"Are there connection caps, or other differences between Sandbox and Production apps besides redirect URI rules?","why":"The docs only describe the redirect URI difference.","resolve":"Check the developer console or ask in the Calendly community's API & Webhook Help forum."}],"handoff":{"agentCan":["Fill the app creation form in the developer console","Copy the Client ID and redirect URI","Set the authorize and token URLs, scopes and PKCE in your OAuth client","Run a test connection once a person has signed in"],"youMust":["Sign up for the developer account with GitHub or Google","Save the client secret and webhook signing key, and enter them into your OAuth client","Confirm users have a paid plan if you rely on webhooks"]},"sources":[{"id":"s1","title":"Creating an OAuth app","url":"https://developer.calendly.com/creating-an-oauth-app","publisher":"Calendly developer docs","kind":"official","checkedAt":"2026-10-27"},{"id":"s2","title":"Authorization Scopes","url":"https://developer.calendly.com/docs/authentication/scopes","publisher":"Calendly developer docs","kind":"official","checkedAt":"2026-10-27"},{"id":"s3","title":"Frequently asked questions","url":"https://developer.calendly.com/frequently-asked-questions","publisher":"Calendly developer docs","kind":"official","checkedAt":"2026-10-27"},{"id":"s4","title":"How to register your own Calendly API OAuth app","url":"https://nango.dev/docs/api-integrations/calendly/how-to-register-your-own-calendly-api-oauth-app.md","publisher":"Nango docs","kind":"community","checkedAt":"2026-10-27"},{"id":"s5","title":"Managed auth toolkits","url":"https://docs.composio.dev/toolkits/managed-auth.md","publisher":"Composio docs","kind":"composio","checkedAt":"2026-10-27"},{"id":"s6","title":"The requested scope is invalid unknown or malformed","url":"https://community.calendly.com/api-webhook-help-61/an-error-has-occurred-the-requested-scope-is-invalid-unknown-or-malformed-3657","publisher":"Calendly Community","kind":"search","checkedAt":null},{"id":"s7","title":"Missing required parameter code verifier","url":"https://community.calendly.com/api-webhook-help-61/missing-required-parameter-code-verifier-4746","publisher":"Calendly Community","kind":"search","checkedAt":null},{"id":"s8","title":"Rate Limits","url":"https://developer.calendly.com/api-docs/overview/rate-limits","publisher":"Calendly developer docs","kind":"search","checkedAt":null}],"feedback":{}}