Google OAuth Verification · 2026

One scope string decides whether your review takes days or drags an annual security audit behind it

Non-sensitive, sensitive, restricted. Google assigns the tier — you do not choose it, and you cannot argue it. The difference between the middle tier and the top tier is the difference between a documentation exercise and a recurring third-party assessment you pay an outside assessor for, every year, for as long as the app lives.

What actually decides the tier: Google states the classification depends mostly on two things — the type of user data you access, and the degree of access you need (read-only, read and write, and so on). It is decided per scope string, not per API and not per app. Two scopes on the same Google API can sit in two different tiers. The console labels each scope automatically once you add it, and that label is the authority.

This is why so many teams get blindsided late. The architecture is finished, the integration works, and only at the consent-screen stage does someone notice the scope they picked is marked restricted. At that point the choice is either a scope migration through code that is already written, or an annual security assessment nobody budgeted for.

The three tiers, and what each one really costs

Non-sensitive

Read-only access to specific data. No verification is mandatory. But if you want your app name and logo on the consent screen, you still need the lighter brand verification.

Basic identity scopes — email, profile, openid — sit here, and they are also the only set exempt from the 7-day token expiry in Testing.

Sensitive

Access to private user data. Brand verification plus a scope review: permitted app type, a demo video, Limited Use compliance, and a written justification for why a narrower scope would not work.

Google’s own examples: reading Calendar events, storing a Contacts entry, deleting a YouTube video, sending mail via gmail.send.

Restricted

Highly sensitive data. Everything sensitive requires, plus a permitted-application-type demonstration, plus an annual security assessment by an independent assessor from Google’s empanelled group.

Gmail (including any IMAP, SMTP or POP3 use), Drive, all Fitness scopes, Google Chat, Data Portability, Photos Ambient, Google Health.

The gap nobody warns you about: there is no official sensitive-scope list

Google publishes a complete, maintained list of restricted scopes. It publishes nothing equivalent for sensitive scopes — only scattered examples. Worse, the Google API Services User Data Policy still links to an old help article as the authoritative definition and as the current list of sensitive and restricted scopes, and that article now redirects to a page that contains neither the anchors nor the lists. The policy document’s own definitional links are dead.

The practical consequence: the only reliable way to know your tier is to add the scope in the Cloud console and read the label it applies. Every list you find in a blog post, including a list of sensitive scopes presented as complete, is somebody’s reconstruction.

What each tier triggers

TierVerification requiredSecurity assessment
Non-sensitive onlyNone mandatory. Brand verification only if you want name and logo shown.No
SensitiveBrand verification plus sensitive scope verification — app type, demo video, Limited Use, narrowest-scope justification.No
RestrictedAll of the above plus a permitted application type demonstration.Yes — annual, CASA framework built on OWASP ASVS, tiered by data sensitivity and user volume. Google states it charges the developer nothing; the fee is agreed directly between you and the assessor.

What goes wrong while you are unverified

Three separate penalties apply, and teams routinely diagnose them as bugs rather than as policy.

  • The unverified app screen appears — and it also appears when the scopes requested in your code simply differ from the scopes configured on the consent screen. That mismatch alone is enough.
  • A cap of 100 new users applies to apps showing that screen, and Google states the cap runs over the entire lifetime of the project and cannot be reset or changed.
  • In Testing publishing status, authorisations expire seven days after consent, and any refresh token issued expires with them. The exception is narrow: apps requesting only name, email, profile or the OpenID Connect equivalents. Request any other scope and the exception stops applying.
  • If an app is rejected for sensitive or restricted scopes, user access to those unapproved scopes through OAuth stops working.
  • Request a broader scope than your feature needs and Google directs you to a narrower one before verification proceeds. If the justification is judged insufficient, the request may be rejected outright.
  • Exhausting the user cap while unverified can result in Google sign-in being disabled for the project.
  • Adding a new redirect URL, a new JavaScript origin, or changing the product name after verification sends the app back through verification.
  • Adding a restricted scope after an assessment may require the assessment to be redone to cover it.

The moving target: your tier can change without you touching anything

Google states plainly that it continuously re-evaluates the risk of user data access and may upgrade certain data types and scopes to sensitive or restricted. When that happens, apps already using those scopes become unverified. Google says a grace period is given before the unverified screen and the user cap apply — but never says how long that grace period is. An integration that shipped compliant can become non-compliant on Google’s schedule, not yours.

