주요 콘텐츠로 건너뛰기
Didit, 2백만 달러 투자 유치 및 Y Combinator (W26) 합류
Didit
개발자


신원 및 사기를 통합하는 가장 좋은 방법.

샌드박스를 열고 curl 하나를 붙여넣으면 5분 안에 배포됩니다. 공개 문서, 5개의 Software Development Kit (SDK), 그리고 인공지능(AI) 코딩 에이전트가 Didit을 통합할 수 있도록 Model Context Protocol (MCP) 서버를 제공합니다. 전체 KYC 확인당 $0.33, 매월 500회 무료.

지원
Y Combinator
GBTC Finance
Bondex
Crnogorski Telekom
UCSF Neuroscape
Shiply
Adelantos

전 세계 2,000개 이상의 조직에서 신뢰합니다.

빠른 시작

5분 안에 확인 완료.

가입부터 첫 번째 확인된 사용자까지 5단계. 각 단계는 비즈니스 콘솔 경로와 프로그래밍 방식의 Application Programming Interface (API) 경로를 연결합니다. 또는 모든 단계를 건너뛰고 AI 코딩 에이전트에 docs.didit.me/integration/integration-prompt의 통합 프롬프트를 붙여넣으세요.
01 · 가입

Didit 계정을 만드세요.

  • 비즈니스 콘솔에서: business.didit.me에서 60초 이내에 가입하세요. — 카드 필요 없음, 판매 게이트 없음.
  • Application Programming Interface (API)를 통해: POST https://apx.didit.me/auth/v2/programmatic/register/를 호출한 다음 POST .../verify-email/을 호출하세요.

어떤 경로든 프로덕션과 동일한 형태의 샌드박스 API 키를 얻게 되며, 모든 모듈이 잠금 해제됩니다.

프로그래밍 방식 등록 API
프로덕션 API 키
라이브
didit_sk_live_8f4c2a…9bf3

방금 발급됨 — 카드, 계약, 통화 없음.

  • 최소 없음
  • 계약 없음
  • 월 500회 무료
  • 오픈 샌드박스
02 · 워크플로 구축

모듈을 선택하세요. 워크플로를 구성하세요.

  • 비즈니스 콘솔에서: 워크플로 빌더에 모듈을 드래그 앤 드롭하세요. — 신분증 확인, 수동 생체 인식, 얼굴 매칭, 자금세탁방지(AML), 지갑 심사, 인터넷 프로토콜(IP) 분석 및 19가지 추가 모듈.
  • API를 통해: 원하는 모듈로 verification.didit.me에서 POST /v3/workflows/를 호출하세요.

어떤 경로든 모든 세션에 전달할 workflow_id를 반환합니다.

워크플로 생성 API
워크플로kyc-onboarding-v3
220개 이상 국가
  • ID Verification
  • Passive Liveness
  • Face Match 1:1
  • AML Screening
  • Device & IP Analysis
  • 주소 증명
  • NFC 읽기
  • 전화 인증
  • 지갑 심사
  • 맞춤 설문지
+ 15개 이상의 모듈 · 1,000개 이상의 데이터 소스$0.33/세션
03 · 웹훅 등록

모든 판결에 대해 하나의 웹훅 대상을 구성하세요.

  • 비즈니스 콘솔에서: 웹훅 Uniform Resource Locator (URL)을 추가하고, 이벤트를 선택하고, Didit이 생성하는 서명 비밀을 복사하세요.
  • API를 통해: label, url, subscribed_events와 함께 POST /v3/webhook/destinations/를 호출하세요. 응답은 Didit이 모든 전송에 서명하는 데 사용하는 secret_shared_key를 반환합니다.
웹훅 대상 생성 API
REST · OpenAPI 3
docs.didit.me
  • POST/v3/session/
  • GET/v3/session/{id}/decision/
  • PATCH/v3/session/{id}/update-status/
  • GET/v3/session/{id}/generate-pdf
  • POST/v3/lists/{id}/entries/face-upload/
  • POST/v3/transactions/

모든 엔드포인트 개방 · 모든 웹훅 HMAC 서명됨.

04 · 앱에 통합

세션을 생성하세요 — 소프트웨어 개발 키트(SDK) 또는 직접 API.

  • Software Development Kit (SDK)를 통해: 웹, iOS, Android, React Native 또는 Flutter용 네이티브 SDK를 드롭인하세요. — 기본적으로 동일한 /v3/ 계약입니다.
  • API를 통해: workflow_idvendor_data 값(사용자 식별자)과 함께 POST /v3/session/을 호출하세요.

응답은 앱에서 리디렉션하거나 삽입할 확인 URL을 제공합니다.

SDK 보기
POSThttps://verification.didit.me/v3/session/
curl
$ curl -X POST /v3/session/ \
  -H "x-api-key: $DIDIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "workflow_id": "3daf4c64-...",
    "vendor_data": "u_42",
    "콜백": "https://acme.com/webhook"
  }'
201생성됨
{ "세션_ID": "4c5c7f3a-...", "URL": "verify.didit.me/..." }
05 · 판정 받기

웹훅을 수신하거나 폴링하세요.

  • 실시간 웹훅: 모든 상태 변경 시 엔드포인트가 실행됩니다. status("Approved", "Declined", "In Review", "Resubmitted", …)를 읽고 데이터베이스를 업데이트한 다음 배송합니다.
  • 폴링 방식: GET /v3/session/:session_id/decision/을 호출하여 동일한 페이로드를 가져옵니다. 스택이 인바운드 트래픽을 수락할 수 없을 때 유용합니다.

상태 문자열은 정확하며 대소문자를 구분합니다. 전체 상태 머신은 docs.didit.me/integration/verification-statuses를 참조하십시오.

인증 상태
이벤트
live
  • session.verified2.4s ago200 OK
  • session.review_started12s ago200 OK
  • session.aml_hit1m ago200 OK
  • session.declined3m ago200 OK
