Saltar para o conteúdo principal
Didit angaria 2 milhões de dólares e junta-se à Y Combinator (W26)
Didit
Programadores

A melhor forma de integrar
identidade e fraude.

Abra a sandbox, cole um curl e implemente em 5 minutos. Documentação pública, cinco Software Development Kits (SDKs) e um servidor Model Context Protocol (MCP) para que um agente de codificação de Inteligência Artificial (IA) possa integrar o Didit por si. $0.33 por verificação KYC completa, 500 gratuitas por mês.

Apoiado por
Y Combinator
GBTC Finance
Bondex
Crnogorski Telekom
UCSF Neuroscape
Shiply
Adelantos

Confiado por mais de 2.000 organizações em todo o mundo.

Início rápido

De zero a verificado em cinco minutos.

Cinco passos desde o registo até ao primeiro utilizador verificado. Cada passo emparelha um caminho da Consola de Negócios com um caminho programático da Interface de Programação de Aplicações (API). Ou ignore todos os passos — cole o prompt de integração em docs.didit.me/integration/integration-prompt no seu agente de codificação de IA.
01 · Registar

Crie a sua conta Didit.

  • Na Consola de Negócios: registe-se em business.didit.me em menos de sessenta segundos — sem cartão, sem barreira de vendas.
  • Por Interface de Programação de Aplicações (API): chame POST https://apx.didit.me/auth/v2/programmatic/register/, depois POST .../verify-email/.

Qualquer um dos caminhos deixa-o com uma chave API de sandbox — com a mesma forma que a de produção, todos os módulos desbloqueados.

API de Registo Programático
Chave de API de produção
Ao vivo
didit_sk_live_8f4c2a…9bf3

Emitido agora mesmo — sem cartão, sem contrato, sem chamada.

  • Sem mínimo
  • Sem contrato
  • 500 grátis / mês
  • Sandbox aberto
02 · Construir o fluxo de trabalho

Escolha os módulos. Componha o fluxo de trabalho.

  • Na Consola de Negócios: arraste e solte os módulos no Construtor de Fluxos de Trabalho — Verificação de Documento de Identidade, Liveness Passiva, Correspondência Facial, Anti-Branqueamento de Capitais (AML), Rastreio de Carteiras, Análise de Protocolo de Internet (IP) e mais 19.
  • Por API: chame POST /v3/workflows/ em verification.didit.me com os módulos que deseja.

Qualquer um dos caminhos retorna um workflow_id que passará em cada sessão.

API de Criação de Fluxo de Trabalho
Fluxo de trabalhokyc-onboarding-v3
Mais de 220 países
  • ID Verification
  • Passive Liveness
  • Face Match 1:1
  • AML Screening
  • Device & IP Analysis
  • Comprovativo de Morada
  • Leitura NFC
  • Verificação Telefónica
  • Rastreio de Carteira
  • Questionário Personalizado
+ 15 módulos adicionais · mais de 1.000 fontes de dados$0.33/sessão
03 · Registar o webhook

Configure um destino de webhook para cada veredito.

  • Na Consola de Negócios: adicione o seu Uniform Resource Locator (URL) do webhook, escolha os eventos e copie o segredo de assinatura que o Didit gera.
  • Por API: chame POST /v3/webhook/destinations/ com label, url e subscribed_events. A resposta retorna a secret_shared_key que o Didit usa para assinar cada entrega.
API de Criação de Destino de Webhook
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/

Cada endpoint aberto · cada webhook assinado com HMAC.

04 · Integrar na sua aplicação

Crie uma sessão — Software Development Kit (SDK) ou API direta.

  • Com um Software Development Kit (SDK): insira o SDK nativo para Web, iOS, Android, React Native ou Flutter — o mesmo contrato /v3/ por baixo.
  • Por API: chame POST /v3/session/ com o workflow_id e um valor vendor_data (o seu identificador de utilizador).

A resposta dá-lhe um URL de verificação para redirecionar ou incorporar na sua aplicação.

Ver os SDKs
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"
  }'
201Criado
{ "session_id": "4c5c7f3a-...", "url": "verify.didit.me/..." }
05 · Receber o veredito