How to work out where you actually stand

  1. Enumerate every scope your code requests, not every scope you configuredThese drift apart constantly, and the drift itself is a documented cause of the unverified screen. The list in your OAuth client and the list in your codebase must match exactly.
  2. Add each one in the console and read the labelThis is the only authoritative classification. Do not infer a tier from the API name — sibling scopes on the same API frequently land in different tiers.
  3. Test whether an exception applies before assuming a review is inevitableGoogle documents four: personal use, development and testing, service-owned data with no user data, and internal-only use inside your own Workspace or Cloud Identity organisation. Each carries its own trade-offs, and the caps and token limits do not disappear in the first two.
  4. Attack the scope list before you attack the paperworkThe single highest-leverage move is narrowing scope until the restricted tier no longer applies. Google’s own worked example is a team using the full mail scope purely to send messages — a minimum-scope violation, resolved by migrating to gmail.send, which is sensitive rather than restricted. That one migration removes an annual assessment permanently.
  5. Only then write the justification and record the demonstrationGoogle requires an explanation of why narrower scopes would not work, with specifics on what functionality would break. Generic requests, and requests written to future-proof access you have not built yet, are what get sent back.

Where projects stall

  • The scope tier was assumed from the API name, so a restricted requirement surfaced after the architecture was locked.
  • A blog post’s sensitive-scope list was treated as complete, and the console said otherwise.
  • The team read Google’s published timeline estimates as commitments — Google attaches its own caveat that they are estimates only and vary with developer responsiveness, and two current Google pages state different figures for the same review.
  • The scopes in code and the scopes on the consent screen drifted apart during development, producing the unverified screen with no other fault present.
  • Testing status was used as a long-term staging setup, and the 7-day authorisation expiry was diagnosed for weeks as a token-refresh bug.
  • The user cap was quietly exhausted during a beta, and sign-in stopped for new users with no way to reset it.
  • A justification was written describing the product rather than the specific data the scope reads and why a narrower scope cannot deliver the feature.
  • Nobody checked whether a Workspace administrator had blocked the app — a verified status does not override an administrator’s own settings.

Places Google’s own pages disagree — know this before you follow any single checklist

  • Sensitive review timeline. The developer documentation says the sensitive scope verification process typically takes 3 to 5 business days. The Cloud help centre FAQ table says 10 business days. Both are current official pages.
  • The assessment letter has two names. One Google page calls the artefact a Letter of Validation; another calls it a Letter of Assessment. They appear to describe the same document.
  • The security assessment trigger is stated three ways. One passage says it applies if you store or transmit restricted scope data on servers; another on the same page says every app with the ability to access that data from or through a third-party server; the User Data Policy says it depends on the API and the number of user grants or users. Storage, capability and user count are not reconciled anywhere.
  • Dead cross-references. The User Data Policy and the restricted-scope page both link to an article as the current list of sensitive and restricted scopes; that article now redirects to a page containing no lists.
  • Guidance is not policy. Google’s own verification requirements help page opens by stating it is not a policy document. Only the terms and the User Data Policy are.

What Google does not publish — treat any figure you see elsewhere as invented

  • No approval or rejection rate for any tier, anywhere.
  • No cost figure for the security assessment. Google states it charges the developer nothing and that the fee is agreed between developer and assessor with no Google involvement, so any published price is somebody’s quote, not a rate.
  • No eligibility rule for the free tier 2 assessment that is referenced but never defined.
  • No thresholds for how an assessment tier is assigned — only the inputs are published, never the cut-offs.
  • No length for the grace period given when a scope is re-categorised upward.
  • No complete official list of sensitive scopes.
  • No mechanism to reset or appeal the 100-user cap.
  • No fast-track, priority or partner review path. Nothing on any Google page supports such a claim from anyone.

The part that is genuinely hard

Reading a label in a console is not the work. The work is the decision that comes after it: whether the feature can be rebuilt on a narrower scope, what that costs in engineering time against a recurring annual assessment, and how to write a justification that ties one specific scope to one specific user-visible function in language a reviewer accepts without a follow-up. Get that wrong and you are not rejected once — you are in a correspondence loop, with the user cap filling up underneath you the whole time. Scope architecture, justification drafting and review preparation are what we do for clients, and they are deliberately not what this article hands over.

Related reading: the full Google OAuth verification walkthrough, what the unverified app warning means and how to remove it, and what the CASA security assessment actually asks of Gmail API apps.

Per scope stringTier is assigned by Google, not per API
100 new usersLifetime project cap while unverified
Every 12 monthsAssessment cycle for restricted scopes