Didit으로 구축

모든 표면, 공개. 영업 전화 없음.

문서를 읽고, Application Programming Interface (API)를 호출하고, Model Context Protocol (MCP) 서버에 연결하고, 통합 프롬프트를 붙여넣거나, 미리 구축된 에이전트 기술을 배포하세요. — 모두 공개, 모두 무료.
문서

모든 모듈, 엔드포인트 및 웹훅을 찾으세요.

빠른 시작

5분 안에 KYC 플로우를 출시하세요.

API 참조

OpenAPI 3.1 사양을 읽어보세요.

SDK

웹, iOS, Android, React Native 또는 Flutter에 임베드하세요.

웹훅

모든 상태 변경에 대해 HMAC 서명 이벤트를 수신합니다.

인증 상태

전체 세션 상태 머신을 읽어보세요.

통합 프롬프트

하나의 프롬프트를 붙여넣으세요. KYC 통합을 출시하세요.

MCP 서버

Didit을 모든 MCP 클라이언트에 연결하세요.

에이전트 스킬

사전 구축된 인증, AML 및 KYB 스킬.

5분 통합

하나의 curl. 다섯 개의 SDK.

하나의 curl로 인증 세션을 시작하거나, 웹, iOS, Android, React Native 또는 Flutter에 플로우를 임베드하세요 — 동일한 /v3/ 계약이 기반입니다.
POSThttps://verification.didit.me/v3/session/
curl
$ curl -X POST /v3/session/ \
  -H "x-api-key: $DIDIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "workflow_id": "3daf4c64-...",
    "vendor_data": "u_42",
    "콜백": "https://acme.com/webhook"
  }'
201생성됨
{ "세션_ID": "4c5c7f3a-...", "URL": "verify.didit.me/..." }
Webv1.4.0iOSv3.0.1Androidv2.6.2
React Nativev1.8.0Flutterv1.3.4
개발자를 위해 · AI 에이전트를 위해 · 개방형 설계

개발자 및 AI 에이전트용으로 구축되었습니다.

하나의 Application Programming Interface (API)로 Didit 신원 및 사기 확인을 통합하세요. 샌드박스를 열고, 공개 문서를 읽고, Model Context Protocol (MCP) 서버에 연결하거나, 모든 스택에 대한 Software Development Kit (SDK)를 가져오세요. 개발자는 오후에 배포하고, AI 코딩 에이전트는 하나의 프롬프트로 배포합니다. — UI 없음, 사람 개입 없음, 영업 전화 없음, 최소 요구 사항 없음.
01 · 단일 API

신원 및 사기를 위한 단일 API.

단일 API(Application Programming Interface)는 모든 신원 및 사기 확인(KYC, KYB, AML, 거래 모니터링, 생체 인식 매칭)을 처리합니다. 동일한 키, 동일한 워크플로 엔진을 단일 세션에서 연결할 수 있으며, 제품 간 추가 통합 작업이 필요 없습니다.
API 문서 읽기
POSThttps://verification.didit.me/v3/session/
curl
$ curl -X POST /v3/session/ \
  -H "x-api-key: $DIDIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "workflow_id": "3daf4c64-...",
    "vendor_data": "u_42",
    "콜백": "https://acme.com/webhook"
  }'
201생성됨
{ "세션_ID": "4c5c7f3a-...", "URL": "verify.didit.me/..." }
02 · 에이전트 네이티브

단일 프롬프트로 통합하세요.

저희 MCP(Model Context Protocol) 서버가 활성화되었고 에이전트 스킬이 게시되었습니다. Claude Code, Codex 또는 Cursor에게 Didit 통합을 요청하면 에이전트가 작업 공간을 생성하고 워크플로를 구성하며 첫 번째 API 호출을 자체적으로 수행합니다. 대시보드, 사람, 지원 티켓이 필요 없습니다.
통합 프롬프트 읽기
promptdidit-integration.md
# Integrate Didit into my application

You are integrating Didit — infrastructure for identity and fraud — into my application end-to-end. Didit ships KYC, KYB, AML screening, biometric verification, transaction monitoring, and wallet screening behind one API. 220+ countries, 14,000+ document types, 48+ languages. Pay-per-call from $0.33, 500 free verifications per core feature per month, no minimums, no contract.

## My application context

<my_stack>
Stack: [framework + language — e.g. Next.js 15 + TypeScript, Django, Rails, Go]
Surface: [web | iOS | Android | React Native | Flutter | backend-only]
Use case: [KYC at signup | KYB at business onboarding | age gate | re-auth | transaction monitoring | other]
Database: [Postgres | MySQL | Mongo | other]
</my_stack>

## Step 1 — Create the Didit account programmatically

Two API calls. No browser. No 2FA. Returns an `api_key` you use for every subsequent request.

```bash
# 1) Register — creates org + app + emails a 6-character code
curl -X POST https://apx.didit.me/auth/v2/programmatic/register/   -H "Content-Type: application/json"   -d '{"email": "dev@example.com", "password": "StrongP@ss1"}'

# 2) Verify email with the code from the inbox — returns api_key
curl -X POST https://apx.didit.me/auth/v2/programmatic/verify-email/   -H "Content-Type: application/json"   -d '{"email": "dev@example.com", "code": "A3K9F2"}'
# Response.application.api_key — save this
```

Persist the returned `api_key` as the env var `DIDIT_API_KEY`. Auth header for every Didit call:
`x-api-key: $DIDIT_API_KEY`

## Base URLs

| Surface | Base URL |
|---|---|
| Every `/v3/...` endpoint (sessions, workflows, lists, billing, webhook destinations, entities, transactions, standalone APIs) | `https://verification.didit.me` |
| Auth / programmatic registration (`/auth/v2/programmatic/...`) | `https://apx.didit.me` |
| Console (human UI) | `https://business.didit.me` |
| Hosted verification URL handed to end users | `https://verify.didit.me` |
| Docs (cross-check anything) | `https://docs.didit.me` |
| OpenAPI spec (machine-readable, server is `https://verification.didit.me`) | `https://docs.didit.me/openapi-25.json` |