Ouça o webhook — ou faça polling.

  • Webhook em tempo real: o seu endpoint é acionado a cada alteração de estado. Leia o status ("Approved", "Declined", "In Review", "Resubmitted", …), atualize a sua base de dados, envie.
  • Por polling: chame GET /v3/session/:session_id/decision/ para o mesmo payload — útil quando a sua stack não consegue aceitar tráfego de entrada.

As strings de estado são exatas e sensíveis a maiúsculas e minúsculas. Máquina de estados completa em docs.didit.me/integration/verification-statuses.

Estados de Verificação
Eventos
live
  • session.verified2.4s ago200 OK
  • session.review_started12s ago200 OK
  • session.aml_hit1m ago200 OK
  • session.declined3m ago200 OK
Construir com Didit

Todas as superfícies, públicas. Zero chamadas de vendas.

Leia a documentação, chame a Interface de Programação de Aplicações (API), ligue-se a um servidor Model Context Protocol (MCP), cole um prompt de integração ou envie uma skill de agente pré-construída — tudo público, tudo gratuito.
Documentação

Encontre todos os módulos, endpoints e webhooks.

Início rápido

Lance um fluxo KYC em 5 minutos.

Referência da API

Leia a especificação OpenAPI 3.1.

SDKs

Incorpore na Web, iOS, Android, React Native ou Flutter.

Webhooks

Receba eventos assinados por HMAC em cada mudança de estado.

Estados de verificação

Leia a máquina de estados completa da sessão.

Prompt de integração

Cole um prompt. Envie a integração KYC.

Servidor MCP

Ligue o Didit a qualquer cliente MCP.

Competências do Agente

Verificação pré-construída, AML e competências KYB.

Integração em cinco minutos

Um curl. Cinco SDKs.

Inicie uma sessão de verificação com um curl, ou incorpore o fluxo na Web, iOS, Android, React Native, ou Flutter — o mesmo contrato /v3/ por baixo.
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"
  }'
201Criado
{ "session_id": "4c5c7f3a-...", "url": "verify.didit.me/..." }
Webv1.4.0iOSv3.0.1Androidv2.6.2
React Nativev1.8.0Flutterv1.3.4
Para programadores · Para agentes de IA · Aberto por design

Construído para programadores e agentes de IA.

Integre as verificações de identidade e fraude do Didit com uma Interface de Programação de Aplicações (API). Abra a sandbox, leia a documentação pública, ligue-se a um servidor Model Context Protocol (MCP) ou obtenha um Software Development Kit (SDK) para qualquer stack. Os programadores implementam numa tarde; os agentes de codificação de IA implementam num prompt — sem UI, sem intervenção humana, sem chamada de vendas, sem mínimos.
01 · Uma API

Uma API para identidade e fraude.

Uma Interface de Programação de Aplicações (API) abrange todas as verificações de identidade e fraude — Conheça o Seu Cliente (KYC), Conheça o Seu Negócio (KYB), Anti-Branqueamento de Capitais (AML), monitorização de transações, correspondência biométrica. Mesma chave, mesmo motor de fluxo de trabalho, encadeável numa única sessão — sem trabalho de integração extra entre produtos.
Ler a documentação da 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"
  }'
201Criado
{ "session_id": "4c5c7f3a-...", "url": "verify.didit.me/..." }
02 · Nativo de agente

Integrar num único prompt.

O nosso servidor Model Context Protocol (MCP) está ativo e as competências do agente estão publicadas. Peça ao Claude Code, Codex ou Cursor para integrar o Didit — o agente cria o espaço de trabalho, configura o fluxo de trabalho e envia a primeira chamada de API por conta própria. Sem painel de controlo, sem humano, sem ticket de suporte.
Ler o prompt de integração
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.
Colar no Claude Code, Codex ou Cursor · envia a integração completa
03 · Modular

Qualquer fluxo. Qualquer país. Qualquer caso de uso.

Componha qualquer fluxo a partir de mais de 25 módulos, mais de 1.000 fontes de dados governamentais, mais de 220 países, mais de 14.000 tipos de documentos e mais de 48 idiomas. O mesmo orquestrador executa autenticação biométrica, KYC para um neobanco, KYB para uma fintech B2B, Travel Rule para uma bolsa de criptomoedas ou AML contínuo para um marketplace — você escolhe as verificações e a ordem.
Ver todos os módulos
Fluxo de trabalhokyc-onboarding-v3
Mais de 220 países
  • ID Verification
  • Passive Liveness
  • Face Match 1:1
  • AML Screening
  • Device & IP Analysis
  • Comprovativo de Morada
  • Leitura NFC
  • Verificação Telefónica
  • Rastreio de Carteira
  • Questionário Personalizado
