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

# Smart-ID 신원 인증 API

> Didit의 Smart-ID 신원 인증 API를 앱에 연동하세요. 국가별 지원 범위, 인증 단계, 결과, 요금을 확인할 수 있습니다.

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

## 적용 범위 및 활성화

| 속성 | 값 |
| - | - |
| 지갑 | Smart-ID |
| 지갑 ID | `smart_id` |
| 국가 | ![](https://didit-public-assets.s3.eu-west-1.amazonaws.com/flags/ee.svg)에스토니아, ![](https://didit-public-assets.s3.eu-west-1.amazonaws.com/flags/lv.svg)라트비아, ![](https://didit-public-assets.s3.eu-west-1.amazonaws.com/flags/lt.svg)리투아니아, ![](https://didit-public-assets.s3.eu-west-1.amazonaws.com/flags/be.svg)벨기에 |
| 프로덕션 지갑 활성화 | ✅ 사용 가능 |
| 공개된 지갑 요금 | 완료된 인증 건당 \$0.21 |

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

## 사용자가 수행하는 작업

애플리케이션에 비교 코드를 표시하고, 사용자가 휴대폰에서 승인할 때까지 기다립니다.
사용자는 애플리케이션이나 API 요청에는 절대 PIN을 입력하지 않고 휴대폰에서 입력합니다.
요청 예시에 있는 모두 0인 식별자는 Didit 샌드박스 시뮬레이션 전용입니다. 실제 인증에는 사용자가 등록한 세부 정보를 사용하십시오.

## 결과 수신

인증을 추적하고 결과를 가져오려면 [디지털 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/smart-id/
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/smart-id/:
    post:
      tags:
        - Digital ID wallets
      summary: Smart-ID 인증 시작
      description: >-
        워크플로 없이 Smart-ID 로그인(SK ID Solutions; EST, LVA, LTU, BEL)을 시작합니다. 신원이
        확인된 경우에만 1회 청구됩니다. 응답에는 사용자에게 표시할 비교 코드가 포함된
        next_action.type=confirm_in_app이 전달되며, 사용자는 앱에서 이를 확인하고 PIN을 입력합니다(절대로
        PIN을 수집하지 마십시오). poll_interval_seconds 간격으로 POST
        /v3/id-verification/wallets/verifications/{request_id}/poll/을 폴링하거나
        webhook을 활용하십시오. Didit 역시 백그라운드에서 폴링을 수행합니다. 샌드박스 애플리케이션은 제공업체에 접속하지 않는
        결정론적 시뮬레이션(simulated: true)을 수신합니다.
      operationId: start_smart_id_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/DigitalIdWalletApiSmartIdWalletVerificationStartRequest
            example:
              country: EST
              vendor_data: your-customer-reference
              metadata:
                reference: example
              personal_code: '00000000000'
          application/x-www-form-urlencoded:
            schema:
              $ref: >-
                #/components/schemas/DigitalIdWalletApiSmartIdWalletVerificationStartRequest
          multipart/form-data:
            schema:
              $ref: >-
                #/components/schemas/DigitalIdWalletApiSmartIdWalletVerificationStartRequest
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/DigitalIdWalletApiWalletVerificationResponse
              example:
                request_id: 00000000-0000-4000-8000-000000000001
                wallet_verification:
                  wallet:
                    id: smart_id
                    name: Smart-ID
                    issuing_authority: SK ID Solutions
                  country: EST
                  status: Not Finished
                  outcome: pending
                  error: null
                  interaction: in_app
                  simulated: true
                  expires_at: '2026-01-01T10:10:00Z'
                  next_action:
                    type: confirm_in_app
                    verification_code: '1234'
                    poll_interval_seconds: 2
                  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/smart-id/ \
              --header 'x-api-key: YOUR_API_KEY' \
              --header 'Idempotency-Key: your-unique-attempt-key' \
              --header 'Content-Type: application/json' \
              --data '{
              "country": "EST",
              "vendor_data": "your-customer-reference",
              "metadata": {
                "reference": "example"
              },
              "personal_code": "00000000000"
            }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.id_wallets.start_smart_id(
                vendor_data="your-customer-reference",
                metadata={"reference": "example"},
                country="EST",
                personal_code="00000000000",
            )
            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.startSmartId({
              vendor_data: "your-customer-reference",
              metadata: { reference: "example" },
              country: "EST",
              personal_code: "00000000000",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDWallets.StartSmartID(ctx, didit.IDWalletsStartSmartIDParams{\n\tBody: didit.DigitalIDWalletAPISmartIDWalletVerificationStartRequest{\n\t\tVendorData:   didit.String(\"your-customer-reference\"),\n\t\tMetadata:     didit.Some(map[string]any{\"reference\": \"example\"}),\n\t\tCountry:      didit.DigitalIDWalletAPISmartIDWalletVerificationStartCountryEnum(\"EST\"),\n\t\tPersonalCode: \"00000000000\",\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.DigitalIdWalletApiSmartIdWalletVerificationStartCountryEnum;

            import
            me.didit.types.DigitalIdWalletApiSmartIdWalletVerificationStartRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.idWallets().startSmartId(DigitalIdWalletApiSmartIdWalletVerificationStartRequest.builder()
                    .vendorData("your-customer-reference")
                    .metadata(Map.of("reference", "example"))
                    .country(DigitalIdWalletApiSmartIdWalletVerificationStartCountryEnum.of("EST"))
                    .personalCode("00000000000")
                    .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->startSmartId([
                'vendor_data' => 'your-customer-reference',
                'metadata' => ['reference' => 'example'],
                'country' => 'EST',
                'personal_code' => '00000000000',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.id_wallets.start_smart_id(
              vendor_data: "your-customer-reference",
              metadata: { reference: "example" },
              country: "EST",
              personal_code: "00000000000"
            )
            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.StartSmartIdAsync(new
            DigitalIdWalletApiSmartIdWalletVerificationStartRequest

            {
                VendorData = "your-customer-reference",
                Metadata = new Dictionary<string, object> { ["reference"] = "example" },
                Country = "EST",
                PersonalCode = "00000000000",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    DigitalIdWalletApiSmartIdWalletVerificationStartRequest:
      type: object
      description: Smart-ID 인증(EST, LVA, LTU, BEL)을 시작합니다.
      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/DigitalIdWalletApiSmartIdWalletVerificationStartCountryEnum
          description: |-
            Smart-ID 신원의 ISO 3166-1 alpha-3 국가입니다.

            * `EST` - EST
            * `LVA` - LVA
            * `LTU` - LTU
            * `BEL` - BEL
        personal_code:
          type: string
          minLength: 1
          description: >-
            사용자의 국가 개인 식별 코드입니다. 사용자의 Smart-ID 앱으로 전송되며, 사용자는 앱에서 비교 코드를 확인하고
            PIN을 입력합니다. PIN을 수집하지 마세요.
          pattern: ^[0-9-]{6,20}$
      required:
        - country
        - personal_code
    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
    DigitalIdWalletApiSmartIdWalletVerificationStartCountryEnum:
      enum:
        - EST
        - LVA
        - LTU
        - BEL
      type: string
      description: |-
        * `EST` - EST
        * `LVA` - LVA
        * `LTU` - LTU
        * `BEL` - BEL
    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.