> ## 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 등 디지털 자격 증명 월렛이 반환한 자격 증명 응답을 페이지나 앱에서 Didit으로 보내 인증 결과를 판단받으세요.

지갑이 시작 응답에 `next_action.type = request_digital_credential`을 포함하는 경우(예: Google Wallet) 이 작업을 사용하세요.
백엔드에서 인증을 시작할 때 사용한 애플리케이션 API 키로 인증하세요.

지갑이 반환한 내용을 그대로 보내세요. 브라우저에서는 `navigator.credentials.get`이 반환한 `{protocol, data}`를, Android Credential Manager에서는 파싱된 `credentialJson`을 보냅니다.
응답은 Didit으로 암호화되므로 변경하지 마세요.
Didit은 발급자 서명을 신뢰할 수 있는 발급자 루트와 대조하여 확인하고, 반환된 각 값을 서명된 다이제스트와 대조하며, `origin`과 이 요청에 대한 기기 서명을 확인한 뒤 인증 결과를 결정합니다.

지갑 응답은 한 번만 제출할 수 있습니다. 두 번째로 제출하면 이미 결정된 인증 결과가 반환됩니다.
지갑 응답을 사용하지 않는 인증은 `409`와 함께 `error: "not_a_digital_credentials_wallet"`을 반환합니다.

브라우저 및 Android 코드 예제를 포함한 전체 순서는 [디지털 ID 지갑 API](https://docs.didit.me/ko/standalone-apis/digital-id-wallets.md#digital-credentials-지갑-google-wallet)를 참조하세요.


## OpenAPI

````yaml ko/openapi-25.json POST /v3/id-verification/wallets/verifications/{request_id}/response/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: 신분증 인증 API입니다. x-api-key 헤더로 인증합니다.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/id-verification/wallets/verifications/{request_id}/response/:
    post:
      tags:
        - Digital ID wallets
      summary: 지갑 응답 제출
      description: >-
        Digital Credentials API 지갑(Google Wallet): next_action이
        request_digital_credential인 인증에 대해 지갑이 페이지 또는 앱으로 반환한 값을 전송합니다. Didit은
        이를 복호화하고, 신뢰할 수 있는 발급자 루트와 발급자의 서명을 대조 확인하며, 반환된 모든 값을 서명된 다이제스트와 대조
        확인하고, 원본(origin) 및 이 요청에 대한 기기 서명을 확인한 다음 인증을 결정합니다: verified(1회 결제됨) 또는
        오류 코드와 함께 declined. 일회용: 두 번째 제출 시에는 결정된 인증 결과를 반환합니다.
      operationId: submit_wallet_verification_response
      parameters:
        - in: path
          name: request_id
          schema:
            type: string
            format: uuid
          description: start endpoint가 반환한 request_id입니다.
          required: true
      requestBody:
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/DigitalIdWalletApiWalletDigitalCredentialResponseRequest
            example:
              response:
                protocol: openid4vp-v1-signed
                data:
                  response: <compact JWE returned by the wallet>
          application/x-www-form-urlencoded:
            schema:
              $ref: >-
                #/components/schemas/DigitalIdWalletApiWalletDigitalCredentialResponseRequest
            example:
              response:
                protocol: openid4vp-v1-signed
                data:
                  response: <compact JWE returned by the wallet>
          multipart/form-data:
            schema:
              $ref: >-
                #/components/schemas/DigitalIdWalletApiWalletDigitalCredentialResponseRequest
            example:
              response:
                protocol: openid4vp-v1-signed
                data:
                  response: <compact JWE returned by the wallet>
        required: true
      responses:
        '200':
          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: Approved
                  outcome: verified
                  error: null
                  interaction: digital_credentials
                  simulated: false
                  expires_at: '2026-01-01T10:10:00Z'
                  next_action: null
                  identity:
                    full_name: Alex Example
                    first_name: Alex
                    last_name: Example
                    date_of_birth: '1990-01-31'
                    nationality: USA
                    issuing_state: USA
                  attributes:
                    document_number: X0000000
                    document_expiry_date: '2030-01-31'
                  level_of_assurance: substantial
                  verified_at: '2026-01-01T10:01:00Z'
                  signature_valid: true
                  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: [messages]})입니다.'
        '403':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/DigitalIdWalletApiClientCredentialsForbiddenErrorMessage
          description: '자격 증명(x-api-key 또는 Authorization: Bearer)이 누락되었습니다.'
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationError'
          description: '오류 not_found: 이 애플리케이션의 어떤 지갑 인증에도 이 request_id가 없습니다.'
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationError'
          description: '오류 not_a_digital_credentials_wallet: 이 인증에서는 지갑 응답을 받지 않습니다.'
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationError'
          description: '오류 wallet_not_configured: 이 환경에서 지갑을 검증할 수 없습니다.'
      security:
        - ApiKeyAuth: []
        - BearerAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |-
            curl --request POST \
              --url https://verification.didit.me/v3/id-verification/wallets/verifications/REQUEST_ID/response/ \
              --header 'x-api-key: YOUR_API_KEY' \
              --header 'Content-Type: application/json' \
              --data '{
              "response": {
                "protocol": "openid4vp-v1-signed",
                "data": {
                  "response": "<compact JWE returned by the wallet>"
                }
              }
            }'
