Skip to content
Skip to main content

Using granular scopes to request user data

Last updated:

As you work with Nylas, you’ll need to use scopes to control the level of access Nylas has to your users’ data.

Granular scopes represent sets of permissions you request from your users, on a per-provider basis. Each provider has its own set of scopes, and your users either approve or reject them when they authenticate with your Nylas application.

A scope reaches a grant only after clearing three layers, and each layer is configured in a different place. The provider app sets the ceiling, the connector sets what hosted auth requests by default, and an individual auth request can narrow or widen that default for one grant.

LayerWhere you set itWhat it controls
Provider appGoogle Cloud OAuth consent screen, or the Azure app registration’s API permissionsEvery scope the provider will ever approve for your app. Google verification is judged against this list, and Microsoft admin consent covers these permissions.
Connector default scopesThe connector’s Authenticate scopes in the Dashboard, or the scope array on the Connectors APIWhat hosted auth requests when the auth request doesn’t specify scopes.
Per-grant scopesThe scope parameter on GET /v3/connect/auth, or the scopes on a custom auth requestOverrides the connector defaults for that grant only.

Nylas adds the identity scopes below to every auth request, so the provider app must have them enabled even though your connector and auth requests never need to name them. Nylas adds nothing else. If the auth request omits scope and the connector has no default scopes, the grant gets identity access only. Request every mail, calendar, and contacts scope in the tables on this page at the connector or per-grant layer.

ProviderIdentity scopes Nylas always requests
Googleopenid, https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile
MicrosoftUser.Read, offline_access, openid, email

Two checks apply to any scope you request through Nylas:

  • It must be enabled on the provider app. Nylas forwards it, but the provider evaluates the request against your app’s configured permissions. A scope that isn’t enabled there fails at the provider’s consent or verification step.
  • It must be in the tables on this page. The API accepts only these scopes. Google scopes must match the full scope string exactly as listed, such as https://www.googleapis.com/auth/gmail.send, so a short name like gmail.send on its own is rejected. Microsoft scopes work as the short name (Mail.Read) or the prefixed form (https://graph.microsoft.com/Mail.Read).

A scope outside the supported list is never forwarded to the provider. Creating a connector, creating a grant, or starting hosted auth for a single provider with an unsupported scope returns 400 with the error code common.scope_not_allowed. The multi-provider hosted flow, where the user picks a provider on the login page, drops unsupported scopes silently instead.

Each of the Nylas APIs requires different scopes to function properly. The tables in the following sections list the scopes you need to work with specific Nylas features.

All scopes must include the fully-qualified URI path for the provider. The tables shorten the full scope URIs for space reasons, so be sure to add the provider prefix when requesting scopes.

All scopes except https://mail.google.com/ must be prefixed with Google’s URI path (https://www.googleapis.com/auth/).

EndpointRequired scopesOther scopes
GET /v3/grants/<NYLAS_GRANT_ID>/messages
GET /v3/grants/<NYLAS_GRANT_ID>/messages/<MESSAGE_ID>
/gmail.readonly/gmail.modify
PUT /v3/grants/<NYLAS_GRANT_ID>/messages/<MESSAGE_ID>/gmail.modify—
DELETE /v3/grants/<NYLAS_GRANT_ID>/messages/<MESSAGE_ID>/gmail.modifyhttps://mail.google.com/ (hard-delete)
POST /v3/grants/<NYLAS_GRANT_ID>/messages/smart-compose
POST /v3/grants/<NYLAS_GRANT_ID>/messages/<MESSAGE_ID>/smart-compose
/gmail.readonly/gmail.modify
PUT /v3/grants/<NYLAS_GRANT_ID>/messages/clean/gmail.readonly—
POST /v3/grants/<NYLAS_GRANT_ID>/messages/send/gmail.send/gmail.compose
/gmail.modify

