Skip to main content
Diditが750万ドルを調達、本人確認と不正対策のインフラを構築
Didit
開発者向け

本人確認と不正対策を
統合する最善の方法。

サンドボックスを開き、curlコマンドを1つ実行するだけで、5分でデプロイできます。公開ドキュメント、5つのSoftware Development Kit (SDK)、そしてAIコーディングエージェントがDiditを統合できるModel Context Protocol (MCP)サーバーを提供。フルKYCチェックは1回$0.33、毎月500回まで無料です。

支援元
Y CombinatorRobinhood Ventures
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.mePOST /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 · Webhookを登録

すべての判定結果に対し、単一のWebhook送信先を設定します。

  • ビジネスコンソールで: WebhookのUniform Resource Locator (URL)を追加し、イベントを選択し、Diditが生成する署名シークレットをコピーします。
  • APIで: labelurlsubscribed_eventsを指定してPOST /v3/webhook/destinations/を呼び出します。レスポンスには、Diditがすべての配信に署名するために使用するsecret_shared_keyが返されます。
Webhook宛先作成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/

すべてのエンドポイントがオープン · すべてのWebhookはHMAC署名済み。

04 · アプリに統合

セッションを作成します, SDKまたは直接APIで。

  • Software Development Kit (SDK)で: Web、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",
    "callback": "https://acme.com/webhook"
  }'
201作成済み
{ "session_id": "4c5c7f3a-...", "url": "verify.didit.me/..." }
05 · 判定結果を受け取る

Webhookをリッスンするか、ポーリングします。

  • リアルタイムWebhook: エンドポイントはすべてのステータス変更時に発火します。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)サーバーに接続し、統合プロンプトを貼り付けるか、事前に構築されたエージェントスキルをデプロイする, すべて公開されており、すべて無料です。
ドキュメント

すべてのモジュール、エンドポイント、Webhookを検索できます。

クイックスタート

5分でKYCフローを実装できます。

APIリファレンス

OpenAPI 3.1仕様書をご覧ください。

SDK

Web、iOS、Android、React Native、Flutterに組み込めます。

Webhook

すべての状態変化をHMAC署名付きイベントで受け取れます。

検証ステータス

セッションのステートマシン全体をご覧ください。

連携プロンプト

プロンプトを貼り付けるだけでKYC連携が完了します。

MCPサーバー

DiditをあらゆるMCPクライアントに接続できます。

エージェントスキル

検証、AML、KYBのスキルを事前に構築済みです。

5分で連携

1つのcURL。5つのSDK。

