> ## 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.

# UAE PASS 인증 API

> Didit의 UAE PASS 신원 인증 API를 자체 애플리케이션에 연동하세요. 국가 지원 범위, 인증 단계, 결과, 요금을 확인할 수 있습니다.

백엔드에서 애플리케이션 API 키를 사용하여 UAE PASS 인증을 시작합니다.
워크플로나 `workflow_id`는 필요하지 않습니다.
시작 응답은 다음 인증 작업을 설명하며, 승인된 신원 결과가 아닙니다.

## 적용 범위 및 활성화

| 속성 | 값 |
| - | - |
| 지갑 | UAE PASS |
| 지갑 ID | `uae_pass` |
| 국가 | ![](https://didit-public-assets.s3.eu-west-1.amazonaws.com/flags/ae.svg)아랍에미리트 |
| 프로덕션 지갑 활성화 | ⏳ 출시 예정 |
| 게시된 지갑 가격 | 출시 예정 |

지갑 활성화는 API 배포 및 애플리케이션의 자격과 별개입니다.
문서화된 endpoint가 있더라도 출시 예정으로 표시된 지갑은 활성화되지 않습니다.
현재 게시된 요금은 [디지털 ID 지갑 요금](https://docs.didit.me/ko/getting-started/pricing.md#디지털-id-지갑-요금)에서 확인합니다.

## 사용자가 하는 작업

시작 요청이 반환한 다음 작업을 따릅니다.
브라우저, 다른 기기 또는 앱을 사용할지는 지갑의 인증 방식에 따라 달라집니다.

## 결과 수신

[디지털 ID 지갑 API 가이드](https://docs.didit.me/ko/standalone-apis/digital-id-wallets.md)를 따라 인증을 추적하고 결과를 조회합니다.
완료되고 검증된 결과만 지갑이 사용자를 인증했다는 증거로 간주합니다.
반환되는 신원 속성은 지갑에 따라 다릅니다. 주소, 얼굴 사진 또는 요청한 모든 속성이 포함되어 있다고 가정하지 마십시오.

## 관련 항목

* [디지털 ID 지갑 API](https://docs.didit.me/ko/standalone-apis/digital-id-wallets.md)
* [지갑 적용 범위 및 속성](https://docs.didit.me/ko/core-technology/id-verification/digital-id-wallets.md)
* [요금](https://docs.didit.me/ko/getting-started/pricing.md#디지털-id-지갑-요금)


## OpenAPI

````yaml ko/openapi-25.json POST /v3/id-verification/wallets/uae-pass/
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/uae-pass/:
    post:
      tags:
        - Digital ID wallets
      summary: UAE PASS 인증 시작
      description: >-
        워크플로 없이 UAE PASS 로그인(UAE Digital Government Authority; ARE)을 시작합니다. 신원이
        확인된 경우에만 1회 청구됩니다. 응답에는 사용자의 브라우저를 이동시킬 URL이 포함된
        next_action.type=redirect가 전달되며, 사용자는 request_id 및 result가 추가된
        return_url로 돌아옵니다. 결과는 URL이 아닌 GET
        /v3/id-verification/wallets/verifications/{request_id}/ 또는 webhook을 통해
        확인해야 합니다. 샌드박스 애플리케이션은 제공업체에 접속하지 않는 결정론적 시뮬레이션(simulated: true)을 수신합니다.
      operationId: start_uae_pass_wallet_verification
      parameters:
        - in: header
          name: Idempotency-Key
          schema:
            type: string
          description: >-
            선택적 재시도 안전 키(최대 255자)입니다. 동일한 키, 지갑 및 본문으로 재시도하면 두 번째 로그인을 시작하지 않고
            기존 인증을 반환합니다. 동일한 키를 다른 지갑이나 본문과 함께 사용하면 409 idempotency_key_reused를
            반환합니다.
      requestBody:
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/DigitalIdWalletApiUaePassWalletVerificationStartRequest
            example:
              country: ARE
              vendor_data: your-customer-reference
              metadata:
                reference: example
              return_url: https://app.example.com/identity/complete
          application/x-www-form-urlencoded:
            schema:
              $ref: >-
                #/components/schemas/DigitalIdWalletApiUaePassWalletVerificationStartRequest
          multipart/form-data:
            schema:
              $ref: >-
                #/components/schemas/DigitalIdWalletApiUaePassWalletVerificationStartRequest
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/DigitalIdWalletApiWalletVerificationResponse
              example:
                request_id: 00000000-0000-4000-8000-000000000001
                wallet_verification:
                  wallet:
                    id: uae_pass
                    name: UAE PASS
                    issuing_authority: UAE Digital Government Authority
                  country: ARE
                  status: Not Finished
                  outcome: pending
                  error: null
                  interaction: redirect
                  simulated: false
                  expires_at: '2026-01-01T10:10:00Z'
                  next_action:
                    type: redirect
                    url: https://wallet.example.com/authorize
                  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: [messages]}) 또는 오류 return_url_invalid,
            return_url_not_allowed, invalid_personal_code, invalid_phone_number,
            idempotency_key_invalid입니다.
        '403':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/DigitalIdWalletApiWalletVerificationStartForbidden
          description: >-
            자격 증명이 누락되었거나({detail}), wallet_unavailable, insufficient_credits 또는
            contract_rate_missing 오류가 발생했습니다.
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationError'
          description: >-
            오류 idempotency_key_reused 또는 idempotency_key_in_progress(Retry-After
            포함).
        '502':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationError'
          description: '오류 wallet_provider_unavailable: 공급자가 시작되지 못했습니다. 아무것도 생성되지 않았습니다.'
        '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/uae-pass/ \
              --header 'x-api-key: YOUR_API_KEY' \
              --header 'Idempotency-Key: your-unique-attempt-key' \
              --header 'Content-Type: application/json' \
              --data '{
              "country": "ARE",
              "vendor_data": "your-customer-reference",
              "metadata": {
                "reference": "example"
              },
              "return_url": "https://app.example.com/identity/complete"
            }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.id_wallets.start_uae_pass(
                vendor_data="your-customer-reference",
                metadata={"reference": "example"},
                country="ARE",
                return_url="https://app.example.com/identity/complete",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.idWallets.startUaePass({
              vendor_data: "your-customer-reference",
              metadata: { reference: "example" },
              country: "ARE",
              return_url: "https://app.example.com/identity/complete",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartUaePass(ctx, didit.IDWalletsStartUaePassParams{\n\tBody: didit.DigitalIDWalletAPIUaePassWalletVerificationStartRequest{\n\t\tVendorData: didit.String(\"your-customer-reference\"),\n\t\tMetadata:   didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:    didit.Some(didit.DigitalIDWalletAPIUaePassWalletVerificationStartCountryEnum(\"ARE\")),\n\t\tReturnURL:  \"https://app.example.com/identity/complete\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.util.Map;

            import me.didit.Didit;

            import
            me.didit.types.DigitalIdWalletApiUaePassWalletVerificationStartCountryEnum;

            import
            me.didit.types.DigitalIdWalletApiUaePassWalletVerificationStartRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.idWallets().startUaePass(DigitalIdWalletApiUaePassWalletVerificationStartRequest.builder()
                    .vendorData("your-customer-reference")
                    .metadata(Map.of("reference", "example"))
                    .country(DigitalIdWalletApiUaePassWalletVerificationStartCountryEnum.of("ARE"))
                    .returnUrl("https://app.example.com/identity/complete")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->idWallets->startUaePass([
                'vendor_data' => 'your-customer-reference',
                'metadata' => ['reference' => 'example'],
                'country' => 'ARE',
                'return_url' => 'https://app.example.com/identity/complete',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.id_wallets.start_uae_pass(
              vendor_data: "your-customer-reference",
              metadata: { reference: "example" },
              country: "ARE",
              return_url: "https://app.example.com/identity/complete"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Collections.Generic;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.IdWallets.StartUaePassAsync(new
            DigitalIdWalletApiUaePassWalletVerificationStartRequest

            {
                VendorData = "your-customer-reference",
                Metadata = new Dictionary<string, object> { ["reference"] = "example" },
                Country = new DigitalIdWalletApiUaePassWalletVerificationStartCountryEnum("ARE"),
                ReturnUrl = "https://app.example.com/identity/complete",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    DigitalIdWalletApiUaePassWalletVerificationStartRequest:
      type: object
      description: UAE PASS 인증(ARE)을 시작합니다.
      properties:
        vendor_data:
          type: string
          nullable: true
          description: '이 인증에 대한 귀하 고유의 참조값(예: 사용자 ID)입니다. 결과 및 webhook으로 반환됩니다.'
        metadata:
          type: object
          additionalProperties: {}
          nullable: true
          description: 인증 건과 함께 저장되고 결과 및 webhook에 반환되는 선택적 JSON 객체입니다.
        sandbox_scenario:
          type: string
          minLength: 1
          description: >-
            샌드박스 애플리케이션 전용: 시뮬레이션된 결과 - 'wallet_cancelled', 'wallet_timeout' 또는
            'wallet_provider_error'. 다른 시나리오(또는 시나리오를 지정하지 않은 경우)는 검증에 성공합니다.
            프로덕션 애플리케이션에서는 거부됩니다. 전체 카탈로그는 GET /v1/sandbox/scenarios/에서 확인할 수
            있습니다.
        country:
          allOf:
            - $ref: >-
                #/components/schemas/DigitalIdWalletApiUaePassWalletVerificationStartCountryEnum
          default: ARE
          description: |-
            UAE PASS 신원의 ISO 3166-1 alpha-3 국가입니다. 기본값은 지원하는 유일한 국가인 ARE입니다.

            * `ARE` - ARE
        return_url:
          type: string
          format: uri
          minLength: 1
          description: >-
            지갑 완료 후 사용자의 브라우저가 돌아갈 https URL이며, request_id 및 result가 추가됩니다. 호스트는
            애플리케이션의 allowed_return_hosts에 등록되어 있어야 합니다(또는 해당 화이트 라벨 도메인이어야 함).
            result 값만 단독으로 신뢰하지 마세요. GET .../verifications/{request_id}/ 또는
            webhook을 통해 최종 결과를 확인하세요.
          maxLength: 2048
        device:
          allOf:
            - $ref: '#/components/schemas/DigitalIdWalletApiDeviceEnum'
          default: same_device
          description: >-
            페이지가 표시된 동일한 기기에서 로그인하는 경우 same_device, 다른 기기를 사용하는 경우
            cross_device(예: BankID의 QR 코드)입니다.


            * `same_device` - same_device

            * `cross_device` - cross_device
      required:
        - return_url
    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'
    DigitalIdWalletApiWalletVerificationStartForbidden:
      oneOf:
        - $ref: >-
            #/components/schemas/DigitalIdWalletApiClientCredentialsForbiddenErrorMessage
        - $ref: '#/components/schemas/DigitalIdWalletApiWalletVerificationError'
    DigitalIdWalletApiWalletVerificationError:
      type: object
      properties:
        error:
          type: string
          description: '기계 판독 가능한 고정 코드입니다(예: wallet_unavailable).'
        detail:
          type: string
      required:
        - detail
        - error
    DigitalIdWalletApiUaePassWalletVerificationStartCountryEnum:
      enum:
        - ARE
      type: string
      description: '* `ARE` - ARE'
    DigitalIdWalletApiDeviceEnum:
      enum:
        - same_device
        - cross_device
      type: string
      description: |-
        * `same_device` - same_device
        * `cross_device` - cross_device
    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
    DigitalIdWalletApiClientCredentialsForbiddenErrorMessage:
      type: object
      properties:
        detail:
          type: string
          default: Forbidden - User doesn't have permission
    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.