Google Indexing · Authentication Profile

Google Indexing Authentication

Authentication

Google Indexing secures its APIs with oauth2 across 1 declared security scheme, as derived from its OpenAPI definitions. OAuth 2.0 is offered via the authorizationCode and jwt-bearer (service account) flow(s).

CrawlingGoogleIndexingSearchSEOURLs
Methods: oauth2 Schemes: 1 OAuth flows: authorizationCode, jwt-bearer (service account) API key in:

Security Schemes

OAuth2 oauth2
· flows: jwt-bearer, authorizationCode

Source

Authentication Profile

Raw ↑
generated: '2026-08-13'
method: searched
source: https://developers.google.com/search/apis/indexing-api/v3/prereqs
docs: https://developers.google.com/search/apis/indexing-api/v3/prereqs
authorizing_docs: https://developers.google.com/search/apis/indexing-api/v3/authorizing
note: >-
  Upgraded from derived to searched on 2026-08-13. The OpenAPI-derived baseline captured only the
  authorizationCode flow. Google's own prerequisites page documents a different primary path — a Google
  Cloud SERVICE ACCOUNT with a JSON private key, exchanging a signed JWT assertion for an access token —
  plus a second, non-OAuth authorization gate that no securityScheme can express: the service account
  must be a delegated site owner on a verified Search Console property. Missing that gate is the single
  most common failure on this API, and it returns 403, not 401.
summary:
  types:
    - oauth2
  oauth2_flows:
    - authorizationCode
    - jwt-bearer (service account)
  api_key_supported: false
  anonymous_access: false
  scopes: 1
schemes:
  - name: OAuth2
    type: oauth2
    primary: true
    flows:
      - flow: jwt-bearer
        preferred: true
        grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer
        tokenUrl: https://oauth2.googleapis.com/token
        principal: Google Cloud service account
        credential: JSON private key downloaded at service-account creation
        scopes:
          - https://www.googleapis.com/auth/indexing
        source: https://developers.google.com/search/apis/indexing-api/v3/prereqs
        note: >-
          The documented onboarding path. Not expressible as a standard OpenAPI oauth2 flow, which is
          why the derived baseline missed it.
      - flow: authorizationCode
        authorizationUrl: https://accounts.google.com/o/oauth2/auth
        tokenUrl: https://oauth2.googleapis.com/token
        scopes:
          - https://www.googleapis.com/auth/indexing
        source: openapi/google-indexing-urlnotifications-publish-api-openapi.yml
        note: >-
          Present in the spec and usable (the OAuth 2.0 Playground exercises it), but Google's docs
          describe the service-account path.
    transport:
      header: Authorization
      scheme: Bearer
      value: Bearer <access_token>
    challenge:
      probed: '2026-08-13'
      url: https://indexing.googleapis.com/v3/urlNotifications/metadata?url=https%3A%2F%2Fexample.com
      http_status: 401
      www_authenticate: Bearer realm="https://accounts.google.com/"
      body_status: UNAUTHENTICATED
      body_reason: CREDENTIALS_MISSING
    sources:
      - openapi/google-indexing-urlnotifications-api-openapi.yml
      - openapi/google-indexing-urlnotifications-publish-api-openapi.yml
      - openapi/_original/google-indexing-discovery-v3.json
      - https://developers.google.com/search/apis/indexing-api/v3/prereqs
authorization_server:
  issuer: https://accounts.google.com
  metadata:
    oauth_authorization_server:
      url: https://accounts.google.com/.well-known/oauth-authorization-server
      status: 200
      file: well-known/google-indexing-oauth-authorization-server.json
    openid_configuration:
      url: https://accounts.google.com/.well-known/openid-configuration
      status: 200
      file: well-known/google-indexing-openid-configuration.json
  token_endpoint: https://oauth2.googleapis.com/token
  revocation_endpoint: https://oauth2.googleapis.com/revoke
  device_authorization_endpoint: https://oauth2.googleapis.com/device/code
  jwks_uri: https://www.googleapis.com/oauth2/v3/certs
  pkce: true
  note: >-
    Served by accounts.google.com. The API host indexing.googleapis.com 404s on both well-known paths.
second_gate:
  name: Search Console delegated site ownership
  type: out-of-band authorization
  required: true
  enforced_at: request time, per URL
  failure:
    http_status: 403
    message: Permission denied. Failed to verify the URL ownership.
  steps:
    - Verify the site in Google Search Console (domain or URL-prefix property).
    - Add the service account email as a delegated owner on that property.
  source: https://developers.google.com/search/apis/indexing-api/v3/prereqs
  note: >-
    A valid token with the correct scope is NOT sufficient. Authorization on this API is per-URL and is
    resolved against Search Console property ownership, which is invisible to the OAuth layer.
mtls:
  endpoint: https://indexing.mtls.googleapis.com/
  source: openapi/_original/google-indexing-discovery-v3.json
cross_links:
  scopes: scopes/google-indexing-scopes.yml
  conventions: conventions/google-indexing-conventions.yml
  errors: errors/google-indexing-error-codes.yml