> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Google Wallet ID Verification API

> Integrate Google Wallet ID identity verification with your own application. View country coverage, authentication steps, results and pricing.

Start Google Wallet ID verification from your backend using your application API key.
You do not need a workflow or a `workflow_id`.
The start response describes the next authentication action; it is not an approved identity result.

## Coverage and activation

| Property | Value |
| - | - |
| Wallet | Google Wallet ID |
| Wallet ID | `google_wallet` |
| Countries | ![](https://didit-public-assets.s3.eu-west-1.amazonaws.com/flags/us.svg)United States, ![](https://didit-public-assets.s3.eu-west-1.amazonaws.com/flags/gb.svg)United Kingdom, ![](https://didit-public-assets.s3.eu-west-1.amazonaws.com/flags/br.svg)Brazil, ![](https://didit-public-assets.s3.eu-west-1.amazonaws.com/flags/sg.svg)Singapore, ![](https://didit-public-assets.s3.eu-west-1.amazonaws.com/flags/tw.svg)Taiwan |
| Production wallet activation | ⏳ Coming soon |
| Published wallet price | \$0.20 per completed verification |

Wallet activation is separate from API deployment and your application's eligibility.
A documented endpoint does not activate a wallet that is marked Coming soon.
For current published rates, see [digital ID wallet pricing](https://docs.didit.me/getting-started/pricing.md#digital-id-wallet-pricing).

## What the person does

Your page or app asks Google Wallet itself: there is no redirect and no Didit-hosted page.
Pass `next_action.digital_credentials.request` to `navigator.credentials.get({digital: request})` in a user gesture on the `origin` you started with, or to Android Credential Manager as `GetDigitalCredentialOption`.
Then send what the wallet returns to [Submit wallet response](https://docs.didit.me/standalone-apis/digital-id-wallet-response.md).
The browser offers its own QR code when the wallet is on another device.

## Receive the result

Follow the [Digital ID wallet API guide](https://docs.didit.me/standalone-apis/digital-id-wallets.md) to track the verification and retrieve its result.
Treat only a completed, verified result as proof that the wallet authenticated the person.
Returned identity attributes vary by wallet; do not assume an address, portrait or every requested attribute is present.

## Related

* [Digital ID wallet APIs](https://docs.didit.me/standalone-apis/digital-id-wallets.md)
* [Wallet coverage and attributes](https://docs.didit.me/core-technology/id-verification/digital-id-wallets.md)
* [Pricing](https://docs.didit.me/getting-started/pricing.md#digital-id-wallet-pricing)


## OpenAPI

````yaml POST /v3/id-verification/wallets/google-wallet/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: Identity verification API. Authenticate with x-api-key header.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/id-verification/wallets/google-wallet/:
    post:
      tags:
        - Digital ID wallets
      summary: Start Google Wallet verification
      description: >-
        Start a Google Wallet sign-in (Google Wallet (ID pass) and US state
        issuers (mobile driving licence); USA, GBR, BRA, SGP, TWN) without any
        workflow. Billed once, only when the identity is verified. The response
        carries next_action.type=request_digital_credential with a request Didit
        signed for your application, usable only from origin. In a user gesture
        there, pass next_action.digital_credentials.request to
        navigator.credentials.get({digital: ...}) (or to Android Credential
        Manager as GetDigitalCredentialOption requestJson), then POST what the
        wallet returns to
        /v3/id-verification/wallets/verifications/{request_id}/response/. The
        browser offers its own QR code when the wallet is on another device.
        Sandbox applications get a deterministic simulation (simulated: true)
        that never contacts the provider.
      operationId: start_google_wallet_wallet_verification
      parameters:
        - in: header
          name: Idempotency-Key
          schema:
            type: string
          description: >-
            Optional retry-safety key (max 255 characters). Retrying with the
            same key, wallet and body returns the original verification without
            starting a second sign-in; the same key with another wallet or body
            returns 409 idempotency_key_reused.
      requestBody:
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/DigitalIdWalletApiGoogleWalletWalletVerificationStartRequest
            example:
              country: USA
              vendor_data: your-customer-reference
              metadata:
                reference: example
              origin: https://app.example.com
          application/x-www-form-urlencoded:
            schema:
              $ref: >-
                #/components/schemas/DigitalIdWalletApiGoogleWalletWalletVerificationStartRequest
          multipart/form-data:
            schema:
              $ref: >-
                #/components/schemas/DigitalIdWalletApiGoogleWalletWalletVerificationStartRequest
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/DigitalIdWalletApiWalletVerificationResponse
              example:
                request_id: 00000000-0000-4000-8000-000000000001
                wallet_verification:
                  wallet:
                    id: google_wallet
                    name: Google Wallet
                    issuing_authority: >-
                      Google Wallet (ID pass) and US state issuers (mobile
                      driving licence)
                  country: USA
                  status: Not Finished
                  outcome: pending
                  error: null
                  interaction: digital_credentials
                  simulated: false
                  expires_at: '2026-01-01T10:10:00Z'
                  next_action:
                    type: request_digital_credential
                    digital_credentials:
                      protocol: openid4vp-v1-signed
                      request:
                        requests:
                          - protocol: openid4vp-v1-signed
                            data:
                              request: <compact JWS signed by Didit>
                  identity: null
                  attributes: null
                  level_of_assurance: null
                  verified_at: null
                  signature_valid: null
                  credential_type: person_identification
                vendor_data: your-customer-reference
                metadata:
                  reference: example
                created_at: '2026-01-01T10:00:00Z'
          description: ''
        '400':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/DigitalIdWalletApiWalletVerificationStartBadRequest
          description: >-
            Field validation errors ({field: [messages]}), or error
            return_url_invalid, return_url_not_allowed, origin_invalid,
            origin_not_allowed, invalid_personal_code, invalid_phone_number or
            idempotency_key_invalid.
        '403':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden
          description: >-
            Missing or invalid credentials ({detail}), or error
            wallet_unavailable, insufficient_credits or contract_rate_missing.
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationError'
          description: >-
            error idempotency_key_reused or idempotency_key_in_progress (with
            Retry-After).
        '502':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationError'
          description: >-
            error wallet_provider_unavailable: the provider could not start;
            nothing was created.
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationError'
          description: >-
            error wallet_not_configured: this environment cannot reach the
            wallet.
      security:
        - ApiKeyAuth: []
        - BearerAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |-
            curl --request POST \
              --url https://verification.didit.me/v3/id-verification/wallets/google-wallet/ \
              --header 'x-api-key: YOUR_API_KEY' \
              --header 'Idempotency-Key: your-unique-attempt-key' \
              --header 'Content-Type: application/json' \
              --data '{
              "country": "USA",
              "vendor_data": "your-customer-reference",
              "metadata": {
                "reference": "example"
              },
              "origin": "https://app.example.com"
            }'
components:
  schemas:
    DigitalIdWalletApiGoogleWalletWalletVerificationStartRequest:
      type: object
      description: Start a Google Wallet verification (USA, GBR, BRA, SGP, TWN).
      properties:
        vendor_data:
          type: string
          nullable: true
          description: >-
            Your own reference for this verification (e.g. your user id).
            Returned in results and webhooks.
        metadata:
          type: object
          additionalProperties: {}
          nullable: true
          description: >-
            Optional JSON object stored with the verification and returned in
            results and webhooks.
        sandbox_scenario:
          type: string
          minLength: 1
          description: >-
            Sandbox applications only: the simulated outcome -
            'wallet_cancelled', 'wallet_timeout' or 'wallet_provider_error'; any
            other scenario (or none) verifies. Rejected on live applications.
            The full catalog is available at GET /v1/sandbox/scenarios/.
        country:
          allOf:
            - $ref: >-
                #/components/schemas/DigitalIdWalletApiGoogleWalletWalletVerificationStartCountryEnum
          description: |-
            ISO 3166-1 alpha-3 country of the Google Wallet identity.

            * `USA` - USA
            * `GBR` - GBR
            * `BRA` - BRA
            * `SGP` - SGP
            * `TWN` - TWN
        origin:
          type: string
          minLength: 1
          description: >-
            Where your page or app will ask the wallet: the https origin of your
            page (its host must be in the application's allowed_return_hosts, or
            be its white-label domain), e.g. https://app.example.com, or
            android:apk-key-hash:<base64 SHA-256 of your app's signing
            certificate, no padding>. The wallet refuses the request anywhere
            else.
          maxLength: 256
      required:
        - country
        - origin
    DigitalIdWalletApiWalletVerificationResponse:
      type: object
      description: One standalone wallet verification, as every wallet endpoint answers it.
      properties:
        request_id:
          type: string
          format: uuid
        wallet_verification:
          $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationResult'
        vendor_data:
          type: string
          nullable: true
        metadata:
          type: object
          additionalProperties: {}
          nullable: true
          description: The metadata object sent at start, or null.
        created_at:
          type: string
          format: date-time
      required:
        - created_at
        - metadata
        - request_id
        - vendor_data
        - wallet_verification
    DigitalIdWalletApiWalletVerificationStartBadRequest:
      oneOf:
        - $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationError'
        - $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationFieldErrors'
    DigitalIdWalletApiWalletVerificationStartForbidden:
      oneOf:
        - $ref: >-
            #/components/schemas/DigitalIdWalletApiClientCredentialsForbiddenErrorMessage
        - $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationError'
    DigitalIdWalletApiWalletVerificationError:
      type: object
      properties:
        error:
          type: string
          description: Stable machine-readable code, e.g. wallet_unavailable.
        detail:
          type: string
      required:
        - detail
        - error
    DigitalIdWalletApiGoogleWalletWalletVerificationStartCountryEnum:
      enum:
        - USA
        - GBR
        - BRA
        - SGP
        - TWN
      type: string
      description: |-
        * `USA` - USA
        * `GBR` - GBR
        * `BRA` - BRA
        * `SGP` - SGP
        * `TWN` - TWN
    DigitalIdWalletApiWalletVerificationResult:
      type: object
      properties:
        wallet:
          allOf:
            - $ref: '#/components/schemas/DigitalIdWalletApiWallet'
          readOnly: true
        country:
          type: string
        status:
          type: string
          description: Not Finished while pending, then Approved (verified) or Declined.
        outcome:
          $ref: >-
            #/components/schemas/DigitalIdWalletApiWalletVerificationResultOutcomeEnum
        error:
          type: string
          nullable: true
          readOnly: true
        interaction:
          allOf:
            - $ref: '#/components/schemas/DigitalIdWalletApiInteractionEnum'
          readOnly: true
        simulated:
          type: boolean
          readOnly: true
        expires_at:
          type: string
          format: date-time
        next_action:
          allOf:
            - $ref: '#/components/schemas/DigitalIdWalletApiWalletNextAction'
          nullable: true
          readOnly: true
        identity:
          allOf:
            - $ref: '#/components/schemas/DigitalIdWalletApiWalletIdentity'
          nullable: true
          readOnly: true
        attributes:
          type: object
          additionalProperties: {}
          nullable: true
          readOnly: true
        level_of_assurance:
          type: string
          nullable: true
        verified_at:
          type: string
          format: date-time
          nullable: true
        signature_valid:
          type: boolean
          nullable: true
          description: >-
            True once the credential's signature was verified; null for a
            simulated one.
        credential_type:
          type: string
          nullable: true
      required:
        - attributes
        - country
        - credential_type
        - error
        - expires_at
        - identity
        - interaction
        - level_of_assurance
        - next_action
        - outcome
        - signature_valid
        - simulated
        - status
        - verified_at
        - wallet
    DigitalIdWalletApiWalletVerificationFieldErrors:
      type: object
      description: 'Request validation errors: each rejected field with its messages.'
      additionalProperties:
        type: array
        items:
          type: string
    DigitalIdWalletApiClientCredentialsForbiddenErrorMessage:
      type: object
      properties:
        detail:
          type: string
          default: Forbidden - User doesn't have permission
    DigitalIdWalletApiWallet:
      type: object
      properties:
        id:
          type: string
          description: Catalog id of the wallet, e.g. bankid_se.
        name:
          type: string
        issuing_authority:
          type: string
          nullable: true
      required:
        - id
        - issuing_authority
        - name
    DigitalIdWalletApiWalletVerificationResultOutcomeEnum:
      enum:
        - pending
        - verified
        - cancelled
        - timeout
        - failed
      type: string
      description: |-
        * `pending` - Pending
        * `verified` - Verified
        * `cancelled` - Cancelled by the user
        * `timeout` - Timed out
        * `failed` - Failed
    DigitalIdWalletApiInteractionEnum:
      enum:
        - redirect
        - in_app
        - digital_credentials
      type: string
      description: |-
        * `redirect` - redirect
        * `in_app` - in_app
        * `digital_credentials` - digital_credentials
    DigitalIdWalletApiWalletNextAction:
      type: object
      properties:
        type:
          allOf:
            - $ref: '#/components/schemas/DigitalIdWalletApiWalletNextActionTypeEnum'
          description: >-
            redirect: send the user's browser to url. confirm_in_app: show
            verification_code to the user, who checks it matches the code in
            their wallet app and confirms there; then poll.
            request_digital_credential: in a user gesture on the origin you
            started with, ask the wallet with digital_credentials.request, then
            send what it returns to POST
            .../verifications/{request_id}/response/.


            * `redirect` - redirect

            * `confirm_in_app` - confirm_in_app

            * `request_digital_credential` - request_digital_credential
        url:
          type: string
          format: uri
          description: 'redirect only: where the user signs in with the wallet.'
        digital_credentials:
          allOf:
            - $ref: >-
                #/components/schemas/DigitalIdWalletApiWalletDigitalCredentialsRequest
          description: 'request_digital_credential only: the request to hand to the wallet.'
        verification_code:
          type: string
          description: >-
            confirm_in_app only: the 4-digit comparison code the wallet app
            shows too.
        poll_interval_seconds:
          type: integer
          description: >-
            confirm_in_app only: how often to call POST
            .../verifications/{request_id}/poll/ for prompt feedback. Didit also
            polls pending sign-ins in the background, so the webhook reports the
            outcome even when you do not poll.
      required:
        - type
    DigitalIdWalletApiWalletIdentity:
      type: object
      properties:
        full_name:
          type: string
          nullable: true
        first_name:
          type: string
          nullable: true
        last_name:
          type: string
          nullable: true
        date_of_birth:
          type: string
          format: date
          nullable: true
        nationality:
          type: string
          nullable: true
          description: ISO3 nationality, only when the wallet asserts one (never inferred).
        issuing_state:
          type: string
          description: ISO3 country whose scheme issued the identity.
      required:
        - date_of_birth
        - first_name
        - full_name
        - issuing_state
        - last_name
        - nationality
    DigitalIdWalletApiWalletNextActionTypeEnum:
      enum:
        - redirect
        - confirm_in_app
        - request_digital_credential
      type: string
      description: |-
        * `redirect` - redirect
        * `confirm_in_app` - confirm_in_app
        * `request_digital_credential` - request_digital_credential
    DigitalIdWalletApiWalletDigitalCredentialsRequest:
      type: object
      properties:
        protocol:
          type: string
          description: openid4vp-v1-signed.
        request:
          type: object
          additionalProperties: {}
          description: >-
            Pass as is: navigator.credentials.get({digital: request}) in the
            browser, or JSON.stringify(request) as GetDigitalCredentialOption's
            requestJson on Android. Signed by Didit for your application.
      required:
        - protocol
        - request
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Your application's API key, from Developers -> API keys in the Business
        Console. The primary key has full access. A named key can be scoped:
        none, read or write per resource, limited to some workflows or to
        approved sessions, to a list of IP addresses, and to an expiry date. 401
        means the key is missing, wrong, revoked or expired; 403 means the key
        has no access to this resource or action, or the request came from an
        address outside its IP list; 404 on a session route means the session is
        outside the key's workflows or statuses. A key without media access
        receives image, video and PDF URLs as null, and a key without sessions
        write receives session links and tokens as null. See
        https://docs.didit.me/console/api-keys.
    BearerAuth:
      type: http
      scheme: bearer
      description: The application's client-credentials access token.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.