components:
  schemas:
    DigitalIdWalletApiWalletDigitalCredentialResponseRequest:
      type: object
      description: '``request_digital_credential`` 인증에 대해 지갑이 페이지 또는 앱에 반환한 응답 내용입니다.'
      properties:
        response:
          type: object
          additionalProperties: {}
          description: >-
            지갑이 반환한 정확한 내용: navigator.credentials.get의 DigitalCredential
            {protocol, data} 또는 Android의 DigitalCredential을 파싱한
            credentialJson입니다. Didit으로 암호화되어 있으므로 변경하지 마십시오.
      required:
        - response
    DigitalIdWalletApiWalletVerificationResponse:
      type: object
      description: 모든 지갑 endpoint가 응답하는 단일 독립형 지갑 검증입니다.
      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: 시작 시 전송된 메타데이터 객체 또는 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'
    DigitalIdWalletApiClientCredentialsForbiddenErrorMessage:
      type: object
      properties:
        detail:
          type: string
          default: Forbidden - User doesn't have permission
    DigitalIdWalletApiWalletVerificationError:
      type: object
      properties:
        error:
          type: string
          description: '기계 판독 가능한 고정 코드입니다(예: wallet_unavailable).'
        detail:
          type: string
      required:
        - detail
        - error
    DigitalIdWalletApiWalletVerificationResult:
      type: object
      properties:
        wallet:
          allOf:
            - $ref: '#/components/schemas/DigitalIdWalletApiWallet'
          readOnly: true
        country:
          type: string
        status:
          type: string
          description: 보류 중인 동안에는 완료되지 않음, 이후 승인됨(인증됨) 또는 거부됨.
        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이고, 시뮬레이션된 자격 증명의 경우 null입니다.
        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: '요청 유효성 검사 오류: 거부된 각 필드 및 해당 메시지입니다.'
      additionalProperties:
        type: array
        items:
          type: string
    DigitalIdWalletApiWallet:
      type: object
      properties:
        id:
          type: string
          description: '지갑의 카탈로그 id(예: 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` - 대기 중
        * `verified` - 확인됨
        * `cancelled` - 사용자에 의해 취소됨
        * `timeout` - 시간 초과
        * `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: 사용자의 브라우저를 url로 이동시킵니다. confirm_in_app: 사용자에게
            verification_code를 표시하고 사용자가 지갑 앱의 코드와 일치하는지 확인한 후 승인하면 폴링합니다.
            request_digital_credential: 시작했던 origin에서 사용자 제스처를 통해
            digital_credentials.request로 지갑에 요청한 후 반환된 값을 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 전용: 사용자가 지갑으로 로그인하는 위치입니다.'
        digital_credentials:
          allOf:
            - $ref: >-
                #/components/schemas/DigitalIdWalletApiWalletDigitalCredentialsRequest
          description: 'request_digital_credential 전용: 지갑에 전달할 요청입니다.'
        verification_code:
          type: string
          description: 'confirm_in_app 전용: 지갑 앱에도 표시되는 4자리 비교 코드입니다.'
        poll_interval_seconds:
          type: integer
          description: >-
            confirm_in_app 전용: 즉각적인 피드백을 위해 POST
            .../verifications/{request_id}/poll/을 호출하는 주기입니다. Didit은 백그라운드에서도 대기
            중인 로그인을 폴링하므로 사용자가 폴링하지 않더라도 webhook이 결과를 보고합니다.
      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 국적입니다(절대 유추되지 않음).
        issuing_state:
          type: string
          description: 신원을 발급한 체계의 ISO3 국가입니다.
      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: >-
            그대로 전달하세요. 브라우저에서는 navigator.credentials.get({digital: request}),
            Android에서는 GetDigitalCredentialOption의 requestJson으로
            JSON.stringify(request)를 사용합니다. 귀하의 애플리케이션을 위해 Didit이 서명했습니다.
      required:
        - protocol
        - request
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Business Console의 Developers -> API keys에서 발급받은 귀하 애플리케이션의 API 키입니다. 기본
        키는 전체 접근 권한을 갖습니다. 이름이 지정된 키는 리소스별 none, read, write 범위로 권한을 제한할 수 있으며
        특정 워크플로나 승인된 세션, IP 주소 목록, 만료일 등으로 제한할 수도 있습니다. 401은 키가 잘못되었거나 폐기되었거나
        만료되었음을 의미합니다. 403은 키가 전송되지 않았거나, 키에 해당 리소스나 작업에 대한 접근 권한이 없거나, 요청이 허용된
        IP 목록 외부 주소에서 발생했음을 의미합니다. 세션 경로에서의 404는 해당 세션이 키의 허용 워크플로 또는 상태 범위를
        벗어났음을 의미합니다. 미디어 접근 권한이 없는 키는 이미지, 비디오, PDF URL을 null로 수신하며, 세션 write
        권한이 없는 키는 세션 링크와 token을 null로 수신합니다.
        https://docs.didit.me/console/api-keys 를 참고하십시오.
    BearerAuth:
      type: http
      scheme: bearer
      description: 애플리케이션의 클라이언트 자격 증명 액세스 token입니다.

````

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