Authorization Scopes
Overview
Authorization scopes define the permissions that an application requests when accessing Calendly APIs on behalf of a user. Scopes control which Calendly resources your integration can read or modify. When a user installs your app, the scopes you request determine what actions your app is permitted to perform.
Scopes follow these rules:
Read vs Write
- Read scopes allow safe retrieval of data.
- Write scopes allow creation, modification, or deletion of data.
Hierarchy
- A
:writescope implicitly includes the corresponding:readscope within the same domain.
Webhooks
- Webhook subscriptions must be scoped by the event family you want to receive. Your app must be granted the related read scopes to receive webhook event payloads.
Scope Catalog
Required Scopes Per Endpoint
Each API endpoint in the reference includes a “Required scopes” section that tells you which Auth scopes must be granted for the request to succeed. Example callout:
Required scopes: scheduled_events:read
When a request is missing required scopes, the API returns an error indicating insufficient permissions.
Choosing Scopes
When your app initiates an OAuth flow, it should request the minimum set of scopes needed for your use cases. Overly broad scopes can lead to unnecessary user friction at install time. Review your integration’s features and map them to the scopes in the catalog above.
Example: Syncing basic scheduling data into a third party system
scheduled_events:read— Required to read scheduled meetings, invitees, and their status.webhooks:write(optional) — Recommended for near real time updates. Not required if the integration relies on polling.
Troubleshooting
Missing scope error
If you receive a 403 error indicating missing scopes:
- Verify that the scopes requested during installation include all required by the endpoint you are calling.
- Confirm that the user granted all requested scopes (users can decline scopes during install).
- For existing installs, you may need to reauthorize the app to request additional scopes.
Webhooks not delivering events
- Check that
webhooks:writeis granted. - Confirm that your subscription includes the event family you want to receive.
- Ensure that the related domain read scopes are also granted.
Backward Compatibility
- Legacy OAuth apps and Personal Access Tokens issued before the introduction of scoped permissions retain full access to available endpoints by default.
- For newly created OAuth apps and new Personal Access Tokens, no API access is granted until scopes are explicitly requested and approved.
- When a legacy token is refreshed, it is automatically migrated to the scoped token format. This migration happens transparently and does not require the user to reauthorize the application.
Sample Authorization URL
Replace CLIENT_ID and REDIRECT_URI with your values:
List scopes separated by spaces. Only include the scopes your app needs.