Didit API Integration Guide

This guide compiles the full details from the Didit API documentation, covering introduction, setup, workflows, integration methods for web and mobile, no-code options, webhooks, verification statuses, rate limiting, and pricing. It is based on the available reference materials to provide a comprehensive, step-by-step resource for integrating Didit’s AI-native identity verification platform.

#

Introduction

Didit is an AI-native identity platform designed to help developers and businesses verify users instantly, combat sophisticated fraud, and reduce costs by up to 70% without compromising user experience (UX), privacy, or control.

##

Problems with Legacy Identity Verification
Traditional systems suffer from:
- **Exorbitant Costs**: $1–$3 per check with minimum commitments.
- **Manual Reviews**: Slow and error-prone decisioning.
- **Opaque Pricing & Sales Loops**: Testing requires sales interactions.
- **Developer-Hostile Integration**: Poor documentation and clunky SDKs leading to weeks-long setups.
- **Bundled, Inflexible Products**: Forced purchases of unnecessary features via contracts.
- **Not Ready for AI Fraud**: Inadequate detection of deepfakes, spoofing, and synthetic identities.
- **Slow & Painful User Flows**: 60–90 second processes causing high drop-off rates.

##

Didit V2 Principles
Didit aims to build an open, modular identity layer for the internet, powered by AI in a developer-first manner.

| Principle | Description |
|-----------------|-------------|
| **AI-Native** | Fully automated verifications detecting spoofs and synthetic fraud in milliseconds. |
| **Developer-First** | Open docs, clear pricing, instant sandbox—integrate in hours. |
| **Modular & Flexible** | Compose workflows with features like IDV, AML, NFC, Liveness, Face Match, Age-Check. |
| **Affordable** | Free Core KYC, prepaid credits, pay only for successful checks—up to 70% cheaper. |

##

Use Cases
- Seamless user onboarding (KYC / KYB).
- Age & geolocation compliant access.
- Fraud-proof face authentication.
- AML / politically exposed person screening.
- Self-sovereign identity wallets.
- Global ID document verification.

##

Getting Started
1. Create an account for instant sandbox access.
2. Choose integration: No-Code Workflows via Console or APIs & SDKs for custom builds.
3. Launch your first verification in minutes. Start with the Quick Start Guide.

#

Quick Start

Follow these steps to create a Didit account, configure a workflow, secure an API key, and launch your first verification session.

##