+ 15 módulos adicionais · mais de 1.000 fontes de dados$0.33/sessão
04 · Autoatendimento

Sem paywall. Sem chamada de vendas. Vá brincar com ele.

A sandbox está aberta desde o primeiro minuto. A documentação e a API são públicas, sem barreira de demonstração entre você e o código. Inscreva-se, obtenha uma chave, envie no mesmo dia. A nossa equipa de vendas está disponível quando você quiser — nunca como uma barreira.
Experimentar a sandbox
Chave de API de produção
Ao vivo
didit_sk_live_8f4c2a…9bf3

Emitido agora mesmo — sem cartão, sem contrato, sem chamada.

  • Sem mínimo
  • Sem contrato
  • 500 grátis / mês
  • Sandbox aberto
05 · Baseado no uso

Pague pelo que usa. É isso.

Didit é 3 a 5 vezes mais barato do que os fornecedores de KYC existentes, com todos os preços públicos em /pricing — $0.33 pacote KYC completo, $0.15 rastreio de carteira, $0.03 análise de Dispositivo e IP, 500 verificações gratuitas todos os meses. Sem mínimos, sem contratos anuais, sem surpresas de excesso — o preço na página é o preço na fatura.
Ver todos os preços
Lista de preços pública
/pricing
  • ID Verification$0.15
  • Passive Liveness$0.10
  • Face Match 1:1$0.05
  • AML Screening$0.20
  • Device & IP Analysis$0.03
  • Rastreio de Carteira (KYT)$0.15
Pacote KYC completo$0.33

500 grátis / mês · sem mínimo · sem contrato anual.

06 · Infraestrutura aberta

API aberta. Construa em cima.

Cada endpoint é aberto e documentado — altere o status de uma sessão, bloqueie um rosto, descarregue um PDF de decisão, edite um fluxo de trabalho ou consulte o registo de eventos. Os webhooks são assinados com Hash-based Message Authentication Code (HMAC), para que possa provar que cada evento veio de nós. Didit é infraestrutura, não uma aplicação fechada.
Navegar na 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/

Cada endpoint aberto · cada webhook assinado com HMAC.

07 · SDKs

SDKs para todas as plataformas.

Um Software Development Kit (SDK) para cada stack — Web, iOS, Android, React Native, Flutter. No backend, uma API REST, webhooks assinados, uma especificação OpenAPI 3 e integrações prontas para Zapier, Shopify e Salesforce. Cada superfície é fornecida com exemplos, tipos e um guia de introdução de 5 minutos.
Navegar nos SDKs
Webv1.4.0iOSv3.0.1Androidv2.6.2
React Nativev1.8.0Flutterv1.3.4
08 · Infraestrutura otimizada para escala

As verificações mais rápidas do mercado.

99% das verificações terminam em menos de 2 segundos, de ponta a ponta — medido em produção, não declarado numa apresentação. Visamos um Acordo de Nível de Serviço (SLA) de 99,99%, mantivemos 100% de tempo de atividade nos últimos 12 meses e nunca fomos violados. Otimizado para todos os dispositivos e redes — iPhone, Android, desktop, tablet, 5G ou 2G — e já a executar milhões de verificações por mês.
Ver estado em tempo real
Latência de ponta a ponta · 30d
SLA de 99,99%
  • p500.82s
  • p951.42s
  • p991.89s

Verificações mais rápidas do mercado · iPhone, Android, desktop, tablet, 5G ou 2G.

Três níveis, uma lista de preços

Comece gratuitamente. Pague por uso. Escale para Enterprise.

500 verificações gratuitas todos os meses, para sempre. Pagamento conforme o uso para produção. Contratos personalizados, residência de dados e SLAs (Service Level Agreements) no Enterprise.
Grátis

Grátis

