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

# 이메일 OTP 검증 API: 이메일 코드 확인

> Didit의 POST /v3/email/check/로 일회용 이메일 코드를 검증하고 유출, 일회용 주소, 전달 가능성 신호를 확인하세요. 사용량 기준 과금, 계약 불필요.

## 인텔리전스 추가 기능

`enable_enrichment`를 `true`로 설정하면 해당 주소에 대해 이메일 인텔리전스도 실행되어 위험 점수와 유출 이력을 함께 받을 수 있습니다.
이 추가 기능은 정가 기준으로 요청당 \$0.05가 부과되며, 검사 요금에 더해 청구됩니다.
잔액이 이 금액을 감당할 수 없으면 요청은 `403`을 반환합니다.

세 개의 필드가 신호의 동작을 결정합니다.
각 필드의 값은 `NO_ACTION`(기본값) 또는 `DECLINE`이며, 각 필드는 `enable_enrichment`가 `true`일 때만 적용됩니다.

| 필드 | 거부되는 경우 |
| - | - |
| `email_intelligence_score_action` | 위험 점수가 임계값을 초과하는 경우 |
| `recent_email_breach_action` | 주소가 최근 알려진 데이터 유출 사고에 포함된 경우 |
| `frequent_email_breach_action` | 주소가 알려진 데이터 유출 사고에 여러 번 포함된 경우 |

`NO_ACTION`으로 설정하면 해당 신호는 여전히 `email.email_intelligence`에 반환되므로, 직접 정한 규칙을 적용할 수 있습니다.


## OpenAPI