Step 1: Create Your Free Didit Account
1. Visit [business.didit.me](https://business.didit.me).
2. Sign up with a business email and authenticate via magic login link.
3. Set up an Organization workspace for managing workflows, API keys, and verifications.

##

Step 2: Build Your First Verification Workflow
1. In the Console, go to **Verifications → Workflows → Create New**.
2. Select a template:
- **KYC**: Standard onboarding.
- **Adaptive Age Verification**: Selfie check with document fallback.
- **Biometric Authentication**: Password-less selfie login.
- **Address Verification**.
3. Customize by adding blocks (e.g., Liveness Detection, Face Match, AML, NFC) and fallback logic.

##

Step 3: Configure Webhook & Copy API Key
1. Navigate to **Verifications → Settings → API & Webhooks**.
2. Add your Webhook URL for status updates.
3. Copy and securely store your API Key (avoid frontend exposure).

##

Step 4: Start a Verification Session
###

Option A: Verification Links (Fastest)
- In **Verifications**, click “+” and select a workflow.
- Generate a link or QR code.
- Distribute via email, SMS, or embed.

Programmatically (via API):
```
POST /v2/session/
{
"workflow_id": "your-workflow-id"
}
```
(Note: Find `workflow_id` in Console under **Verifications → Workflows**.)

###

Option B: Standalone APIs (Advanced)
Call endpoints directly from backend:
- `/v2/id-verification/`: ID document checks.
- `/v2/face-match/`: Selfie vs. ID comparison.
- `/v2/aml/`: Compliance list checks.
- `/v2/passive-liveness/`: Deepfake detection.
Suitable for custom UI or backend-only flows.

##

Step 5: Receive Real-Time Results
Didit sends webhook events (no polling needed):
- **status.updated**: On any status change, including session start.
- **data.updated**: On manual KYC/POA updates by reviewers.

##

Step 6: Manage & Monitor in the Console
- View real-time session progress.
- Export PDF/CSV reports.
- Blocklist suspicious IDs/faces.
- Manually delete/reject sessions.

##

Support
- WhatsApp: [Link](https://api.whatsapp.com/send/?phone=%2B34681310687).
- Email: support@didit.me.

#

Workflows Dashboard

Didit’s Orchestrated Workflows enable no-code design of multi-step identity verification journeys using a visual builder in the Business Console. Define logic once; Didit handles user-facing experience, state, and conditions. Ideal for onboarding, age verification, or re-authentication with minimal development.

##

Workflow Builder
Start with templates and customize features/parameters via settings.

###

Templates
| Template | Description | Starts With | Common Features |
|----------|-------------|-------------|-----------------|
| **KYC** | Onboarding for compliance. | ID Document Verification. | Liveness, Face Match 1:1, AML, NFC, PoA, Phone/Email Verification, Database Validation, Questionnaire, IP Analysis. |
| **Adaptive Age Verification** | Low-friction age gating. | Selfie-based Age Estimation. | Fallback to ID if age in buffer (e.g., 16-20 for 18+); IP Analysis. |
| **Biometric Authentication** | Re-verify returning users. | Liveness Detection. | Face Match to trusted template (pass `portrait_image` URL); Phone/Email Verification, IP Analysis. |
| **Address Verification** | Focus on PoA. | Proof of Address submission. | AI extraction/validation; Phone/Email Verification, IP Analysis. |
| **Questionnaire Verification** | Collect attestations/forms. | Questionnaire. | Configurable sections/translations/fields/uploads; IP Analysis. |

##

Customization
Adjust parameters for each feature in the builder.

##

API Integration Flow
1. Server POSTs to `/v2/session/` to create session.
2. Didit returns unique URL.
3. Redirect user to URL.
4. Didit handles steps and webhooks status to server.
5. Server updates and redirects to callback.

#

Web App Integration

Integrate Didit into web apps using redirect buttons or embedded iframes. Include `allow="camera; microphone; fullscreen; autoplay; encrypted-media"` for iframes.

##

Methods
- **Redirect Button**: User clicks to navigate to verification URL (from `/v2/session/` API).
- **Embedded Iframe**: Load verification URL inline.

Basic code examples and callback parameters are available, referencing `verification_url` from the Create Verification Session API (see Quick Start for API details).

#

Unilinks (No-Code Verification Links)

Unilinks are unique, no-code URLs for launching verifications without API integration. Suitable for simple use cases.

##

Introduction & Usage
- Create via Console for specific workflows.
- Distribute as links, QR codes, or buttons.
- Example Website Button: Embed a button linking to the Unilink.

##

When to Use
- Quick prototypes or low-volume verifications.
- Avoid for high customization or scalable integrations (use API instead).

##

Comparison with API
- Unilinks: No-code, limited options.
- API: Full control, programmatic sessions.

Best practices include secure distribution and monitoring in Console.

#

iOS & Android Integration

Embed verification natively using WebViews (no dedicated SDKs). Create session via API, load URL in WebView, handle callbacks.

##

Overview
1. Create session (get `session_url`; specify callback like `myapp://didit-callback`).
2. Open URL in configured WebView.
3. Intercept callback via custom scheme.

##

Common WebView Config
- User-Agent: Generic mobile (e.g., "Mozilla/5.0 (Linux; Android 10; Mobile) ...").
- Allow inline media playback without user gesture.
- Enable JavaScript and DOM storage (Android).

##

Code Examples
###

iOS (Swift - WKWebView)
```swift
import UIKit
import WebKit

class VerificationViewController: UIViewController, WKNavigationDelegate {
private var webView: WKWebView!

override func viewDidLoad() {
super.viewDidLoad()
setupWebView()
}

private func setupWebView() {
let configuration = WKWebViewConfiguration()
configuration.allowsInlineMediaPlayback = true
configuration.mediaTypesRequiringUserActionForPlayback = []

webView = WKWebView(frame: view.bounds, configuration: configuration)
webView.navigationDelegate = self
webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(webView)

webView.configuration.preferences.javaScriptEnabled = true
webView.customUserAgent = "Mozilla/5.0 (Linux; Android 10; Mobile) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36"

if let url = URL(string: "{session_url}") {
webView.load(URLRequest(url: url))
}
}

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(.allow)
}

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
decisionHandler(.allow)
}
}
```

Similar examples for Objective-C, Android (Java/Kotlin), React Native, and Flutter are provided in the docs, focusing on WebView setup and permissions.

##

Callback Handling
Use custom schemes; parse results and close WebView. Register in app manifests/plists.

##

Mobile UX Best Practices
| Practice | Reason |
|----------|--------|
| Full-screen WebView | Prevents accidental exits. |
| Loading spinner | Improves perception. |
| Disable pull-to-refresh | Avoids navigation issues. |
| Session timeout | Handles incomplete flows. |
| Network check | Prevents failures. |
| Real-device testing | Simulator differences. |
| Back button handling | Cancel or return gracefully. |

Demo repos: Expo (React Native), Flutter.

#

Webhooks

Configure webhooks for real-time session updates.

##

Introduction
Receive notifications on status changes. Events:
| Event | Trigger |
|-------|---------|
| **status.updated** | Any status change (includes initial start). |
| **data.updated** | Manual KYC/POA updates via API. |

Payload includes `webhook_type`; final statuses add `decision` object.

##

Configuration
1. Set up team/app (Quick Start steps 1-2).
2. In Console (**Verification Settings**): Add HTTPS endpoint, copy Webhook Secret Key.
- Cloudflare: Whitelist IP `18.203.201.92`.

##

Payload Structure
| Field | Description |
|-------|-------------|
| `session_id` | UUID of session. |
| `status` | Current status (e.g., In Progress). |
| `webhook_type` | Event type. |
| `created_at` | Event timestamp (Unix). |
| `timestamp` | Delivery timestamp (Unix). |
| `workflow_id` | Workflow UUID (optional). |
| `vendor_data` | Internal ID (optional). |
| `metadata` | Attached JSON (optional). |

Final payloads include `decision` with details like features, images, warnings.

##

HMAC Validation
Headers: `X-Signature` (HMAC-SHA256 of raw body), `X-Timestamp`.
Validate: Check existence, timestamp (±5 min), compute HMAC, constant-time compare.

##

Retry Policy
- Retry on 5xx/404 with exponential backoff (1 min, then 4 min).
- Abandons after two failures; logs in dashboard.

##

Language Examples
Full code for Node.js (Express), Python (FastAPI), PHP (Laravel) including validation and DB upserts.

##

Example Payloads
- Non-final (e.g., In Progress): Basic fields.
- Final (e.g., Declined): Adds detailed `decision` with images, warnings, etc.

#

Verification Statuses

Manage KYC with these statuses and reasons.

| Status | Description |
|--------------|-------------|
| Not Started | Process not initiated. |
| In Progress | User submitting info. |
| Approved | All checks passed. |
| Declined | Issues with submissions. |
| Kyc Expired | Renewal needed after expiration. |
| In Review | Manual review required. |
| Expired | Session timed out. |
| Abandoned | Incomplete within timeframe. |

Decision reasoning ties to descriptions (e.g., Declined due to non-meeting requirements).

#

Rate Limiting

Multi-layer limits for API stability, allowing bursts.

##

Global Limits
- GET: 300/min per app.
- Write (POST/PATCH/DELETE): 300/min per app.
- 429 responses include headers: `X-RateLimit-Limit`, `-Remaining`, `-Reset`, `Retry-After`.

##

Endpoint-Specific
| Scope | Endpoint(s) | Limit | Notes |
|------------------------|--------------------------------------|-------|-------|
| session-v2-create:free | POST /v2/session/ | 5/min | For free workflows. |
| session-v2-create:paid | POST /v2/session/ | 600/min | For paid. |
| session-decision | GET /v2/session//decision/ etc. | 100/min | Prevents polling abuse. |
| session-generate-pdf | GET /session//generate-pdf/ | 100/min | CPU-intensive. |

##

Best Practices
- Throttle on low remaining.
- Exponential backoff on 429s.
- Log retries.
Contact support for overrides.

#

Pricing

Prepaid USD credits (no expiry, no fees/minimums). Deducted only on successful verifications. Core KYC free forever.

##

Free Services
Unlimited: ID Verification (220+ countries), NFC, Document Monitoring, Reusable KYC, IP Analysis, Face Match 1:1, Passive Liveness.

##

Premium Workflow Features
Sum of enabled features per session.

| Feature | Description | Price |
|----------------------|-------------|-------|
| Active Liveness | Enhanced spoof prevention. | $0.15 |
| Biometric Authentication | Re-verify users. | $0.10 |
| Phone Verification | Fraud prevention. | $0.10 |
| Email Verification | Risk detection. | $0.03 |
| Age Estimation | Facial + ID fallback. | $0.10 |
| AML Screening | Watchlists/PEP. | $0.35 |
| AML Monitoring | Ongoing. | $0.07/year |
| Proof of Address | Document validation. | $0.50 |
| Questionnaire | Custom forms. | $0.10 |
| Database Validation | Government checks. | Varies by country |
| Whitelabel | Branding. | $0.30 |

##

Database Validation (Workflows)
Per successful match; 1x1/2x2 matching.

| Country | 1x1 | 2x2 |
|------------------|-----|-----|
| Argentina | $0.20 | N/A |
| Bolivia | $0.20 | N/A |
| Brazil | $0.20 | N/A |
| Chile | $0.20 | N/A |
| Colombia | $0.20 | N/A |
| Costa Rica | $0.20 | N/A |
| Dominican Republic | $0.05 | N/A |
| Ecuador | $0.20 | $0.30 |
| El Salvador | $0.20 | N/A |
| Guatemala | $0.20 | N/A |
| Honduras | $0.20 | N/A |
| Mexico | $0.20 | N/A |
| Panama | $0.20 | N/A |
| Paraguay | $0.20 | N/A |
| Peru | $0.20 | $0.30 |
| Spain | $0.20 | N/A |
| Uruguay | $0.20 | N/A |
| Venezuela | $0.20 | N/A |

##

Standalone API Pricing
Per successful call.

| API | Description | Price |
|----------------------|-------------|-------|
| Face Match | 1:1 comparison. | $0.05 |
| Face Search | Database search. | $0.05 |
| Age Estimation | Facial. | $0.10 |
| ID Verification | Documents. | $0.20 |
| Proof of Address | Residential. | $0.50 |
| AML Screening | Watchlists. | $0.35 |
| Passive Liveness | Spoof detection. | $0.05 |
| Phone Verification | Fraud check. | $0.10 |
| Email Verification | Risk check. | $0.03 |
| Database Validation | Authoritative. | Varies |

##

Business Model
- Prepaid credits: Buy packages; bonuses for volume (e.g., $68k purchase = $100k value, 32% discount).
- Free Plan: Unlimited core KYC.
- Enterprise: Dedicated support, custom SLAs.
- No contracts/fees; charges only on finished sessions.