$0 / mês. Não é necessário cartão de crédito.

  • Pacote KYC gratuito (Verificação de ID + Prova de Vida Passiva + Correspondência Facial + Análise de Dispositivo e IP) — 500 / mês, todos os meses
  • Utilizadores Bloqueados
  • Deteção de Duplicados
  • Mais de 200 sinais de fraude em cada sessão
  • KYC reutilizável em toda a rede Didit
  • Plataforma de Gestão de Casos
  • Construtor de Fluxos de Trabalho
  • Documentos públicos, sandbox, SDKs, servidor MCP (Model Context Protocol)
  • Suporte da comunidade
Mais popular
Pague por uso

Baseado na Utilização

Pague apenas pelo que usa. Mais de 25 módulos. Preços públicos por módulo, sem taxa mínima mensal.

  • KYC completo por $0.33 (ID + Biometria + IP / Dispositivo)
  • Mais de 10.000 conjuntos de dados AML — sanções, PEPs, media adversa
  • Mais de 1.000 fontes de dados governamentais para Validação de Base de Dados
  • Monitorização de Transações por $0.02 por transação
  • KYB em tempo real por $2.00 por empresa
  • Rastreio de Carteira por $0.15 por verificação
  • Fluxo de verificação de marca branca — a sua marca, a nossa infraestrutura
Empresarial

Empresarial

MSA e SLA personalizados. Para grandes volumes e programas regulados.

  • Contratos anuais
  • MSA, DPA e SLA personalizados
  • Canal dedicado no Slack e WhatsApp
  • Revisores manuais sob demanda
  • Termos de revenda e marca branca
  • Funcionalidades exclusivas e integrações de parceiros
  • CSM nomeado, revisão de segurança, suporte de conformidade

Comece gratuitamente → pague apenas quando uma verificação for executada → desbloqueie o Enterprise para um contrato personalizado, SLA ou residência de dados.

FAQ

Perguntas de programadores, respondidas.

As mesmas respostas que enviamos às equipas de engenharia durante uma chamada de integração. Qualquer outra coisa — support@didit.me.
Como integro a Didit?

Cinco passos desde o registo até ao primeiro veredito.

  • Crie a sua conta em business.didit.me, ou ligue para POST https://apx.didit.me/auth/v2/programmatic/register/.
  • Crie um fluxo de trabalho na Consola de Negócios, ou ligue para POST /v3/workflows/.
  • Registe um destino de webhook através da consola, ou ligue para POST /v3/webhook/destinations/ (a Didit devolve o segredo de assinatura na resposta).
  • Crie uma sessão com POST /v3/session/, passando workflow_id e vendor_data (o seu identificador de utilizador). Redirecione o utilizador para o URL devolvido — ou insira um Kit de Desenvolvimento de Software (SDK) nativo no mesmo contrato /v3/.
  • Receba o veredito no webhook assinado, ou faça polling em GET /v3/session/:session_id/decision/.

Uma Application Programming Interface (API) /v3/ abrange Know Your Customer (KYC), Know Your Business (KYB), Monitorização de Transações e Triagem de Carteiras (KYT — conheça a sua transação). 500 verificações gratuitas todos os meses, para sempre, sem cartão de crédito.

Existe um sandbox com o qual posso brincar agora mesmo?

