Gmail (Google)
mail.google.com ↗Working in an hour for up to 100 test users. Reading mail in production needs restricted-scope verification plus an annual third-party security assessment (CASA). Plan for weeks and start early.
01Pick your path
02Time & effort
- DEVCreate Cloud project, consent screen, OAuth client30–60 minutesinferred
- PRODVerify domain in Search Console, publish privacy policy + homepage2–8 hourssourced[g-brand][g-branding-help]
- PRODBrand verificationwait 2–3 dayssourced[g-brand]Automated check runs in minutes. Google says 2–3 business days overall.
- PRODScope justification + demo video3–8 hourssourced[g-sensitive]
- PRODScope review (sensitive: 3–5 business days; restricted: several weeks)wait 1–6 weekssourced[g-sensitive][g-restricted]
- PRODCASA self-scan + fix findings (restricted scopes only)1–5 daysinferred[casa-t2]Run the scan per the ADA guide and remediate. Effort depends on findings.
- PRODAssessor validation → Letter of Validationwait 1–6 weeksinferred[casa-t2][nylas]A third-party assessor, not Google. Nylas reported about 2 weeks with SOC 2 already in hand.
03Steps
Get a working connection
gmail.labels is non-sensitive. gmail.send is sensitive. gmail.readonly, gmail.modify, gmail.compose, gmail.metadata and mail.google.com/ are RESTRICTED and trigger CASA. An agent can audit your code for requested scopes and propose the minimum.
Google's policy expects separate projects. Submit only the production project for verification.
↗ console.cloud.google.com/projectcreateIn Google Auth Platform: Branding (app name, support email, logo), Audience (External + Testing; add test users), Clients (Web app, redirect URIs). Add authorized domains BEFORE adding redirect, homepage or privacy URLs.
↗ console.developers.google.com/auth/brandingIn Testing mode users see an 'unverified app' screen and refresh tokens expire after 7 days (unless you only request name/email/profile). Build re-auth into the agent so it doesn't silently die every week.
Make it production-ready
Verify the top private domain in Google Search Console with a project Owner/Editor account. The homepage must be public, describe the app and link the privacy policy on the same domain. The policy must disclose Google user data handling and Limited Use.
↗ search.google.com/search-console/aboutFor each scope, explain the feature and why a narrower scope isn't enough. The video must show the full OAuth flow and how each scope is used. An agent can draft both from your code and product description.
◆ prepared by agent · Scope justification templateScope: https://www.googleapis.com/auth/gmail.readonly Feature: <Agent name> summarizes the user's unread email each morning and drafts replies the user approves. Why this scope: We must read message bodies to summarize them. gmail.metadata exposes headers only, and gmail.labels exposes no content. Data handling: Message content is processed in memory, not stored beyond <N> days, never used to train models, and never shared with third parties. This complies with the Google API Services User Data Policy, including Limited Use. Video: 0:00 sign-in + consent screen (shows app name + scope) → 0:40 summary feature using the scope → 1:30 data deletion control.
Trust & Safety follows up by email to the developer contact and support emails. Missed emails stall the review.
↗ console.developers.google.com/auth/verificationGoogle emails you when you're in scope. Tier 2: scan your app per the ADA guide, send results to an authorized assessor, receive a Letter of Validation. Existing certifications may speed this up. Repeat every 12 months.
↗ appdefensealliance.dev/casa/tier-2/tier2-overview
04Requirements, scopes & nuances
You'll need
- ▸A domain you own, verified in Google Search Console, hosting the homepage and privacy policy. sourced[g-brand][g-branding-help]
- ▸Privacy policy that discloses how Google user data is accessed, used, stored and shared, and complies with the Limited Use requirements. sourced[g-restricted]
- ▸A demo video showing the OAuth flow and scope usage (sensitive and restricted reviews). sourced[g-sensitive]
- ▸Restricted scopes accessed through your servers: annual CASA assessment by a Google-approved assessor. sourced[g-restricted]
- ▸Assessment fees may apply and vary by assessor. We could not find an authoritative current price. inferred
Gotchas
- !gmail.metadata sounds harmless but is restricted. Some third-party guides wrongly list gmail.readonly as merely sensitive. sourced[gmail-scopes]
- !Testing mode issues 7-day refresh tokens, so agents silently lose access weekly. sourced[g-oauth]
- !Adding a new restricted scope later can trigger re-verification and reassessment. Get scope choices right first. sourced[g-restricted]
- !Workspace admins can block unverified or sensitive-scope apps for their org even after you're verified, so enterprise users may need admin allow-listing. sourced[g-sensitive]
- !The privacy policy must be on the same domain as the homepage. A Notion page or Google Doc won't pass. sourced[g-restricted][g-branding-help]
| Scope / permission | Tier | Note | Evidence |
|---|---|---|---|
| openid email profile | basic | Identity only. Testing-mode refresh tokens don't expire after 7 days for these. | sourced[g-oauth] |
| gmail.labels | basic | Non-sensitive: see and edit labels. | sourced[gmail-scopes] |
| gmail.send | sensitive | Send on the user's behalf. Sensitive review, no CASA. | sourced[gmail-scopes] |
| gmail.readonly | restricted | Read messages. Restricted, needs CASA. | sourced[gmail-scopes] |
| gmail.metadata | restricted | Headers/labels only, but still restricted. | sourced[gmail-scopes] |
| gmail.modify / gmail.compose | restricted | Read+write / drafts. Restricted. | sourced[gmail-scopes] |
| https://mail.google.com/ | restricted | Full access incl. permanent delete. Google says request only if you truly need immediate deletion. | sourced[gmail-scopes] |
05If you get blocked
→ Launch on Composio's managed Gmail app, or Internal mode for your own org, while your own app is reviewed. Keep Testing mode for ≤100 design partners.
→ Usually domain or branding mismatch: unverified authorized domain, privacy policy on another domain, or a name resembling a Google product. Fix it and re-run, or request manual review.
→ Reply in the Verification Center with the feature, the exact scope, and why narrower scopes fail. Downgrade to a narrower scope if you can't justify it.
06Evidence: what was tested, sourced, and still uncertain
Sources read
- [gmail-scopes] Google — Choose Gmail API scopes official
- [g-restricted] Google — Restricted scope verification official
- [g-sensitive] Google — Sensitive scope verification official
- [g-brand] Google — Brand verification official
- [g-branding-help] Google Cloud Help — Manage OAuth app branding official
- [g-exempt] Google Cloud Help — When is verification not needed official
- [g-oauth] Google — Using OAuth 2.0 to access Google APIs official
- [casa-t2] App Defense Alliance — CASA Tier 2 process official
- [nylas] Nylas — Google OAuth verification: costs, timelines third-party
- [composio] Composio — Managed OAuth apps directory official
- [probe] Live HTTP probes run by the agent (dummy client_id, no credentials) probe
Still uncertain
- ? Google does not publish an SLA for restricted-scope review ('can take several weeks'). Our 1–6 week range is an estimate.
- ? CASA tier assignment, assessor fees and duration vary. We did not run an assessment.
- ? We did not submit an app for verification. Steps reflect current docs (console UI labels change often).