Web、iOS、Android、React Native、Flutterで、1つのcURLまたは組み込みフローで認証セッションを開始できます, 基盤となる`/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",
    "callback": "https://acme.com/webhook"
  }'
201作成済み
{ "session_id": "4c5c7f3a-...", "url": "verify.didit.me/..." }
Webv1.4.0iOSv3.0.1Androidv2.6.2
React Nativev1.8.0Flutterv1.3.4
開発者向け · AIエージェント向け · オープンな設計

開発者とAIエージェントのために構築。

Diditの本人確認と不正対策チェックを1つのApplication Programming Interface (API)で統合。サンドボックスを開き、公開ドキュメントを読み、Model Context Protocol (MCP)サーバーに接続するか、あらゆるスタックに対応するSoftware Development Kit (SDK)を導入してください。開発者は半日で、AIコーディングエージェントは1つのプロンプトでデプロイできます, UI不要、人間の介入不要、営業電話不要、最低利用料金もありません。
01 · 1つのAPI

本人確認と不正対策のための1つのAPI。

1つのApplication Programming Interface (API) で、本人確認と不正対策のあらゆるチェック(Know Your Customer (KYC)、Know Your Business (KYB)、Anti-Money Laundering (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",
    "callback": "https://acme.com/webhook"
  }'
201作成済み
{ "session_id": "4c5c7f3a-...", "url": "verify.didit.me/..." }
02 · エージェントネイティブ

単一のプロンプトで連携。

当社のModel Context Protocol (MCP) サーバーは稼働しており、エージェントスキルも公開されています。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、仮想通貨取引所のトラベルルール、マーケットプレイスの継続的な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のダウンロード、ワークフローの編集、イベントログのクエリなどが可能です。Webhookは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/

すべてのエンドポイントがオープン · すべてのWebhookはHMAC署名済み。

07 · SDK

あらゆるプラットフォームに対応するSDK。

Web、iOS、Android、React Native、Flutterなど、あらゆるスタックに対応するSDK(Software Development Kit)を提供しています。バックエンドには、REST API、署名付きWebhook、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(Service-Level Agreement)を目標とし、過去12ヶ月間100%の稼働率を維持しており、一度も侵害されたことはありません。iPhone、Android、デスクトップ、タブレット、5G、2Gなど、あらゆるデバイスとネットワークに最適化されており、すでに毎月数百万件の検証を実行しています。
ライブステータスを見る
エンドツーエンドのレイテンシー · 30日間
99.99% SLA
  • p500.82s
  • p951.42s
  • p991.89s

市場最速の認証 · iPhone、Android、デスクトップ、タブレット、5Gまたは2Gに対応。

3つのティア、1つの料金表

無料で開始。従量課金。エンタープライズまで対応。

毎月500回まで無料認証を永続的に提供。本番環境では従量課金。エンタープライズプランではカスタム契約、データレジデンシー、SLA(サービスレベルアグリーメント)に対応します。
無料

無料

月額$0。クレジットカード不要。

  • 無料KYCバンドル(本人確認 + パッシブ・ライブネス + 顔照合 + デバイス&IP分析), 毎月500回まで
  • ブロックリストユーザー
  • 重複検出
  • すべてのセッションで200以上の不正シグナル
  • Diditネットワーク全体でのKYC再利用
  • ケース管理プラットフォーム
  • ワークフロービルダー
  • 公開ドキュメント、サンドボックス、SDK、MCP (Model Context Protocol) サーバー
  • コミュニティサポート
最も人気
従量課金

従量課金

使った分だけお支払い。25以上のモジュール。モジュールごとの公開価格、月額最低料金なし。

  • フルKYC(本人確認 + 生体認証 + IP / デバイス)が$0.33
  • 10,000以上のAMLデータセット, 制裁、PEP、ネガティブ情報
  • データベース検証のための1,000以上の政府データソース
  • トランザクションモニタリングが1トランザクションあたり$0.02
  • ライブKYBが1企業あたり$2.00
  • ウォレットスクリーニングが1チェックあたり$0.15
  • ホワイトラベル検証フロー, あなたのブランド、私たちのインフラ
エンタープライズ

エンタープライズ

カスタムMSA & SLA。大量利用や規制対象プログラム向け。

  • 年間契約
  • カスタムMSA、DPA、SLA
  • 専用SlackおよびWhatsAppチャンネル
  • オンデマンドの手動レビュー担当者
  • リセラーおよびホワイトラベル条件
  • 限定機能とパートナー連携
  • 専任CSM、セキュリティレビュー、コンプライアンスサポート

無料で開始 → チェック実行時のみ支払い → カスタム契約、SLA、データレジデンシーが必要な場合はエンタープライズプランへ。

FAQ

開発者の疑問にお答えします。

連携時の技術的なご質問には、エンジニアリングチームが丁寧にお答えします。その他のご質問は support@didit.me まで。
How do I integrate Didit?

Five steps from signup to first verdict.

  • Create your account at business.didit.me, or call POST https://apx.didit.me/auth/v2/programmatic/register/.
  • Build a workflow in the Business Console, or call POST /v3/workflows/.
  • Register a webhook destination via the console, or call POST /v3/webhook/destinations/ (Didit returns the signing secret in the response).
  • Create a session with POST /v3/session/, passing workflow_id and vendor_data (your user identifier). Redirect the user to the returned URL, or drop in a native Software Development Kit (SDK) on the same /v3/ contract.
  • Receive the verdict on the signed webhook, or poll GET /v3/session/:session_id/decision/.

One /v3/ Application Programming Interface (API) covers Know Your Customer (KYC), Know Your Business (KYB), Transaction Monitoring, and Wallet Screening (KYT, know your transaction). 500 verifications free every month, forever, no credit card.

Is there a sandbox I can play with right now?

Yes, under sixty seconds, no credit card. Sign up at business.didit.me (or register programmatically with POST https://apx.didit.me/auth/v2/programmatic/register/) and you land in a sandbox workspace with a real Application Programming Interface (API) key.

  • Same shape as production, deterministic decisions, every module unlocked.
  • Real /v3/ endpoints, real webhooks, real document samples.
  • Switch to live whenever you are ready, same keys, same Uniform Resource Locators (URLs), same contract.
Which Software Development Kits (SDKs) do you ship?

Five first-party SDKs, all open-source, all on public docs:

  • Web, JavaScript / TypeScript, framework-agnostic, iframe embed or hosted-flow redirect.
  • iOS, Swift, distributed as XCFramework.
  • Android, Kotlin, via Maven Central.
  • React Native, TypeScript bindings on top of native modules (TurboModules).
  • Flutter, Dart wrapper around the same native SDKs.

Every SDK calls the same /v3/ contract under the hood, so you can mix and match, Web on your site, native on mobile. Reference at docs.didit.me/integration/web-sdks/overview.

How do webhooks work?

Register one destination; Didit signs every delivery.

  • Configure your endpoint via the Business Console, or call POST /v3/webhook/destinations/ with label, url, and subscribed_events.
  • Didit returns a secret_shared_key in the response. Use it to verify the Hash-based Message Authentication Code (HMAC)-SHA256 signature on every incoming webhook (header: X-Signature-V2).
  • Each payload carries an exact, case-sensitive status, "Approved", "Declined", "In Review", "Resubmitted", and more. Full state machine at docs.didit.me/integration/verification-statuses.
  • Retries use exponential backoff until you return 2xx; every delivery is logged and replayable on demand from the console.

Full reference at docs.didit.me/integration/webhooks.

What are the rate limits, and what happens at scale?

Generous defaults on every plan, tuned upward per account.

  • Free tier, sandbox plus 500 production checks every month, forever.
  • Pay-per-usage, burst limits scale automatically with sustained volume. You will not hit a wall mid-launch.
  • Enterprise, custom rate limits, dedicated capacity, and uptime commitments in the Master Services Agreement (MSA). Talk to us at support@didit.me.

Target capacity per region at status.didit.me. 100% real uptime over the last 6 months across millions of verifications a month.

Can I integrate with Claude Code, Cursor, or other AI coding tools?

Yes, paste one prompt and ship. Drop the canonical integration prompt at docs.didit.me/integration/integration-prompt into Claude Code, Cursor, Codex, Devin, Aider, or Replit Agent. The agent provisions the workflow, wires the webhook, and runs a smoke test end-to-end.

Agent-initiated sessions pay the same public price as direct API calls, $0.33 per full Know Your Customer (KYC), $0.15 per standalone Identity Document Verification, $0.15 per wallet screen. Free, no extra setup, works with any Model Context Protocol (MCP)-aware client.

Where is the changelog, and how do you version the API?

Monthly release notes at `docs.didit.me/changelog`, every shipped module, every webhook event added, every breaking change called out.

  • The OpenAPI 3.1 specification at docs.didit.me/openapi-25.json is versioned alongside the docs. Import it into Postman or generate clients in any language.
  • Versioning is additive by default. New fields, new optional parameters, and new webhook events ship without a version bump. Breaking changes get a new /v4/ namespace and a published deprecation window.
  • We never silently change a field's meaning, if a verdict shape, signature scheme, or status enum changes, it ships behind a header and is announced before cut-over.
How do I monitor uptime and what is the incident process?

`status.didit.me` publishes real-time uptime and incident history per region, verification, webhooks, console, docs. No login required.

  • Subscribe via Really Simple Syndication (RSS), email, or webhook for outage alerts.
  • Track record: 100% real uptime over the last 6 months; 99.99% availability target in the Service Level Agreement (SLA).
  • Every incident gets a public post-mortem on the same page.
  • Enterprise contracts add a named on-call engineer, a dedicated Slack or Microsoft Teams shared channel, and incident-severity Service Level Objectives in the Master Services Agreement (MSA).

本人確認と不正対策のインフラ。

KYC、KYB、取引監視、ウォレットスクリーニングを一つのAPIで。5分で統合できます。

AIにこのページの要約を依頼する