Sim — em menos de sessenta segundos, sem cartão de crédito. Registe-se em business.didit.me (ou registe-se programaticamente com POST https://apx.didit.me/auth/v2/programmatic/register/) e aterrará num espaço de trabalho sandbox com uma chave de Application Programming Interface (API) real.

  • Mesma forma que a produção — decisões determinísticas, todos os módulos desbloqueados.
  • Endpoints /v3/ reais, webhooks reais, amostras de documentos reais.
  • Mude para o modo ativo quando estiver pronto — as mesmas chaves, os mesmos Uniform Resource Locators (URLs), o mesmo contrato.
Quais Kits de Desenvolvimento de Software (SDKs) vocês fornecem?

Cinco SDKs de primeira parte, todos de código aberto, todos na documentação pública:

  • Web — JavaScript / TypeScript, agnóstico de framework, incorporação de iframe ou redirecionamento de fluxo alojado.
  • iOS — Swift, distribuído como XCFramework.
  • Android — Kotlin, via Maven Central.
  • React Native — ligações TypeScript sobre módulos nativos (TurboModules).
  • Flutter — wrapper Dart em torno dos mesmos SDKs nativos.

Cada SDK chama o mesmo contrato /v3/ por baixo, para que possa misturar e combinar — Web no seu site, nativo no telemóvel. Referência em docs.didit.me/integration/web-sdks/overview.

Como funcionam os webhooks?

Registe um destino; a Didit assina cada entrega.

  • Configure o seu endpoint através da Consola de Negócios — ou chame POST /v3/webhook/destinations/ com label, url e subscribed_events.
  • A Didit devolve uma secret_shared_key na resposta. Use-a para verificar a assinatura Hash-based Message Authentication Code (HMAC)-SHA256 em cada webhook de entrada (cabeçalho: X-Signature-V2).
  • Cada payload contém um status exato e sensível a maiúsculas e minúsculas — "Approved", "Declined", "In Review", "Resubmitted", e mais. Máquina de estados completa em docs.didit.me/integration/verification-statuses.
  • As retentativas usam backoff exponencial até que devolva 2xx; cada entrega é registada e reproduzível a pedido a partir da consola.

Referência completa em docs.didit.me/integration/webhooks.

Quais são os limites de taxa e o que acontece em escala?

Predefinições generosas em todos os planos, ajustadas por conta.

  • Nível gratuito — sandbox mais 500 verificações de produção todos os meses, para sempre.
  • Pagamento por utilização — os limites de pico escalam automaticamente com o volume sustentado. Não irá encontrar um "muro" a meio do lançamento.
  • Empresarial — limites de taxa personalizados, capacidade dedicada e compromissos de tempo de atividade no Acordo de Serviços Mestre (MSA). Fale connosco em support@didit.me.

Capacidade alvo por região em status.didit.me. 100% de tempo de atividade real nos últimos 6 meses em milhões de verificações por mês.

Posso integrar com Claude Code, Cursor ou outras ferramentas de codificação de IA?

Sim — cole um prompt e envie. Insira o prompt de integração canónico em docs.didit.me/integration/integration-prompt no Claude Code, Cursor, Codex, Devin, Aider ou Replit Agent. O agente provisiona o fluxo de trabalho, conecta o webhook e executa um teste de fumo de ponta a ponta.

As sessões iniciadas por agentes pagam o mesmo preço público que as chamadas diretas da API — $0.33 por Know Your Customer (KYC) completo, $0.15 por Verificação de Documento de Identidade autónoma, $0.15 por rastreio de carteira. Gratuito, sem configuração extra, funciona com qualquer cliente compatível com o Model Context Protocol (MCP).

Onde está o registo de alterações e como é feita a versão da API?

Notas de lançamento mensais em `docs.didit.me/changelog` — cada módulo enviado, cada evento de webhook adicionado, cada alteração disruptiva assinalada.

  • A especificação OpenAPI 3.1 em docs.didit.me/openapi-25.json é versionada juntamente com a documentação. Importe-a para o Postman ou gere clientes em qualquer idioma.
  • O versionamento é aditivo por predefinição. Novos campos, novos parâmetros opcionais e novos eventos de webhook são enviados sem um aumento de versão. As alterações disruptivas recebem um novo namespace /v4/ e uma janela de depreciação publicada.
  • Nunca alteramos silenciosamente o significado de um campo — se a forma de um veredito, esquema de assinatura ou enum de estado mudar, é enviado por trás de um cabeçalho e anunciado antes da transição.
Como monitorizo o tempo de atividade e qual é o processo de incidente?

`status.didit.me` publica o tempo de atividade em tempo real e o histórico de incidentes por região — verificação, webhooks, consola, documentação. Não é necessário fazer login.

  • Subscreva via Really Simple Syndication (RSS), e-mail ou webhook para alertas de interrupção.
  • Histórico: 100% de tempo de atividade real nos últimos 6 meses; meta de disponibilidade de 99,99% no Acordo de Nível de Serviço (SLA).
  • Cada incidente recebe uma análise post-mortem pública na mesma página.
  • Os contratos empresariais adicionam um engenheiro de plantão nomeado, um canal partilhado dedicado no Slack ou Microsoft Teams e Objetivos de Nível de Serviço de gravidade de incidente no Acordo de Serviços Mestre (MSA).

Infraestrutura para identidade e fraude.

Uma API para KYC, KYB, Monitorização de Transações e Rastreio de Carteiras. Integre em 5 minutos.

Peça a uma IA para resumir esta página