メインコンテンツにスキップ
Diditが200万ドルを調達し、Y Combinator (W26)に参加
Didit
開発者

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

サンドボックスを開き、1つのcurlを貼り付け、5分で出荷。公開ドキュメント、5つのSoftware Development Kit (SDK)、およびArtificial Intelligence (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 · ワークフローを構築

モジュールを選択します。ワークフローを構成します。

  • ビジネスコンソールで: Identity Document Verification、Passive Liveness、Face Match、Anti-Money Laundering (AML)、Wallet Screening、Internet Protocol (IP) Analysis、その他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/session
03 · Webhookを登録

すべての判定に対して1つのウェブフック送信先を設定します。

  • ビジネスコンソールで: Webhook Uniform Resource Locator (URL) を追加し、イベントを選択し、Diditが生成する署名シークレットをコピーします。
  • APIで: labelurlsubscribed_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/

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

04 · アプリに統合

セッションを作成します — Software Development Kit (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 · 判定を受け取る

ウェブフックをリッスンするか、ポーリングします。

  • リアルタイムウェブフック: エンドポイントはすべての状態変化で起動します。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署名付きイベントを受信します。

認証ステータス

完全なセッションステートマシンを読みます。

統合プロンプト

1つのプロンプトを貼り付けます。KYC統合を実装します。

MCPサーバー

Diditを任意のMCPクライアントに接続します。

エージェントスキル

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

5分で統合

1つのcurl。5つのSDK。

1つのcurlで検証セッションを開始するか、Web、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",
    "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つのアプリケーションプログラミングインターフェース (API) で、本人確認 (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",
    "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/session
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はHash-based Message Authentication Code (HMAC) で署名されているため、すべてのイベントが当社からのものであることを証明できます。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)。バックエンドには、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)を目標としており、過去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バンドル(ID検証 + パッシブ生体検知 + 顔照合 + デバイス&IP分析) — 毎月500回
  • ブロックリスト登録ユーザー
  • 重複検出
  • すべてのセッションで200以上の不正信号
  • Diditネットワーク全体でのKYCの再利用
  • ケース管理プラットフォーム
  • ワークフロービルダー
  • 公開ドキュメント、サンドボックス、SDK、MCP(Model Context Protocol)サーバー
  • コミュニティサポート
最も人気
従量課金

従量課金制

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

  • $0.33で完全なKYC(ID + 生体認証 + IP / デバイス)
  • 10,000以上のAMLデータセット — 制裁、PEPs、ネガティブメディア
  • データベース検証のための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/契約でネイティブSoftware Development Kit (SDK) をドロップインします。
  • 署名付きウェブフックで判定を受信するか、GET /v3/session/:session_id/decision/をポーリングします。

1つの/v3/ Application Programming Interface (API) で、Know Your Customer (KYC)、Know Your Business (KYB)、取引監視、ウォレットスクリーニング(KYT — 取引確認)をカバーします。毎月500回の本人確認が永久に無料、クレジットカード不要。

今すぐ試せるサンドボックスはありますか?

はい — 60秒未満で、クレジットカードは不要です。 business.didit.meでサインアップするか(またはPOST https://apx.didit.me/auth/v2/programmatic/register/でプログラム的に登録)、実際のApplication Programming Interface (API) キーを持つサンドボックスワークスペースにアクセスできます。

  • 本番環境と同じ形式 — 決定論的な判定、すべてのモジュールがアンロックされています。
  • 実際の/v3/エンドポイント、実際のウェブフック、実際のドキュメントサンプル。
  • 準備ができたらいつでもライブに切り替えられます — 同じキー、同じUniform Resource Locators (URLs)、同じ契約です。
どのSoftware Development Kit (SDK) を提供していますか?

5つのファーストパーティSDK、すべてオープンソース、すべて公開ドキュメントに掲載されています。

  • Web — JavaScript / TypeScript、フレームワークに依存せず、iframe埋め込みまたはホスト型フローリダイレクト。
  • iOS — Swift、XCFrameworkとして配布。
  • Android — Kotlin、Maven Central経由。
  • React Native — ネイティブモジュール(TurboModules)上のTypeScriptバインディング。
  • Flutter — 同じネイティブSDKをラップするDartラッパー。

すべてのSDKは内部で同じ/v3/契約を呼び出すため、Webをサイトに、ネイティブをモバイルにといったように組み合わせて使用できます。リファレンスはdocs.didit.me/integration/web-sdks/overviewをご覧ください。

ウェブフックはどのように機能しますか?

宛先を1つ登録するだけで、Diditがすべての配信に署名します。

  • ビジネスコンソールを介してエンドポイントを設定するか、labelurlsubscribed_eventsを指定してPOST /v3/webhook/destinations/を呼び出します。
  • Diditは応答でsecret_shared_keyを返します。これを使用して、受信するすべてのウェブフック(ヘッダー:X-Signature-V2)のHash-based Message Authentication Code (HMAC)-SHA256署名を検証します。
  • 各ペイロードには、正確で大文字と小文字を区別する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コーディングツールと統合できますか?

はい — 1つのプロンプトを貼り付けてデプロイできます。 docs.didit.me/integration/integration-promptにある正規の統合プロンプトをClaude Code、Cursor、Codex、Devin、Aider、またはReplit Agentに貼り付けてください。エージェントがワークフローをプロビジョニングし、ウェブフックを接続し、エンドツーエンドのスモークテストを実行します。

エージェントが開始したセッションは、直接API呼び出しと同じ公開価格で支払われます — 完全な本人確認 (KYC) は1件あたり$0.33、単独の本人確認書類検証は1件あたり$0.15、ウォレットスクリーニングは1件あたり$0.15です。無料で、追加設定は不要で、Model Context Protocol (MCP) 対応のあらゆるクライアントで動作します。

変更履歴はどこにあり、APIのバージョン管理はどのように行われていますか?

`docs.didit.me/changelog`で毎月のリリースノート — 出荷されたすべてのモジュール、追加されたすべてのウェブフックイベント、すべての破壊的変更が記載されています。

  • docs.didit.me/openapi-25.jsonにあるOpenAPI 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にこのページの要約を依頼する