````yaml ko/openapi-25.json POST /v3/email/check/
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/email/check/:
    post:
      tags:
        - Standalone APIs
      summary: 이메일 코드 확인
      description: >-
        [`POST /v3/email/send/`](/ko/standalone-apis/email-send)로 전송된 OTP를 검증하고
        최종 인증 결과와 이메일 인텔리전스를 확인합니다: 전송 가능 여부, 유출 노출 여부(유출 인텔리전스 데이터베이스의
        `is_breached` 및 `breaches` 목록), 일회용 제공업체 감지, 세션 전반에 걸친 주소 중복 사용.


        **검사 대상 인증을 찾는 방법.** 매칭은 애플리케이션과 `email` 주소를 기준으로 수행되며, `request_id`는 입력
        파라미터가 아닙니다. 지난 **5분** 이내에 생성된 가장 최근의 대기 중인 인증을 확인합니다. 해당 건이 없는 경우(전송된 적
        없음, 이미 완료됨, 전송 시점에 전송 불가능했음, 또는 5분이 지남) endpoint는 `status: "Expired or
        Not Found"`와 함께 `200`을 반환합니다.


        **시도 가능 횟수.** 각 인증마다 **3회의 코드 입력 시도**가 허용됩니다. 처음 두 번 잘못된 코드를 입력하면 남은 시도
        횟수 및 `email: null`과 함께 `status: "Failed"`가 반환됩니다. 세 번째로 잘못된 코드를 입력하면
        `EMAIL_CODE_ATTEMPTS_EXCEEDED` 경고와 함께 인증이 `Declined`로 최종 처리되고 전체 이메일
        보고서가 반환됩니다. 코드는 대소문자를 구분하지 않고 비교되며(`alphanumeric_code` 전송에 해당), 가장 최근에
        전송된 코드만 유효합니다.


        **결과.** `Approved` — 올바른 코드이며 거부 위험이 없음. `Declined` — 최종 거부: 코드는 올바르지만
        거부 위험 항목에 매칭됨(아래의 `DECLINE` 작업, 차단 목록에 등록된 주소, 또는 완료 시점에 전송 불가로 확인된 주소),
        또는 시도 횟수를 모두 소진함. `Failed` — 잘못된 코드, 잔여 시도 횟수 있음. `Expired or Not Found`
        — 확인할 항목 없음. `Approved`/`Declined` 시 `request_id`는 전송 요청의
        `request_id`(세션 ID)와 동일하며 `email`에는 전체 보고서(`is_breached`, `breaches`,
        `is_disposable`, `is_undeliverable`, `warnings`, `lifecycle`,
        `matches`)가 포함됩니다. `Failed` 및 `Expired or Not Found` 시 `request_id`는 일회성
        무작위 UUID입니다.


        **위험 작업.** `duplicated_email_action`, `breached_email_action`,
        `disposable_email_action`은 올바른 코드가 입력되었을 때 해당 위험이 감지되는 경우의 처리 방식을 결정합니다.
        `DECLINE`은 최종 상태를 `Declined`로 변경합니다. `NO_ACTION`(기본값)은 상태에 영향을 주지 않고
        `email.warnings`에 위험 항목을 기록합니다.


        **결제.** 검사는 무료입니다 — 크레딧은 성공적인 전송 시 소진됩니다.


        **세션 유지.** 완료된 검사는 전송 시 생성된 세션을 업데이트하고(Business Console에서 확인 가능하며 `GET
        /v3/session/{sessionId}/decision/`을 통해 조회 가능), `status.updated` webhook을
        호출합니다.


        **샌드박스.** 샌드박스 API 키는 모든 처리를 건너뜁니다. 올바른 형식의 모든 코드(`123456` 포함)에 대해 간소화된
        `email` 객체(`status`, `email`, `is_breached`, `is_disposable`,
        `is_undeliverable`)가 포함된 정적 `Approved` payload를 반환합니다. 형식이 잘못된 입력은 여전히
        `400`을 반환합니다. 아무것도 저장되지 않습니다.


        **인증.** `x-api-key` 헤더에 애플리케이션의 API 키를 포함합니다. 인증 자격 증명이 누락되었거나 유효하지 않은
        경우 `403`(`{"detail": "You do not have permission to perform this
        action."}`)을 반환합니다 — 이 API는 `401`을 반환하지 않습니다.


        **속도 제한.** 모든 POST/PATCH/DELETE endpoint에 걸쳐 API 키당 분당 300건의 쓰기 요청 한도가
        공유됩니다. 이를 초과하면 `429`가 반환됩니다.


        **소셜 풋프린트.** `enable_social`을 `true`로 설정하면 `email_social` 블록이 추가됩니다.
        여기에는 이 주소가 등록된 온라인 플랫폼 정보, 카테고리별 건수 및 확인 가능한 프로필 세부 정보가 포함됩니다.
        `profiles_registered: 0`은 플랫폼을 확인했으나 주소가 등록된 곳을 찾지 못했음을 의미하며, 이는 유효하고
        요금이 청구되는 응답입니다. 부가 기능을 요청하지 않았거나 검사를 완료할 수 없는 경우에는 이 블록이 포함되지 않으며, 이 경우
        요금이 청구되지 않습니다. 결제 시 이 endpoint 자체의 가격에 요청당 1개의 `email_social` 단위가 추가됩니다.
      operationId: post_v3email_check
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  format: email
                  description: >-
                    일치하는 [`POST
                    /v3/email/send/`](/ko/standalone-apis/email-send) 호출에 사용된 것과
                    동일한 이메일 주소입니다. 이를 통해 검증과 전송이 연결됩니다.
                  example: alice@example.com
                code:
                  type: string
                  maxLength: 10
                  description: >-
                    최종 사용자가 수신한 OTP: 4~8자리 숫자이거나, 발송 시 `alphanumeric_code:
                    true`를 사용한 경우 4~8자리 문자/숫자입니다. 비교 시 대소문자를 구분하지 않습니다.
                  example: '123456'
                duplicated_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    동일한 주소가 애플리케이션의 다른 사용자(다른 `vendor_data`)에 의해 이미 사용되고 승인되었을 때
                    수행할 작업입니다(이전에 승인된 인증만 계산됨). `DECLINE`은 최종 `status`를
                    `Declined`로 변경하며, `NO_ACTION`은 위험을 `email.warnings`에 기록하고
                    `email.matches`를 채웁니다.
                breached_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    알려진 데이터 유출 사고에 해당 주소가 포함되어 있을 때(`email.is_breached`) 수행할
                    작업입니다. `DECLINE`은 최종 `status`를 `Declined`로 변경하고,
                    `NO_ACTION`은 해당 위험을 `email.warnings`에 기록합니다.
                disposable_email_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    도메인이 일회용/임시 이메일 제공업체에 속할 때 수행할 작업입니다
                    (`email.is_disposable`). `DECLINE`은 최종 `status`를 `Declined`로
                    변경하며, `NO_ACTION`은 위험을 `email.warnings`에 기록합니다.
                enable_enrichment:
                  type: boolean
                  default: false
                  description: >-
                    `true`인 경우 해당 주소에 대한 이메일 인텔리전스(위험 점수 및 유출 이력)도 실행합니다. 이
                    endpoint의 자체 가격 외에 요청당 하나의 `email_intelligence_api` 단위(정가 기준
                    $0.05)로 청구됩니다. 잔액이 이를 충당하지 못하면 요청은 `403`을 반환합니다.
                  example: false
                email_intelligence_score_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    이메일 인텔리전스 위험 점수가 임계값을 초과할 때 수행할 작업입니다. `DECLINE`은 최종
                    `status`를 `Declined`로 변경하며, `NO_ACTION`은 거부하지 않고 신호를 기록합니다.
                    `enable_enrichment`가 `true`일 때만 적용됩니다.
                recent_email_breach_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    주소가 최근 알려진 데이터 침해에 포함된 경우의 작업입니다. `DECLINE`은 최종 `status`를
                    `Declined`로 변경합니다. `NO_ACTION`은 거부하지 않고 신호를 기록합니다.
                    `enable_enrichment`가 `true`일 때만 적용됩니다.
                frequent_email_breach_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    주소가 알려진 다수의 데이터 침해에 포함된 경우의 작업입니다. `DECLINE`은 최종 `status`를
                    `Declined`로 변경합니다. `NO_ACTION`은 거부하지 않고 신호를 기록합니다.
                    `enable_enrichment`가 `true`일 때만 적용됩니다.
                enable_social:
                  type: boolean
                  default: false
                  description: >-
                    true인 경우, 주소의 소셜 발자국(등록된 이메일, 소셜, 전문, 전자상거래 및 엔터테인먼트 플랫폼)도
                    조회합니다. 이 endpoint 자체의 가격 외에 요청당 `email_social` 1단위로 청구됩니다.
                  example: true
                email_no_social_presence_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    소셜 풋프린트 검사 결과 지원하는 플랫폼 중 어느 곳에도 해당 주소가 등록되어 있지 않을 때 수행할
                    작업입니다. 이 endpoint에서는 NO_ACTION 및 DECLINE만 허용되며, 동일한 이름의 워크플로
                    구성 키에서는 REVIEW를 사용할 수 있습니다.
              required:
                - email
                - code
            examples:
              Default:
                summary: 모든 위험을 기록하지만 자동으로 거부하지는 않음
                value:
                  email: alice@example.com
                  code: '123456'
              Strict risk policy:
                summary: 일회용 및 유출된 편지함 자동 거부
                value:
                  email: alice@example.com
                  code: '123456'
                  disposable_email_action: DECLINE
                  breached_email_action: DECLINE
      responses:
        '200':
          description: >-
            확인 완료 — 잘못된 코드 및 누락된 인증도 `200`을 반환하므로 HTTP 코드가 아닌 `status`를 확인하십시오.
            `email`은 최종 결과(`Approved`/`Declined`)에서만 채워지며, `Failed`에서는 `null`,
            `Expired or Not Found`에서는 제외됩니다.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmailVerificationCheckResponse'
              examples:
                Approved:
                  summary: 올바른 코드 — 이상 없는 주소, 전체 이메일 보고서
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Approved
                    message: The verification code is correct.
                    email:
                      status: Approved
                      email: alice@example.com
                      is_breached: false
                      breaches: []
                      is_disposable: false
                      is_undeliverable: false
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      warnings: []
                      lifecycle:
                        - type: EMAIL_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                          fee: 0.02
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '123456'
                            status: Approved
                          fee: 0
                        - type: EMAIL_VERIFICATION_APPROVED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details: null
                          fee: 0
                      matches: []
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Approved with breach exposure:
                  summary: >-
                    올바른 코드이며 유출에 노출된 사실이 경고로
                    기록됨(breached_email_action=NO_ACTION)
                  value:
                    request_id: 3a1f2b6c-9d4e-4f7a-8b2c-1e5d6f7a8b9c
                    status: Approved
                    message: The verification code is correct.
                    email:
                      status: Approved
                      email: bob@example.com
                      is_breached: true
                      breaches:
                        - name: ExampleApp
                          domain: exampleapp.com
                          breach_date: '2019-03-21'
                          breach_emails_count: 763117
                          description: >-
                            In March 2019, the social platform ExampleApp
                            suffered a data breach that exposed email addresses
                            and passwords.
                          logo_path: https://<media-host>/logos/ExampleApp.png
                          data_classes:
                            - email_addresses
                            - passwords
                          is_verified: true
                      is_disposable: false
                      is_undeliverable: false
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      warnings:
                        - feature: EMAIL
                          risk: BREACHED_EMAIL_DETECTED
                          additional_data: null
                          log_type: information
                          short_description: Breached email detected
                          long_description: >-
                            This email address was found in one or more known
                            data breaches.
                      lifecycle:
                        - type: EMAIL_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                          fee: 0.02
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '835126'
                            status: Approved
                          fee: 0
                        - type: EMAIL_VERIFICATION_APPROVED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details: null
                          fee: 0
                      matches: []
                    vendor_data: user-5678
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Failed (attempts remaining):
                  summary: 잘못된 코드 — 사용자가 재시도할 수 있습니다. 여기서 request_id는 일회용 UUID입니다.
                  value:
                    request_id: 11111111-2222-3333-4444-555555555555
                    status: Failed
                    message: 'The verification code is incorrect. Attempts remaining: 2'
                    email: null
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:21.512340+00:00'
                Declined (risk policy):
                  summary: 올바른 코드이지만 일회용 주소이며 disposable_email_action=DECLINE으로 설정됨
                  value:
                    request_id: 8c2d3e4f-5a6b-4c7d-8e9f-0a1b2c3d4e5f
                    status: Declined
                    message: The verification code is correct.
                    email:
                      status: Declined
                      email: tempuser42@mailinator.com
                      is_breached: false
                      breaches: []
                      is_disposable: true
                      is_undeliverable: false
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      warnings:
                        - feature: EMAIL
                          risk: DISPOSABLE_EMAIL_DETECTED
                          additional_data: null
                          log_type: error
                          short_description: Disposable email detected
                          long_description: >-
                            The system detected that the email is disposable,
                            which is not allowed.
                      lifecycle:
                        - type: EMAIL_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                          fee: 0.02
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '123456'
                            status: Approved
                          fee: 0
                        - type: EMAIL_VERIFICATION_DECLINED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details:
                            reason: DISPOSABLE_EMAIL_DETECTED
                          fee: 0
                      matches: []
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Expired or Not Found:
                  summary: 지난 5분 동안 이 주소에 대해 대기 중인 인증이 없습니다
                  value:
                    request_id: 88808a77-06e9-4cb0-85f5-9c052ddfd987
                    status: Expired or Not Found
                    message: No pending email verification found in the last 5 minutes.
                    vendor_data: null
                    metadata: null
                    created_at: '2026-06-12T01:24:59.887904+00:00'
        '400':
          description: '검증 오류 — DRF의 필드 오류 엔벨로프: 문제가 있는 필드당 하나의 메시지 배열.'
          content:
            application/json:
              examples:
                Invalid email:
                  summary: 잘못된 형식의 이메일 주소
                  value:
                    email:
                      - Enter a valid email address.
                Missing code:
                  summary: 본문에 `code`가 포함되지 않았습니다
                  value:
                    code:
                      - This field is required.
        '403':
          description: >-
            권한이 거부되었습니다. `x-api-key` 헤더가 누락되었을 때 반환됩니다. 잘못되었거나 취소되었거나 만료된 키는
            `401`을 반환합니다. 확인은 무료이므로 크레딧 확인이 수행되지 않습니다.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: '`x-api-key` 헤더가 없거나, 키가 유효하지 않거나 해지되었습니다'
                  value:
                    detail: You do not have permission to perform this action.
        '429':
          description: >-
            속도 제한을 초과했습니다. POST/PATCH/DELETE endpoint는 API 키당 분당 300회의 쓰기 요청 한도를
            공유합니다(거래 생성 및 이벤트 수집은 별도로 600회 한도 적용). 응답에는 `X-RateLimit-Limit`,
            `X-RateLimit-Remaining`, `X-RateLimit-Reset`, `Retry-After` 헤더가
            포함됩니다.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: 현재 분 동안 300건을 초과하는 쓰기 요청 발생
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
              schema:
                type: object
                properties:
                  detail:
                    type: string
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v3/email/check/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "email": "alice@example.com",
                "code": "123456",
                "disposable_email_action": "DECLINE"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.email.check_code(
                email="alice@example.com",
                code="123456",
            )
            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.email.checkCode({
              email: "alice@example.com",
              code: "123456",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Email.CheckCode(ctx, didit.EmailCheckCodeParams{\n\tEmail: \"alice@example.com\",\n\tCode:  \"123456\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: |-
            import me.didit.Didit;
            import me.didit.types.EmailCheckCodeParams;

            // Reads DIDIT_API_KEY.
            Didit client = new Didit();

            var result = client.email().checkCode(EmailCheckCodeParams.builder()
                    .email("alice@example.com")
                    .code("123456")
                    .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->email->checkCode([
                'email' => 'alice@example.com',
                'code' => '123456',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.email.check_code(
              email: "alice@example.com",
              code: "123456"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.Email.CheckCodeAsync(new
            EmailCheckCodeParams

            {
                Email = "alice@example.com",
                Code = "123456",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    EmailVerificationCheckResponse:
      type: object
      properties:
        request_id:
          type: string
          format: uuid
          description: >-
            `Approved`/`Declined`인 경우: 일치하는 인증의 세션 ID — `POST /v3/email/send/`에서
            반환된 `request_id`와 동일합니다. `Failed` 및 `Expired or Not Found`인 경우: 나중에
            조회할 수 없는 일회성 무작위 UUID입니다.
        status:
          type: string
          enum:
            - Approved
            - Declined
            - Failed
            - Expired or Not Found
          description: >-
            `Approved` — 올바른 코드이며 거부 위험이 없음. `Declined` — 최종 상태: 거부 위험이 일치했거나 시도
            횟수 한도(3회)가 소진됨. `Failed` — 잘못된 코드이며 잔여 시도 횟수가 있음. `Expired or Not
            Found` — 지난 5분 동안 이 주소에 대한 보류 중인 인증이 없음.
        message:
          type: string
          description: 잘못된 코드 입력 후 남은 시도 횟수를 포함한 결과에 대한 사람이 읽기 쉬운 설명입니다.
        email:
          type: object
          nullable: true
          description: >-
            전체 이메일 보고서입니다. 최종 완료된 결과(`Approved`/`Declined`)에만 존재(null이 아님)하며,
            `Failed`의 경우 `null`이고 `Expired or Not Found`의 경우 생략됩니다.
          properties:
            status:
              type: string
              enum:
                - Approved
                - Declined
                - In Review
                - Not Finished
                - Expired
              description: 이메일 인증의 최종 상태입니다. 완료된 검사의 최상위 `status`와 일치합니다.
            email:
              type: string
              format: email
              description: 인증된 이메일 주소입니다.
              example: alice@example.com
            is_breached:
              type: boolean
              description: 주소가 알려진 데이터 유출 사고에 나타난 경우 `true`입니다(완료 시점에 유출 인텔리전스 조회가 실행됨).
            breaches:
              type: array
              description: >-
                이 주소를 포함하는 가장 최근의 알려진 침해 사례 최대 5건입니다. `is_breached`가 `false`이면 빈
                배열이거나 생략됩니다.
              items:
                type: object
                properties:
                  name:
                    type: string
                    description: 침해 식별자입니다.
                  domain:
                    type: string
                    description: 침해된 서비스의 도메인입니다.
                  breach_date:
                    type: string
                    format: date
                    description: 위반이 발생한 일자입니다.
                  breach_emails_count:
                    type: integer
                    description: 유출 사건에서 노출된 계정의 총 개수입니다.
                  description:
                    type: string
                    description: 침해에 대한 사람이 읽기 쉬운 설명입니다(HTML 마크업을 포함할 수 있음).
                  logo_path:
                    type: string
                    description: 침해된 서비스 로고의 URL입니다.
                  data_classes:
                    type: array
                    items:
                      type: string
                    description: >-
                      노출된 데이터의 카테고리(snake_case 형식, 예: `email_addresses`,
                      `passwords`).
                  is_verified:
                    type: boolean
                    description: 유출이 사실인 것으로 확인되었는지 여부입니다.
            is_disposable:
              type: boolean
              description: 도메인이 알려진 일회용/임시 이메일 제공업체에 속하는 경우 `true`입니다.
            is_undeliverable:
              type: boolean
              description: 주소에서 메일을 수신할 수 없는 경우(구문 또는 DNS/MX 검증 실패, 또는 메시지 반송) `true`입니다.
            verification_attempts:
              type: integer
              description: 이 인증에 대한 OTP 전송 횟수입니다(1회, 재시도 후에는 2회).
            verified_at:
              type: string
              format: date-time
              nullable: true
              description: 올바른 코드가 입력된 시점입니다. 인증이 승인되지 않은 경우 `null`입니다.
            warnings:
              type: array
              description: >-
                인증 중 기록된 위험 경고(중복, 유출, 일회용, 전송 불가, 시도 횟수 초과, 차단 목록 등). 없을 경우 빈
                배열입니다.
              items:
                type: object
                properties:
                  feature:
                    type: string
                    description: 경고를 생성한 기능입니다. 여기서는 항상 `EMAIL`입니다.
                  risk:
                    type: string
                    description: 기계 판독 가능한 위험 코드입니다.
                  additional_data:
                    type: object
                    nullable: true
                    description: >-
                      위험별 컨텍스트(예: 중복 위험의 경우 중복된 세션 ID). 위험에 추가 데이터가 없는 경우
                      `null`입니다.
                  log_type:
                    type: string
                    enum:
                      - error
                      - warning
                      - information
                    description: >-
                      심각도입니다. `error` 위험은 인증을 거부하고, `warning`은 검토 대상으로 표시하며,
                      `information`은 상태에 영향을 주지 않고 기록됩니다.
                  short_description:
                    type: string
                    description: 사람이 읽을 수 있는 한 줄의 위험 요약입니다.
                  long_description:
                    type: string
                    description: 위험에 대한 사람이 읽기 쉬운 설명입니다.
            lifecycle:
              type: array
              description: >-
                인증의 시간순 감사 로그입니다. 이벤트 `type`은 `EMAIL_VERIFICATION_MESSAGE_SENT`,
                `EMAIL_VERIFICATION_RETRY_MESSAGE_SENT`, `VALID_CODE_ENTERED`,
                `INVALID_CODE_ENTERED`, `EMAIL_VERIFICATION_APPROVED`,
                `EMAIL_VERIFICATION_DECLINED`, `EMAIL_VERIFICATION_IN_REVIEW`,
                `EMAIL_VERIFICATION_EXPIRED` 중 하나입니다.
              items:
                type: object
                properties:
                  type:
                    type: string
                    description: 이벤트 유형입니다.
                  timestamp:
                    type: string
                    format: date-time
                    description: 이벤트가 발생한 시점입니다.
                  details:
                    type: object
                    nullable: true
                    description: >-
                      이벤트 관련 payload입니다. 발송 이벤트: `{status, reason}`. 코드 입력 이벤트:
                      `{code_tried, status}`. 최종 상태 이벤트: `null`, 또는 거부됨/검토 중일 때
                      `{reason}`.
                  fee:
                    type: number
                    description: >-
                      이 이벤트에 대해 청구된 USD 금액입니다. 첫 번째 성공적인 발송에서만 0이 아니며, 재시도, 코드
                      입력 및 상태 이벤트에서는 0입니다.
            matches:
              type: array
              description: >-
                다른 사용자(서로 다른 `vendor_data`)가 동일한 이메일 주소를 사용한 애플리케이션의 다른 세션(KYC,
                KYB 또는 API)입니다. 최대 5개 항목까지 표시되며, 가상 목록 항목 차단 목록 일치 항목이 있는 경우(세션
                기반 차단 목록 이메일이 없는 경우에만) 맨 앞에 추가됩니다. 세션 기반 일치 항목은 created_at 순서를
                유지합니다. 일치 항목이 없는 경우 빈 배열입니다.
              items:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                    description: 이 이메일 주소를 사용한 다른 인증의 세션 id입니다.
                  session_number:
                    type: integer
                    description: 해당 세션의 사람이 읽기 쉬운 순차 번호입니다.
                  vendor_data:
                    type: string
                    nullable: true
                    description: 해당 세션의 `vendor_data`입니다.
                  verification_date:
                    type: string
                    description: 해당 세션이 생성된 시점(`YYYY-MM-DDTHH:MM:SSZ`)입니다.
                  email:
                    type: string
                    description: 일치하는 이메일 주소입니다.
                  status:
                    type: string
                    description: '해당 세션의 상태(예: `Approved`, `Declined`, `In Progress`)입니다.'
                  is_blocklisted:
                    type: boolean
                    description: 이메일 주소가 애플리케이션의 차단 목록에 있는지 여부입니다.
                  api_service:
                    type: string
                    nullable: true
                    description: >-
                      API 유형 세션의 경우 이를 생성한 독립형 API(예: `PHONE_VERIFICATION`), 일반
                      인증 세션의 경우 `null`입니다.
                  source:
                    type: string
                    description: >-
                      일치 항목이 발견된 위치입니다. 일반적으로 `session`이며, 조직 목록 항목을 통한 차단 목록
                      일치는 `source: "list_entry"` 및 null
                      `session_id`/`session_number`가 있는 합성 일치 항목을 앞에 추가합니다.
            email_social:
              $ref: '#/components/schemas/EmailSocialFootprint'
            email_intelligence:
              allOf:
                - $ref: '#/components/schemas/EmailIntelligence'
              description: 이메일 인텔리전스 신호입니다. 확인 시 `enable_enrichment`가 `true`인 경우에만 표시됩니다.
        vendor_data:
          type: string
          nullable: true
          description: 일치하는 인증 세션의 `vendor_data`입니다. `Expired or Not Found`인 경우 `null`입니다.
        metadata:
          type: object
          nullable: true
          description: 일치하는 인증 세션의 `metadata`입니다. `Expired or Not Found`인 경우 `null`입니다.
        created_at:
          type: string
          format: date-time
          description: 이 검사 응답의 타임스탬프입니다.
    EmailSocialFootprint:
      type: object
      nullable: true
      description: >-
        이메일 주소의 소셜 풋프린트(등록된 온라인 플랫폼)입니다. `enable_social`이 설정되고 확인이 완료된 경우에만
        표시됩니다. 반환된 데이터가 없는 경우 각 개수는 null일 수 있습니다. `profiles_registered: 0`은 플랫폼을
        확인했으나 해당 이메일 주소가 어떤 플랫폼에서도 발견되지 않았음을 의미하며, 이는 유효하고 요금이 청구되는 응답이자 흔히 나타나는
        합성 신원 신호입니다.
      properties:
        profiles_registered:
          type: integer
          nullable: true
          description: 이메일 주소 등록이 확인된 플랫폼입니다.
          example: 5
        profiles_checked:
          type: integer
          nullable: true
          description: 가입 여부가 평가된 플랫폼입니다.
          example: 14
        names_found:
          type: integer
          nullable: true
          description: 관련 이름을 반환한 플랫폼입니다.
          example: 0
        photos_found:
          type: integer
          nullable: true
          description: 프로필 사진을 반환한 플랫폼입니다.
          example: 0
        communication_breadth:
          type: integer
          nullable: true
          description: 존재가 감지된 커뮤니케이션 플랫폼입니다.
          example: 2
        digital_footprint_diversity:
          type: integer
          nullable: true
          description: 존재가 감지된 고유한 플랫폼 카테고리입니다.
          example: 5
        digital_sophistication_index:
          type: integer
          nullable: true
          description: 복합 디지털 성숙도 지표(0-10)입니다.
          example: 5
        engagement_depth_index:
          type: integer
          nullable: true
          description: 프로필 정보량 지표, 0-10.
          example: 3
        subscription_affordability_index:
          type: integer
          nullable: true
          description: 무료 대 유료 플랫폼 비율(0-10)입니다.
          example: 2
        free_platforms:
          type: integer
          nullable: true
          description: 무료 플랫폼에서의 등록 수입니다.
          example: 4
        full_paid_platforms:
          type: integer
          nullable: true
          description: 완전 유료 플랫폼에서의 등록 수입니다.
          example: 0
        partial_paid_platforms:
          type: integer
          nullable: true
          description: 프리미엄(freemium) 플랫폼에서의 등록 수입니다.
          example: 1
        whatsapp_profile_completeness:
          type: string
          nullable: true
          enum:
            - Basic
            - Partial
            - Complete
            - Not Present
            - null
          description: WhatsApp 프로필의 완성도입니다. 전화번호 전용이며 이메일의 경우 null입니다.
          example: Partial
        registered_platforms:
          type: array
          description: 가입이 확인된 플랫폼입니다.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        not_registered_platforms:
          type: array
          description: 부정적인 결과가 반환된 플랫폼입니다.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        categories:
          type: object
          description: 플랫폼 카테고리별 등록 수 및 비율입니다.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintCategorySummary'
        profiles:
          type: object
          description: 플랫폼에서 프로필 세부 정보를 제공하는 경우, 플랫폼을 키로 하는 플랫폼별 프로필 세부 정보입니다.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintProfile'
    EmailIntelligence:
      type: object
      description: >-
        정규화된 이메일 인텔리전스 블록입니다. 이 이메일에 대해 인텔리전스 애드온이 실행된 경우에만 존재하며, 존재하는 경우 동일한 값을
        가진 `enrichment` 별칭으로도 노출됩니다.
      properties:
        score:
          type: number
          nullable: true
          description: 정규화된 0-100 위험 점수입니다. 높을수록 위험합니다.
        deliverable:
          type: string
          nullable: true
          description: '전송 가능성 구간(예: `high`).'
        breach_risk_level:
          type: string
          nullable: true
          description: '`Low`, `Medium` 또는 `High`.'
        breach_risk_index:
          type: number
          nullable: true
          description: 숫자 침해 위험 지수입니다.
        is_recent_breach:
          type: boolean
          nullable: true
          description: 주소가 최근 유출 사고에 나타난 경우 `true`입니다.
        is_frequent_breached:
          type: boolean
          nullable: true
          description: 주소가 다수의 유출 사고에 나타난 경우 `true`입니다.
        is_disposable:
          type: boolean
          nullable: true
          description: 도메인이 일회용 이메일 제공업체인 경우 `true`입니다.
        is_free_domain:
          type: boolean
          nullable: true
          description: 도메인이 무료 메일 제공업체인 경우 `true`입니다.
        is_breached:
          type: boolean
          nullable: true
          description: 주소가 알려진 유출 사고에 나타난 경우 `true`입니다.
        no_of_breaches:
          type: number
          nullable: true
          description: 해당 주소가 포함된 알려진 유출 건수입니다.
        reason_codes:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                description: >-
                  신호의 안정적인 Didit 식별자입니다(예: `IR-5AC67A32`). 불투명한 값이므로 구문 분석하지 말고
                  그룹화 및 필터링에만 사용하세요.
              value:
                nullable: true
                description: >-
                  위험 플래그(예: `voip`, `leaked`, `disposable`, `spam_trap`)의 경우 해당
                  값: boolean, 수준 또는 날짜입니다. 점수가 산정된 사유 코드의 경우 null입니다.
              direction:
                type: string
                enum:
                  - risk
                  - trust
                description: 신호가 위험을 높였는지 또는 신뢰도를 높였는지 여부입니다.
              message:
                type: string
                description: 신호에 대한 사람이 읽기 쉬운 영어 설명입니다.
              impact_level:
                type: string
                nullable: true
                description: >-
                  시그널이 점수를 얼마나 크게 변동시켰는지 나타내며, 예를 들어 `low`, `medium`, `high` 등이
                  있습니다.
          description: >-
            점수를 설명하는 신호 목록으로, 각각 안정적인 Didit 코드, 방향, 메시지 및 영향 수준을 포함합니다. 새로운 코드가
            점진적으로 추가될 수 있으므로 알 수 없는 코드를 거부하지 마세요.
    SocialFootprintPlatform:
      type: object
      properties:
        platform:
          type: string
          description: 플랫폼 식별자입니다.
          example: whatsapp
        category:
          type: string
          description: >-
            플랫폼 카테고리(예: MESSAGING, SOCIAL_MEDIA, ECOMMERCE, PROFESSIONAL,
            EMAIL_PROVIDER)입니다.
          example: MESSAGING
        scope:
          type: string
          enum:
            - global
            - local
          description: 글로벌 플랫폼의 경우 `global`, 특정 지역 플랫폼의 경우 `local`.
          example: global
    SocialFootprintCategorySummary:
      type: object
      properties:
        registered:
          type: integer
          nullable: true
          description: 이 카테고리에서 가입이 확인된 플랫폼입니다.
          example: 2
        ratio:
          type: number
          format: float
          nullable: true
          description: 해당 카테고리에서 확인된 플랫폼 중 등록이 있는 플랫폼의 비율(0.0-1.0)입니다.
          example: 0.6667
    SocialFootprintProfile:
      type: object
      properties:
        name:
          type: string
          nullable: true
          description: 플랫폼에서 제공하는 경우 프로필 이름입니다.
        photo:
          type: string
          nullable: true
          description: 플랫폼에서 제공하는 경우 프로필 사진 URL입니다.
        about:
          type: string
          nullable: true
          description: 플랫폼에서 제공하는 경우 프로필 소개/약력 텍스트입니다.
        privacy_status:
          type: string
          nullable: true
          enum:
            - PUBLIC
            - PRIVATE
            - null
          description: 플랫폼에서 제공하는 경우 프로필 공개 여부입니다.
        business_account:
          type: boolean
          nullable: true
          description: 플랫폼에서 정보를 제공하는 경우, 프로필이 비즈니스 계정인지 여부입니다.
  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 를 참고하십시오.

````

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