All scopes must be prefixed with Google’s URI path (https://www.googleapis.com/auth/).

EndpointRequired scopesOther scopes
GET /v3/grants/<NYLAS_GRANT_ID>/drafts
GET /v3/grants/<NYLAS_GRANT_ID>/drafts/<DRAFT_ID>
/gmail.readonly/gmail.compose
POST /v3/grants/<NYLAS_GRANT_ID>/drafts
PUT /v3/grants/<NYLAS_GRANT_ID>/drafts/<DRAFT_ID>
DELETE /v3/grants/<NYLAS_GRANT_ID>/drafts/<DRAFT_ID>
/gmail.compose—
POST /v3/grants/<NYLAS_GRANT_ID>/drafts/<DRAFT_ID>/gmail.compose/gmail.modify

All scopes must be prefixed with Google’s URI path (https://www.googleapis.com/auth/).

EndpointRequired scopesOther scopes
GET /v3/grants/<NYLAS_GRANT_ID>/folders
GET /v3/grants/<NYLAS_GRANT_ID>/folders/<FOLDER_ID>
POST /v3/grants/<NYLAS_GRANT_ID>/folders
PUT /v3/grants/NYLAS_GRANT_ID>/folders/<FOLDER_ID>
DELETE /v3/grants/<NYLAS_GRANT_ID>/folders/<FOLDER_ID>
/gmail.labels/gmail.modify

All scopes must be prefixed with Google’s URI path (https://www.googleapis.com/auth/).

EndpointRequired scopesOther scopes
GET /v3/grants/<NYLAS_GRANT_ID>/attachments/<ATTACHMENT_ID>/gmail.readonly/gmail.modify

All scopes must be prefixed with Google’s URI path (https://www.googleapis.com/auth/).

EndpointRequired scopesOther scopes
GET /v3/grants/<NYLAS_GRANT_ID>/contacts
GET /v3/grants/<NYLAS_GRANT_ID>/contacts/<CONTACT_ID>
GET /v3/grants/<NYLAS_GRANT_ID>/contacts/groups
/contacts.readonly
/contacts.other.readonly
/directory.readonly
—
POST /v3/grants/<NYLAS_GRANT_ID>/contacts
PUT /v3/grants/<NYLAS_GRANT_ID>/contacts/<CONTACT_ID>
DELETE /v3/grants/<NYLAS_GRANT_ID>/contacts/<CONTACT_ID>
/contacts—

All scopes must be prefixed with Google’s URI path (https://www.googleapis.com/auth/).

EndpointRequired scopesOther scopes
GET /v3/grants/<NYLAS_GRANT_ID>/calendars
GET /v3/grants/<NYLAS_GRANT_ID>/calendars/<CALENDAR_ID>
POST /v3/grants/<NYLAS_GRANT_ID>/calendars/free-busy
/calendar.readonly/calendar
POST /v3/grants/<NYLAS_GRANT_ID>/calendars
PUT /v3/grants/<NYLAS_GRANT_ID>/calendars/<CALENDAR_ID>
DELETE /v3/grants/<NYLAS_GRANT_ID>/calendars/<CALENDAR_ID>
/calendar—
POST /v3/calendars/availability/calendar.readonly/calendar

All scopes must be prefixed with Google’s URI path (https://www.googleapis.com/auth/).

EndpointRequired scopesOther scopes
GET /v3/grants/<NYLAS_GRANT_ID>/events
GET /v3/grants/<NYLAS_GRANT_ID>/events/<EVENT_ID>
/calendar.events.readonly/calendar.events
/calendar
/calendar.readonly
POST /v3/grants/<NYLAS_GRANT_ID>/events
PUT /v3/grants/<NYLAS_GRANT_ID>/events/<EVENT_ID>
DELETE /v3/grants/<NYLAS_GRANT_ID>/events/<EVENT_ID>
POST /v3/grants/<NYLAS_GRANT_ID>/events/<EVENT_ID>/send-rsvp
/calendar.events/calendar
GET /v3/grants/<NYLAS_GRANT_ID>/resources/admin.directory.resource.
calendar.readonly
—

All scopes must be prefixed with Google’s URI path (https://www.googleapis.com/auth/).

EndpointRequired scopesOther scopes
POST /v3/grants/<NYLAS_GRANT_ID>/scheduling/configurations
PUT /v3/grants/<NYLAS_GRANT_ID>/scheduling/configurations/<CONFIG_ID>
GET /v3/grants/<NYLAS_GRANT_ID>/scheduling/availability
/calendar.readonly/calendar
POST /v3/grants/<NYLAS_GRANT_ID>/scheduling/bookings
PATCH /v3/grants/<NYLAS_GRANT_ID>/scheduling/bookings/<BOOKING_ID>
DELETE /v3/grants/<NYLAS_GRANT_ID>/scheduling/bookings/<BOOKING_ID>
/calendar.events/calendar

Each of Nylas’ notification triggers requires different scopes to function properly. The tables in the following sections list the scopes you need to work with specific Nylas features.

All scopes must include the fully-qualified URI path for the provider. The tables shorten the full scope URIs for space reasons, so be sure to add the provider prefix when requesting scopes.

All scopes must be prefixed with Google’s URI path (https://www.googleapis.com/auth/).

Notification triggerRequired scopesOther scopes
message.send_success
message.send_failed
/gmail.send—
message.created
message.updated
/gmail.metadatagmail.readonly
/gmail.modify
message.bounce_detected/gmail.readonly
/gmail.send
/gmail.modify

All scopes must be prefixed with Google’s URI path (https://www.googleapis.com/auth/).

Notification triggerRequired scopesOther scopes
thread.replied/gmail.readonly
/gmail.send
/gmail.modify

All scopes must be prefixed with Google’s URI path (https://www.googleapis.com/auth/).

Notification triggerRequired scopesOther scopes
folder.created
folder.updated
folder.deleted
/gmail.metadata/gmail.readonly
gmail.modify

All scopes must be prefixed with Google’s URI path (https://www.googleapis.com/auth/).

Notification triggerRequired scopesOther scopes
contact.updated
contact.deleted
/contact.readonly
/contacts
—

All scopes must be prefixed with Google’s URI path (https://www.googleapis.com/auth/).

Notification triggerRequired scopesOther scopes
calendar.created
calendar.updated
calendar.deleted
/calendar.events.readonly/calendar.events

All scopes must be prefixed with Google’s URI path (https://www.googleapis.com/auth/).

Notification triggerRequired scopesOther scopes
event.created
event.updated
event.deleted
/calendar.events.readonly
/calendar.readonly
/calendar.events

If your application accesses Google user data with the Google APIs and requests certain scopes, you might have to complete the Google verification process and a separate security assessment process. The processes that you need to complete depends on whether your application requests sensitive or restricted scopes.

Scope typeRequired processesGoogle policy and requirements
SensitiveGoogle verificationYour application must follow Google’s API Services User Data Policy.
RestrictedGoogle verification and security assessmentYour application must follow Google’s API Services User Data Policy and meet additional requirements for specific scopes.

For more information, see our Google verification and security assessment guide.