## Step 2 — Choose the integration approach

Pick exactly one, based on my use case:

- **Approach A — Sessions API + SDK (recommended for any end-user verification flow).** My backend creates a Didit session → my frontend opens the Didit-hosted verification UI (via SDK / iframe / redirect) → user completes verification → my backend receives a webhook with the decision. Best for KYC at signup, KYB at business onboarding, age verification, re-auth. Didit-hosted flows are A/B-tested and convert higher than custom UIs.
- **Approach B — Standalone APIs (server-to-server only).** My backend calls individual modules directly (`/v3/id-verification/`, `/v3/aml/`, `/v3/face-match/`, etc.) for batch jobs or fully custom UI. Best for back-office verification pipelines.

If unsure, default to Approach A.

## Step 3 — Create or reuse a workflow

A workflow defines which modules run during a session. Create one via API (or `https://business.didit.me` → Workflows → Create).

```bash
# List existing workflows
curl https://verification.didit.me/v3/workflows/   -H "x-api-key: $DIDIT_API_KEY"

# Create a new KYC workflow — features are UPPERCASE enum values, each an object with optional `config`
curl -X POST https://verification.didit.me/v3/workflows/   -H "x-api-key: $DIDIT_API_KEY"   -H "Content-Type: application/json"   -d '{
    "workflow_label": "Standard KYC",
    "features": [
      { "feature": "OCR" },
      { "feature": "LIVENESS", "config": { "face_liveness_method": "PASSIVE" } },
      { "feature": "FACE_MATCH" },
      { "feature": "IP_ANALYSIS" }
    ]
  }'
# Response.uuid — save as DIDIT_WORKFLOW_ID
```

Feature enum values (UPPERCASE, source: `management-api/workflows/feature-configs.mdx`):
- **KYC features:** `OCR`, `NFC`, `LIVENESS`, `FACE_MATCH`, `AGE_ESTIMATION`, `PHONE_VERIFICATION`, `EMAIL_VERIFICATION`, `DATABASE_VALIDATION`, `AML`, `IP_ANALYSIS`, `PROOF_OF_ADDRESS`, `QUESTIONNAIRE`.
- **KYB features:** `KYB_REGISTRY`, `KYB_DOCUMENTS`, `KYB_KEY_PEOPLE` (each plus AML / DATABASE_VALIDATION as needed).

For a KYB workflow set `"workflow_type": "kyb"` (default is KYC). A workflow is locked to its type at creation; create separate workflows per kind.

## Step 4 — Install the SDK that matches my stack

| Stack | Package | Install |
|---|---|---|
| Web (React, Vue, Next.js, Nuxt, Svelte, vanilla JS) | `@didit-protocol/sdk-web` | `npm install @didit-protocol/sdk-web` |
| iOS (Swift / SwiftUI) | `didit-sdk-ios` | SPM: `https://github.com/didit-protocol/didit-sdk-ios` |
| Android (Kotlin / Jetpack Compose) | `me.didit:didit-sdk` | Maven |
| React Native (Expo or bare) | `@didit-protocol/sdk-react-native` | `npm install @didit-protocol/sdk-react-native` |
| Flutter | `didit_sdk` | `flutter pub add didit_sdk` |
| Backend-only / batch / custom UI | none — call REST directly | — |

Always prefer native iOS / Android SDKs over WebView on mobile (NFC + camera + biometrics work natively).

## Step 5 — Create a session and present it to the user

**Backend creates the session:**

```bash
curl -X POST https://verification.didit.me/v3/session/   -H "x-api-key: $DIDIT_API_KEY"   -H "Content-Type: application/json"   -d '{
    "workflow_id": "'"$DIDIT_WORKFLOW_ID"'",
    "vendor_data": "internal-user-id",
    "callback": "https://myapp.com/done"
  }'
```

Response (201 Created):
```json
{
  "session_id": "4c5c7f3a-...",
  "session_token": "eyJ...",
  "url": "https://verify.didit.me/session/...",
  "status": "Not Started",
  "session_kind": "user",
  "workflow_id": "...",
  "vendor_data": "internal-user-id"
}
```

`vendor_data` is **my internal user ID** — Didit links the session to a User entity (auto-created if new). For KYB workflows it links to a Business entity.

Optional create-session field: `callback_method` (`"initiator"` | `"completer"` | `"both"`, default `"initiator"`) — controls which side of a cross-device flow receives the `callback` redirect. Useful when the verification opens on a phone after a desktop start.

**Frontend presents the verification (pick one):**

| Pattern | Code |
|---|---|
| Web JS SDK (modal) | `import { DiditSdk } from "@didit-protocol/sdk-web"; DiditSdk.shared.startVerification({ url })` |
| Iframe (embedded) | `<iframe src={url} allow="camera; microphone; fullscreen; autoplay; encrypted-media" />` |
| Redirect (cross-device) | `window.location.href = url` |
| iOS / Android / RN / Flutter | `DiditSdk.startVerification(token: session_token)` |

## Step 6 — Set up the webhook to receive results

Build `POST /api/webhooks/didit` in my backend.

**Register the webhook destination once:**

```bash
curl -X POST https://verification.didit.me/v3/webhook/destinations/   -H "x-api-key: $DIDIT_API_KEY"   -H "Content-Type: application/json"   -d '{
    "url": "https://myapp.com/api/webhooks/didit",
    "label": "production",
    "subscribed_events": ["status.updated", "data.updated"]
  }'
```

Response includes `secret_shared_key` — save as `DIDIT_WEBHOOK_SECRET`.

**Cloudflare / restrictive firewall users:** allowlist `18.203.201.92` — Didit webhooks egress from this single IP.

**Three signature headers** ship on every webhook. Verify **one** — `X-Signature-V2` is recommended because it survives JSON middleware re-encoding:

| Header | What it signs | When to use |
|---|---|---|
| `X-Signature-V2` ★ recommended | `JSON.stringify(sortKeys(shortenFloats(parsed_body)))` with unescaped Unicode | Default — works through Express / Django / FastAPI / Next.js body parsers |
| `X-Signature` | The raw request bytes verbatim | Only if you can guarantee no middleware re-encodes the body |
| `X-Signature-Simple` | `"{timestamp}:{session_id}:{status}:{webhook_type}"` | Fallback when nothing else works — does NOT verify the `decision` payload, so only use as a hint |

**Endpoint requirements (in order):**

1. Parse JSON (V2 is parser-tolerant; you can use any framework's default body parser).
2. Read headers: `X-Signature-V2` (HMAC-SHA256 hex), `X-Timestamp` (Unix seconds).
3. Reject if `abs(now - X-Timestamp) > 300` (replay protection).
4. Apply `shortenFloats` (whole-number floats → integers), then `sortKeys` (recursive lexicographic), then `JSON.stringify` (unescaped Unicode — default).
5. Compute `expected = HMAC-SHA256(DIDIT_WEBHOOK_SECRET, canonical_json, "utf8")`.
6. Compare with `X-Signature-V2` using constant-time comparison (`hmac.compare_digest` in Python, `crypto.timingSafeEqual` in Node).
7. Dispatch on `webhook_type`. Return `200` immediately even if processing is async — Didit retries 5xx/404 twice (~1 min, ~4 min).

**Node.js / Next.js App Router example (canonical V2):**

```ts
import crypto from "node:crypto";

// Server-side normalisation: convert whole-number floats to integers.
function shortenFloats(v: unknown): unknown {
  if (Array.isArray(v)) return v.map(shortenFloats);
  if (v && typeof v === "object") {
    return Object.fromEntries(
      Object.entries(v as Record<string, unknown>).map(([k, x]) => [k, shortenFloats(x)])
    );
  }
  if (typeof v === "number" && !Number.isInteger(v) && v % 1 === 0) return Math.trunc(v);
  return v;
}

// Recursively sort object keys (arrays preserved in order).
function sortKeys(v: unknown): unknown {
  if (Array.isArray(v)) return v.map(sortKeys);
  if (v && typeof v === "object") {
    return Object.keys(v as object)
      .sort()
      .reduce<Record<string, unknown>>((acc, k) => {
        acc[k] = sortKeys((v as Record<string, unknown>)[k]);
        return acc;
      }, {});
  }
  return v;
}

export async function POST(req: Request) {
  const raw = await req.text();
  const sig = req.headers.get("x-signature-v2") ?? "";
  const ts = Number(req.headers.get("x-timestamp"));
  if (!ts || Math.abs(Date.now() / 1000 - ts) > 300)
    return new Response("stale", { status: 401 });

  const parsed = JSON.parse(raw);
  const canonical = JSON.stringify(sortKeys(shortenFloats(parsed)));
  const expected = crypto
    .createHmac("sha256", process.env.DIDIT_WEBHOOK_SECRET!)
    .update(canonical, "utf8")
    .digest("hex");
  if (
    sig.length !== expected.length ||
    !crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(sig))
  )
    return new Response("bad sig", { status: 401 });

  // parsed.webhook_type → dispatch …
  return new Response("ok");
}
```

**Webhook event types:** `status.updated`, `data.updated`, `user.status.updated`, `user.data.updated`, `business.status.updated`, `business.data.updated`, `activity.created`, `transaction.created`, `transaction.status.updated`.

**Webhook body shape:**
```json
{
  "session_id": "uuid",
  "status": "Not Started | In Progress | Awaiting User | In Review | Approved | Declined | Resubmitted | Abandoned | Expired | Kyc Expired",
  "webhook_type": "status.updated",
  "timestamp": 1627680000,
  "workflow_id": "uuid",
  "vendor_data": "internal-user-id",
  "metadata": { "any": "json" },
  "decision": { /* present when Approved / Declined / In Review; absent on Expired / Abandoned / Not Started */ }
}
```

The `decision` object holds per-module **plural arrays** (V3 schema — each entry keyed by its `node_id` in the workflow):
- `id_verifications[]`: first_name, last_name, document_type, document_number, date_of_birth, nationality, expiration_date, issuing_state, address, parsed_address, mrz, front_image_quality_score, back_image_quality_score, warnings[]
- `nfc_verifications[]`: status, document_type, mrz, signature_status, chip_data
- `liveness_checks[]`: status, score (0–1), method ("passive" | "active"), reference_image
- `face_matches[]`: status, score (0–100), source_image, target_image, warnings[]
- `phone_verifications[]`: status, phone_number, carrier, is_disposable, is_virtual
- `email_verifications[]`: status, email, is_breached, is_disposable, is_undeliverable, breaches[]
- `poa_verifications[]`: status, document_type, issuer, poa_address, poa_parsed_address, issue_date, expiration_date
- `aml_screenings[]`: status, total_hits, hits[] (pep_matches, sanction_matches, warning_matches, adverse_media_matches), entity_type ("person" | "company")
- `ip_analyses[]`: status, ip_address, country, vpn, proxy, tor, hosting, risk_score
- `database_validations[]`: status, provider, match_type, fields_matched
- `questionnaire_responses`: nullable object keyed by question_id → answer

V2 → V3 migration note: V2 used singular keys (`aml`, `phone`, `email`, `poa`). V3 renamed them to plural arrays so a single workflow can run the same module multiple times on different nodes — index by `node_id`.

## Step 7 — Apply the decision to my database

```ts
switch (event.status) {
  case "Approved":       user.verified = true; user.verifiedAt = new Date(); storeDecision(event.decision); break;
  case "Declined":       user.verificationStatus = "declined"; logWarnings(event.decision); break;
  case "In Review":      user.verificationStatus = "pending_review"; break;
  case "In Progress":    user.verificationStatus = "in_progress"; break;
  case "Awaiting User":  user.verificationStatus = "awaiting_user"; break; // KYB only — waiting for a UBO / officer KYC sub-session
  case "Resubmitted":    user.verificationStatus = "resubmitted"; break; // reviewer asked the user to retry
  case "Abandoned":      scheduleReminderEmail(user); break;
  case "Expired":        break; // session URL aged out before the user finished
  case "Kyc Expired":    user.verified = false; createNewSession(user); break; // verified user's KYC has aged out per retention policy
  case "Not Started":    break;
}
```

Idempotency:
- Session webhooks: dedupe on `session_id + webhook_type + timestamp`.
- Transaction webhooks (`transaction.created`, `transaction.status.updated`): dedupe on the `event_id` field — multiple events can target the same transaction.

Didit retries 5xx/404 twice (~1 min, ~4 min after the prior failure). Return 200 even if processing is async.

## Module catalogue (use whichever ones match my use case)

| Module | Endpoint | Price | Free tier |
|---|---|---|---|
| Core KYC bundle (ID + Liveness + Face Match + IP) | session w/ workflow | **$0.33** | 500/mo (per feature) |
| ID Verification (standalone) | `POST /v3/id-verification/` | $0.20 | 500/mo |
| Passive Liveness (standalone) | `POST /v3/passive-liveness/` | $0.05 | 500/mo |
| Active Liveness | session-only | $0.15 | — |
| Face Match 1:1 | `POST /v3/face-match/` | $0.05 | 500/mo |
| Face Search 1:N | `POST /v3/face-search/` | $0.05 | — |
| Age Estimation | `POST /v3/age-estimation/` | $0.10 | — |
| AML Screening | `POST /v3/aml/` | $0.20 | — |
| Ongoing AML Monitoring | org-level continuous (per active user/yr) | $0.07 / user / year | — |
| Database Validation (gov registries) | `POST /v3/database-validation/` | variable | — |
| Proof of Address | `POST /v3/poa/` | $0.20 | — |
| Email Verification | `POST /v3/email/send/` + `POST /v3/email/check/` | $0.03 | — |
| Phone Verification (SMS / WhatsApp / voice / RCS / Telegram) | `POST /v3/phone/send/` + `POST /v3/phone/check/` | $0.04 + carrier | — |
| NFC Verification (native SDKs only) | session module | $0.15 | — |
| Biometric Authentication (re-auth) | session module | $0.10 | — |
| Device & IP Analysis | session module | $0.03 | — |
| Custom Questionnaire | session module | $0.10 | — |
| Business Verification (KYB) | `POST /v3/session/` w/ KYB workflow | $2.00 | — |
| Company AML Screening | KYB module | $0.20 | — |
| Person AML (per UBO / officer) | KYB module | $0.20 | — |
| Transaction Screening (rule engine) | `POST /v3/transactions/` | $0.02 / tx | — |
| AML Transaction Screening (counterparty sanctions + on-chain wallet risk) | inside `/v3/transactions/` | $0.15 / tx | — |
| Reusable KYC (share verified user across partners) | session feature | Free | — |
| White Label | workflow option | $0.20 | — |

## Operational APIs your code should know

| Action | Endpoint |
|---|---|
| Read full decision JSON | `GET /v3/session/{id}/decision/` |
| List sessions (filter by status, workflow, vendor_data, date) | `GET /v3/sessions` |
| Manually approve / decline / request review | `PATCH /v3/session/{id}/update-status/` |
| Patch metadata or extracted data | `PATCH /v3/session/{id}/update-data/` |
| Download compliance PDF | `GET /v3/session/{id}/generate-pdf` |
| Delete a session (GDPR / cleanup) | `DELETE /v3/session/{id}/delete/` |
| Share session with a partner (Reusable KYC) | `POST /v3/session/{id}/share/` |
| Submit a transaction for monitoring | `POST /v3/transactions/` |
| List / create lists (blocklist, allowlist, custom) | `GET/POST /v3/lists/` |
| Add entry to a list | `POST /v3/lists/{id}/entries/` |
| Upload a face image to a blocklist | `POST /v3/lists/{id}/entries/face-upload/` |
| Check credit balance | `GET /v3/billing/balance/` |
| Top up credits (returns Stripe checkout URL) | `POST /v3/billing/top-up/` |
| List / update / delete vendor users | `GET/PATCH /v3/users/`, `/v3/users/{vendor_data}/` |
| List / update / delete vendor businesses | `GET/PATCH /v3/businesses/` |

Every `/v3/...` endpoint above is served from `https://verification.didit.me` (the canonical OpenAPI server) and authenticates with `x-api-key`. Auth/registration is the only surface on `https://apx.didit.me`.

## Best-practice checklist before you mark this done

- [ ] `DIDIT_API_KEY`, `DIDIT_WORKFLOW_ID`, `DIDIT_WEBHOOK_SECRET` in env. Never committed.
- [ ] Backend route that creates a session for a given user, returns `url` (the hosted verification URL on `verify.didit.me`) and the `session_id`.
- [ ] Frontend that opens the session `url` via the right SDK / iframe / redirect for my stack.
- [ ] Webhook endpoint with: `X-Timestamp` freshness check (≤ 300s), canonical-V2 JSON re-serialisation (`shortenFloats` → `sortKeys` → unescaped `JSON.stringify`) HMAC-SHA256, constant-time compare against `X-Signature-V2`, dispatch on `webhook_type`, return 200.
- [ ] DB schema + update logic for `status in (Not Started, In Progress, Awaiting User, In Review, Approved, Declined, Resubmitted, Abandoned, Expired, Kyc Expired)`.
- [ ] Idempotent webhook handler (dedupe on `session_id + webhook_type`).
- [ ] No API key shipped to the browser. The session creation is server-side only.
- [ ] User-facing consent / disclosure shown BEFORE the session `url` opens (Didit handles biometric consent inside its flow but the legal layer outside is the integrator's responsibility).
- [ ] (Optional) `/v3/session/{id}/generate-pdf` surfaced in compliance UI.

## When you need more detail

- API root: `https://verification.didit.me/v3/` (everything `/v3/`). Auth only: `https://apx.didit.me/auth/v2/programmatic/register/`.
- Sessions overview: `https://docs.didit.me/sessions-api/overview`
- Standalone APIs index: `https://docs.didit.me/standalone-apis/id-verification`
- Programmatic registration: `https://docs.didit.me/integration/programmatic-registration`
- AI agent / MCP integration: `https://docs.didit.me/integration/ai-agent-integration`
- Webhooks reference: `https://docs.didit.me/integration/webhooks`
- SDKs overview: `https://docs.didit.me/integration/sdks`
- Full OpenAPI 3 spec: `https://docs.didit.me/openapi-25.json`
- MCP server config (drop into `.cursor/mcp.json`, `claude_desktop_config.json`, or equivalent):

```json
{
  "mcpServers": {
    "didit": {
      "command": "npx",
      "args": ["@didit-protocol/mcp-server"],
      "env": { "DIDIT_API_KEY": "your_api_key" }
    }
  }
}
```

The MCP server exposes 40+ tools spanning auth, sessions, workflows, questionnaires, users, billing, blocklist, and every standalone API — see `https://docs.didit.me/integration/ai-agent-integration` for the full tool catalogue.

Now build the integration. If anything in `## My application context` is missing, ask once at the top of your reply, then ship the complete change set: env vars wired, backend route, frontend SDK call, webhook endpoint with signature verification, decision-handling DB logic, and idempotent dedupe. Use my stack's idioms (`fetch` / `axios` / `requests` / `okhttp`), keep the API key server-side only, and follow the verification status state machine above.
Claude Code, Codex 또는 Cursor에 붙여넣기 · 전체 통합 제공
03 · 모듈형

어떤 흐름이든. 어떤 국가든. 어떤 사용 사례든.

25개 이상의 모듈, 1,000개 이상의 정부 데이터 소스, 220개 이상의 국가, 14,000개 이상의 문서 유형, 48개 이상의 언어로 어떤 흐름이든 구성할 수 있습니다. 동일한 오케스트레이터가 생체 인식 인증, 네오뱅크를 위한 KYC, B2B 핀테크를 위한 KYB, 암호화폐 거래소를 위한 Travel Rule, 또는 마켓플레이스를 위한 지속적인 AML을 실행합니다. 확인 사항과 순서를 선택하세요.
모든 모듈 보기
워크플로kyc-onboarding-v3
220개 이상 국가
  • ID Verification
  • Passive Liveness
  • Face Match 1:1
  • AML Screening
  • Device & IP Analysis
  • 주소 증명
  • NFC 읽기
  • 전화 인증
  • 지갑 심사
  • 맞춤 설문지
+ 15개 이상의 모듈 · 1,000개 이상의 데이터 소스$0.33/세션
04 · 셀프 서비스

유료화 없음. 영업 전화 없음. 마음껏 사용해 보세요.

샌드박스는 처음부터 열려 있습니다. 문서와 API는 공개되어 있으며, 코드와 사용자 사이에 데모 게이트가 없습니다. 가입하고 키를 받아 당일 바로 배포하세요. 저희 영업팀은 원할 때 언제든지 도움을 드릴 수 있으며, 결코 방해가 되지 않습니다.
샌드박스 사용해 보기
프로덕션 API 키
라이브
didit_sk_live_8f4c2a…9bf3

방금 발급됨 — 카드, 계약, 통화 없음.

  • 최소 없음
  • 계약 없음
  • 월 500회 무료
  • 오픈 샌드박스
05 · 사용량 기반

사용한 만큼만 지불하세요. 그게 전부입니다.

Didit은 기존 KYC 공급업체보다 3~5배 저렴하며, 모든 가격은 /pricing에 공개되어 있습니다. 전체 KYC 번들 $0.33, 지갑 심사 $0.15, 장치 및 IP 분석 $0.03, 매월 500회 무료 인증. 최소 요금, 연간 계약, 초과 요금 없음. 페이지에 표시된 가격이 청구서의 가격입니다.
모든 가격 보기
공개 가격표
/pricing
  • ID Verification$0.15
  • Passive Liveness$0.10
  • Face Match 1:1$0.05
  • AML Screening$0.20
  • Device & IP Analysis$0.03
  • 지갑 심사 (KYT)$0.15
전체 KYC 번들$0.33

월 500회 무료 · 최소 없음 · 연간 계약 없음.

06 · 개방형 인프라

개방형 API. 그 위에 구축하세요.

모든 엔드포인트는 개방되어 있으며 문서화되어 있습니다. 세션 상태 변경, 얼굴 블랙리스트 추가, 결정 PDF 다운로드, 워크플로 편집 또는 이벤트 로그 쿼리 등이 가능합니다. 웹훅은 HMAC(Hash-based Message Authentication Code)로 서명되어 모든 이벤트가 당사에서 발생했음을 증명할 수 있습니다. Didit은 폐쇄형 앱이 아닌 인프라입니다.
API 찾아보기
REST · OpenAPI 3
docs.didit.me
  • POST/v3/session/
  • GET/v3/session/{id}/decision/
  • PATCH/v3/session/{id}/update-status/
  • GET/v3/session/{id}/generate-pdf
  • POST/v3/lists/{id}/entries/face-upload/
  • POST/v3/transactions/

모든 엔드포인트 개방 · 모든 웹훅 HMAC 서명됨.

07 · SDK

모든 플랫폼을 위한 SDK.

모든 스택(웹, iOS, Android, React Native, Flutter)을 위한 소프트웨어 개발 키트(SDK)를 제공합니다. 백엔드에는 REST API, 서명된 웹훅, OpenAPI 3 사양, 그리고 즉시 사용 가능한 Zapier, Shopify, Salesforce 통합 기능이 있습니다. 모든 인터페이스에는 샘플, 유형, 5분 만에 시작할 수 있는 가이드가 함께 제공됩니다.
SDK 찾아보기
Webv1.4.0iOSv3.0.1Androidv2.6.2
React Nativev1.8.0Flutterv1.3.4
08 · 규모에 최적화된 인프라

시장 내 가장 빠른 인증.

인증의 99%가 2초 이내에 엔드투엔드로 완료됩니다. 이는 발표 자료에서 주장하는 것이 아니라 실제 운영 환경에서 측정된 결과입니다. 당사는 99.99%의 서비스 수준 협약(SLA)을 목표로 하며, 지난 12개월 동안 100% 가동 시간을 유지했고, 한 번도 침해된 적이 없습니다. iPhone, Android, 데스크톱, 태블릿, 5G 또는 2G 등 모든 장치 및 네트워크에 최적화되어 있으며, 이미 매월 수백만 건의 인증을 처리하고 있습니다.
실시간 상태 보기
종단 간 지연 시간 · 30일
99.99% SLA
  • p500.82s
  • p951.42s
  • p991.89s

시장 내 가장 빠른 인증 · iPhone, Android, 데스크톱, 태블릿, 5G 또는 2G.

세 가지 티어, 하나의 가격표

무료로 시작하세요. 사용량에 따라 지불하세요. 엔터프라이즈로 확장하세요.

매월 500회 무료 인증, 영원히. 프로덕션용 종량제. 엔터프라이즈에서는 맞춤형 계약, 데이터 상주 및 SLA(서비스 수준 계약)를 제공합니다.
무료

무료

월 $0. 신용 카드 필요 없음.

  • 무료 KYC 번들 (ID 확인 + 수동 라이브니스 + 얼굴 매칭 + 장치 및 IP 분석) — 매월 500회
  • 차단된 사용자
  • 중복 감지
  • 모든 세션에서 200개 이상의 사기 신호
  • Didit 네트워크 전반에 걸쳐 재사용 가능한 KYC
  • 사례 관리 플랫폼
  • 워크플로우 빌더
  • 공개 문서, 샌드박스, SDK, MCP(모델 컨텍스트 프로토콜) 서버
  • 커뮤니티 지원
가장 인기 있는
사용량에 따라 지불

사용량 기반

사용한 만큼만 지불하세요. 25개 이상의 모듈. 공개된 모듈별 가격, 월 최소 요금 없음.

  • $0.33에 전체 KYC (ID + 생체 인식 + IP / 장치)
  • 10,000개 이상의 AML 데이터 세트 — 제재, PEP, 불리한 미디어
  • 데이터베이스 유효성 검사를 위한 1,000개 이상의 정부 데이터 소스
  • 거래당 $0.02의 거래 모니터링
  • 기업당 $2.00의 실시간 KYB
  • 확인당 $0.15의 지갑 스크리닝
  • 화이트 라벨 인증 흐름 — 귀사의 브랜드, 당사의 인프라
엔터프라이즈

엔터프라이즈

맞춤형 MSA 및 SLA. 대량 및 규제 프로그램용.

  • 연간 계약
  • 맞춤형 MSA, DPA 및 SLA
  • 전용 Slack 및 WhatsApp 채널
  • 주문형 수동 검토자
  • 리셀러 및 화이트 라벨 조건
  • 독점 기능 및 파트너 통합
  • 지정된 CSM, 보안 검토, 규정 준수 지원

무료로 시작 → 검사가 실행될 때만 지불 → 맞춤형 계약, SLA 또는 데이터 상주를 위해 엔터프라이즈 잠금 해제.

FAQ

개발자 질문, 답변.

통합 통화 중에 엔지니어링 팀에 보내는 것과 동일한 답변입니다. 다른 문의 사항은 support@didit.me로 보내주세요.
Didit은 어떻게 통합하나요?

가입부터 첫 판정까지 5단계.

  • business.didit.me에서 계정을 생성하거나 POST https://apx.didit.me/auth/v2/programmatic/register/를 호출합니다.
  • 비즈니스 콘솔에서 워크플로우를 구축하거나 POST /v3/workflows/를 호출합니다.
  • 콘솔을 통해 웹훅 대상을 등록하거나 POST /v3/webhook/destinations/를 호출합니다(Didit은 응답에서 서명 비밀을 반환합니다).
  • workflow_idvendor_data(사용자 식별자)를 전달하여 POST /v3/session/으로 세션을 생성합니다. 사용자를 반환된 URL로 리디렉션하거나 동일한 /v3/ 계약에 기본 소프트웨어 개발 키트(SDK)를 삽입합니다.
  • 서명된 웹훅에서 판정을 수신하거나 GET /v3/session/:session_id/decision/을 폴링합니다.

하나의 /v3/ 애플리케이션 프로그래밍 인터페이스(API)는 고객 알기(KYC), 사업체 알기(KYB), 거래 모니터링 및 지갑 심사(KYT — 거래 알기)를 처리합니다. 매월 500회 무료 확인, 영구적으로, 신용 카드 필요 없음.

지금 바로 사용할 수 있는 샌드박스가 있나요?

예 — 60초 미만, 신용 카드 필요 없음. business.didit.me에 가입하거나(또는 POST https://apx.didit.me/auth/v2/programmatic/register/로 프로그래밍 방식으로 등록) 실제 애플리케이션 프로그래밍 인터페이스(API) 키가 있는 샌드박스 작업 공간으로 이동합니다.

  • 프로덕션과 동일한 형태 — 결정론적 결정, 모든 모듈 잠금 해제.
  • 실제 /v3/ 엔드포인트, 실제 웹훅, 실제 문서 샘플.
  • 준비되면 라이브로 전환 — 동일한 키, 동일한 Uniform Resource Locators (URLs), 동일한 계약.
어떤 소프트웨어 개발 키트(SDK)를 제공하나요?

5개의 퍼스트 파티 SDK, 모두 오픈 소스, 모두 공개 문서에 있습니다:

  • — JavaScript / TypeScript, 프레임워크에 구애받지 않음, iframe 임베드 또는 호스팅 흐름 리디렉션.
  • iOS — Swift, XCFramework로 배포.
  • Android — Kotlin, Maven Central을 통해.
  • React Native — 기본 모듈(TurboModules) 위에 TypeScript 바인딩.
  • Flutter — 동일한 기본 SDK를 감싸는 Dart 래퍼.

모든 SDK는 내부적으로 동일한 /v3/ 계약을 호출하므로, 웹은 사이트에, 네이티브는 모바일에 혼합하여 사용할 수 있습니다. 참조는 docs.didit.me/integration/web-sdks/overview에서 확인할 수 있습니다.

웹훅은 어떻게 작동하나요?

하나의 대상을 등록하면 Didit이 모든 전송에 서명합니다.

  • 비즈니스 콘솔을 통해 엔드포인트를 구성하거나 label, url, subscribed_events와 함께 POST /v3/webhook/destinations/를 호출합니다.
  • Didit은 응답에서 secret_shared_key를 반환합니다. 이를 사용하여 모든 수신 웹훅의 해시 기반 메시지 인증 코드(HMAC)-SHA256 서명(헤더: X-Signature-V2)을 확인합니다.
  • 각 페이로드는 정확하고 대소문자를 구분하는 status를 포함합니다 — "Approved", "Declined", "In Review", "Resubmitted" 등. 전체 상태 머신은 docs.didit.me/integration/verification-statuses에서 확인할 수 있습니다.
  • 재시도는 2xx를 반환할 때까지 지수 백오프를 사용합니다. 모든 전송은 기록되며 콘솔에서 요청 시 다시 재생할 수 있습니다.

전체 참조는 docs.didit.me/integration/webhooks에서 확인할 수 있습니다.

속도 제한은 어떻게 되며, 규모가 커지면 어떻게 되나요?

모든 플랜에 넉넉한 기본값이 제공되며, 계정별로 상향 조정됩니다.

  • 무료 티어 — 샌드박스 및 매월 500건의 프로덕션 검사, 영구적으로 제공.
  • 종량제 — 지속적인 볼륨에 따라 버스트 제한이 자동으로 확장됩니다. 출시 도중에 문제가 발생하지 않습니다.
  • 엔터프라이즈 — 마스터 서비스 계약(MSA)에 따라 맞춤형 속도 제한, 전용 용량 및 가동 시간 약정이 제공됩니다. support@didit.me로 문의하십시오.

status.didit.me에서 지역별 목표 용량을 확인하십시오. 매월 수백만 건의 인증에 걸쳐 지난 6개월 동안 100% 실제 가동 시간을 기록했습니다.

Claude Code, Cursor 또는 다른 AI 코딩 도구와 통합할 수 있나요?

예 — 프롬프트 하나를 붙여넣고 배포하세요. docs.didit.me/integration/integration-prompt의 표준 통합 프롬프트를 Claude Code, Cursor, Codex, Devin, Aider 또는 Replit Agent에 붙여넣으세요. 에이전트가 워크플로우를 프로비저닝하고, 웹훅을 연결하고, 엔드투엔드 스모크 테스트를 실행합니다.

에이전트가 시작한 세션은 직접 API 호출과 동일한 공개 가격을 지불합니다. 전체 Know Your Customer (KYC)당 $0.33, 독립형 신분증 확인당 $0.15, 지갑 심사당 $0.15입니다. 무료이며 추가 설정이 필요 없고, 모든 Model Context Protocol (MCP) 인식 클라이언트와 작동합니다.

변경 로그는 어디에 있으며, API 버전 관리는 어떻게 하나요?

`docs.didit.me/changelog`에서 매월 릴리스 노트를 확인하세요. — 배송된 모든 모듈, 추가된 모든 웹훅 이벤트, 모든 주요 변경 사항이 명시되어 있습니다.

  • docs.didit.me/openapi-25.jsonOpenAPI 3.1 사양은 문서와 함께 버전이 관리됩니다. Postman으로 가져오거나 모든 언어로 클라이언트를 생성할 수 있습니다.
  • 버전 관리는 기본적으로 추가적입니다. 새 필드, 새 선택적 매개변수 및 새 웹훅 이벤트는 버전 범프 없이 배송됩니다. 주요 변경 사항은 새 /v4/ 네임스페이스와 게시된 사용 중단 기간을 갖습니다.
  • 우리는 필드의 의미를 절대 조용히 변경하지 않습니다. — 판정 형태, 서명 체계 또는 상태 열거형이 변경되면 헤더 뒤에 배송되며 전환 전에 발표됩니다.
가동 시간을 모니터링하는 방법과 사고 처리 절차는 어떻게 되나요?

`status.didit.me`는 지역별 실시간 가동 시간 및 사고 이력을 게시합니다. — 인증, 웹훅, 콘솔, 문서. 로그인할 필요가 없습니다.

  • Really Simple Syndication (RSS), 이메일 또는 웹훅을 통해 중단 알림을 구독하세요.
  • 실적: 지난 6개월 동안 100% 실제 가동 시간; 서비스 수준 계약(SLA)에서 99.99% 가용성 목표.
  • 모든 사고는 동일한 페이지에 공개 사후 분석이 게시됩니다.
  • 엔터프라이즈 계약에는 지정된 온콜 엔지니어, 전용 Slack 또는 Microsoft Teams 공유 채널, 마스터 서비스 계약(MSA)에 따른 사고 심각도 서비스 수준 목표가 추가됩니다.

신원 및 사기 방지 인프라.

KYC, KYB, 거래 모니터링 및 지갑 심사를 위한 단일 API. 5분 안에 통합하세요.

AI에게 이 페이지를 요약해달라고 요청하세요