Skip to main content
Didit Raises $2M and Joins Y Combinator (W26)
Didit
Custom Questionnaires

Collect any data.
Inside any verification flow.

Ask any question your compliance team needs — Source of Funds, occupation, expected volume, PEP (politically exposed person) self-declaration — with audited answers on the same session. No-code builder, conditional branching, file uploads. $0.10 per submission, 500 free/month.

Backed by
Y Combinator
GBTC Finance
Bondex
Crnogorski Telekom
UCSF Neuroscape
Shiply
Adelantos

Trusted by 2,000+ organizations worldwide.

Source-of-funds, PEP self-disclosure

Ask anything.
Lock the audit trail.

Drop a custom questionnaire into the workflow — source of funds, PEP self-disclosure, occupation, expected volume. Answers land in the session report. $0.10 per submission.

How it works

From sign-up to verified user in four steps.

  1. Step 01

    Create the workflow

    Pick the checks you want — ID, liveness, face match, sanctions, address, age, phone, email, custom questions. Drag them into a flow in the dashboard, or post the same flow to our API. Branch on conditions, run A/B tests, no code required.

  2. Step 02

    Integrate

    Embed natively with our Web, iOS, Android, React Native, or Flutter SDK. Redirect to a hosted page. Or just send your user a link — by email, SMS, WhatsApp, anywhere. Pick what fits your stack.

  3. Step 03

    User goes through the flow

    Didit hosts the camera, the lighting cues, the mobile hand-off, and accessibility. While the user is in the flow, we score 200+ fraud signals in real time and verify every field against authoritative data sources. Result in under two seconds.

  4. Step 04

    You receive the results

    Real-time signed webhooks keep your database in sync the moment a user is approved, declined, or sent to review. Poll the API on demand. Or open the console to inspect every session, every signal, and manage cases your way.

Built for developers · Built against fraud · Open by design

Six capabilities. One feature flag. QUESTIONNAIRE.

Every capability below is a toggle on the same module. No upsell tiers, no separate SKUs, no add-on calls. Switch them on per workflow, or chain the questionnaire step after ID verification and liveness in a single workflow.
01 · Visual builder

Schema-driven forms. No code. No SDK. No build step.

Two modes. Simple mode for fast single-language drag-and-drop forms — best for internal surveys and quick attestations. Advanced mode is a visual node-based editor — required when you need conditional branching, translations, choice-driven follow-up text, or forced manual review. Both publish in under a minute.
02 · Conditional branching

Show each question only to the user who needs it.

Branching nodes in the advanced-mode editor inspect any previous answer and route the user along the matching path. Ask the US resident the W-9 follow-up, the EU resident the PEP (politically exposed person) self-declaration, skip both where neither applies. Drag from any node handle into empty space to create a new connected node. Undo, redo, keyboard shortcuts, zoom and pan included.
03 · AML-grade templates

Source of Funds. Tax residency. UBO declarations.

Six pre-built compliance templates in the console — Source of Funds, Employment Details, Purpose of Account, Beneficial Ownership, Tax Residency, Risk Assessment. Each encodes what auditors expect (income source, breakdown, proof upload, third-party funds, virtual-asset declaration). Clone one and customise, or start blank.
04 · Structured responses

Every answer returns as the same auditable JSON.

The session report carries a `responses` array — one entry per questionnaire step. Each item ships element type, required flag, localized title, choices, upload limit, and an answer object with value, text, or files. Same shape on the API and every webhook — persist once and never re-parse.
05 · Responses + audit trail

Forced manual review. Human in the loop. Audit-ready.

Toggle force-manual-review and every submission pins to In Review until a human compliance officer approves it. The console shows every answer, every uploaded file, and the localized question text. One-click approval fires a verified-session webhook with the final report. Auditable end to end for the regulator.
06 · Workflow-native

In-line in KYC. Or run as its own verification.

Chain QUESTIONNAIRE after ID_VERIFICATION and LIVENESS to collect Source of Funds as part of a full KYC (know your customer) onboarding — one session, one webhook, one stored report. Or ship a workflow whose only feature is QUESTIONNAIRE for ongoing due diligence, post-onboarding declarations, and periodic re-attestations. $0.10 per submission on either path.
Integrate

Two patterns. Same JSON. Same price.

Use POST /v3/session/ on a workflow that chains QUESTIONNAIRE with ID_VERIFICATION and LIVENESS to collect data inside a full KYC, or on a workflow whose only feature is QUESTIONNAIRE to run the form as its own Questionnaire Verification. Both return the same questionnaire_responses shape.
POST /v3/session/In-workflow
$ curl -X POST https://verification.didit.me/v3/session/ \
  -H "x-api-key: $DIDIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "workflow_id": "wf_kyc_sof",
    "vendor_data": "user-42"
  }'
201Created{ "session_url": "verify.didit.me/..." }
Chain QUESTIONNAIRE after ID_VERIFICATION in the same workflow.docs →
POST /v3/questionnaires/Create schema
$ curl -X POST https://verification.didit.me/v3/questionnaires/ \
  -H "x-api-key: $DIDIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Customer Onboarding",
    "languages": ["en"],
    "default_language": "en",
    "form_elements": [
      { "id": "occupation", "element_type": "short_text", "label": { "en": "What is your occupation?" } }
    ]
  }'
201Created{ "questionnaire_id": "q_…" }
Build once, attach the questionnaire_uuid to every workflow that should collect it.docs →
Agent-ready integration

Ship Custom Questionnaires in one prompt.

Paste the block below into Claude Code, Cursor, Codex, Devin, Aider, or Replit Agent. Fill in the my_stack placeholder with your framework + language + use case. The agent provisions Didit, builds the questionnaire, creates the workflow with the QUESTIONNAIRE feature, wires the webhook, and ships.
didit-integration-prompt.md
# Didit Custom Questionnaires — integrate in 5 minutes

You are integrating Didit's Custom Questionnaires module into <my_stack>.
Follow these steps exactly. Every URL, header, and enum value below is
canonical — do not paraphrase or "improve" them.

## 1. Provision an account
- Sign up: https://business.didit.me (no credit card required).
- Or provision programmatically: POST https://apx.didit.me/auth/v2/programmatic/register/
  (returns an API key bound to the workspace + application).

## 2. Build the questionnaire — Console OR API

### 2a. Visual builder in the Console (no code)
Questionnaires are authored visually — no schema upload, no SDK required.
1. Open https://business.didit.me, go to Questionnaires, click New.
2. Pick a mode:
   - Simple Mode — single-language drag-and-drop builder. Best for fast
     forms, internal surveys, single-locale flows.
   - Advanced Mode — visual node-based graph editor. Required for
     conditional branching, multi-language translations, choice-driven
     follow-up text, and forced manual review.
3. Drag elements onto the canvas (input, choice, upload, layout — full
   element catalog in section 5 below).
4. Optionally start from a pre-built template (Source of Funds,
   Employment Details, Purpose of Account, Beneficial Ownership, Tax
   Residency, Risk Assessment).
5. Localize titles, descriptions, placeholders, and choice labels for
   every supported language; set a default_language.
6. Publish — the questionnaire is now addressable by its questionnaire_id.

### 2b. Create the questionnaire programmatically (Management API)
Use this path when you want the form to live in code, ship via CI, or be
authored by an LLM. Endpoint:

  POST https://verification.didit.me/v3/questionnaires/
  Headers:  x-api-key: <your-api-key>
            Content-Type: application/json

Required body:
- title              — internal questionnaire name (string).
- languages          — array of locale codes; MUST include "en".
- default_language   — the default locale (string, e.g. "en").
- form_elements      — ordered array of questions (≥1 entry).

Each form element requires id, element_type (lowercase OR uppercase enum
— "short_text", "multiple_choice", "email", "file_upload", "date_picker",
etc.), and a translated label keyed by locale. For dropdown,
single_choice, and multiple_choice add options: [{ value, label }].

Hard constraints:
- This endpoint supports SIMPLE LINEAR questionnaires only. Do NOT send
  graph, branches, next, required_if, or conditional rules — use the
  Console (section 2a) for those.

Example body:
{
  "title": "Customer Onboarding",
  "languages": ["en"],
  "default_language": "en",
  "form_elements": [
    {
      "id": "occupation",
      "element_type": "short_text",
      "label": { "en": "What is your occupation?" },
      "is_required": true
    },
    {
      "id": "source_of_funds",
      "element_type": "multiple_choice",
      "label": { "en": "Source of funds" },
      "is_required": true,
      "options": [
        { "value": "employment", "label": { "en": "Employment" } },
        { "value": "business", "label": { "en": "Business" } },
        { "value": "investments", "label": { "en": "Investments" } }
      ]
    }
  ]
}

Response includes questionnaire_id — store it; you'll use it as
questionnaire_uuid when you wire the questionnaire into a workflow in
section 3 below. Full reference:
https://docs.didit.me/management-api/questionnaires/create

## 3. Two integration paths — pick one

### Path A — Workflow Builder (hosted UI, recommended)
Best when you want Didit to host the form, the file-upload UX, the
multi-language routing, the keyboard handling, and the mobile responsive
layout.

1. Create a workflow that contains the QUESTIONNAIRE feature:
   POST https://verification.didit.me/v3/workflows/
   Authorization header:  x-api-key: <your-api-key>
   Body: workflow_label, features array with the entry
         { feature: "QUESTIONNAIRE", questionnaire_id: "<id>" }
         (UPPERCASE — strict enum)
   Optional: chain QUESTIONNAIRE after ID_VERIFICATION + LIVENESS in the
   same workflow to collect Source of Funds as part of a full Know Your Customer (KYC).

2. Create a verification session for an end user:
   POST https://verification.didit.me/v3/session/
   Body: workflow_id (from step 1), vendor_data (your own user id).
   Response: session_url — redirect the user to it.

3. Listen for webhook callbacks (see "Webhooks" below).

### Path B — Standalone Questionnaire Verification
Run a questionnaire as its own verification — no KYC required.
Use a workflow whose only feature is QUESTIONNAIRE. Everything else is
identical to Path A. Useful for ongoing-due-diligence pulses,
post-onboarding declarations, periodic re-attestations.

## 4. Webhooks
- Register a webhook destination once via
  POST https://verification.didit.me/v3/webhook/destinations/
  Body: url, subscribed_events: ["session.verified", "session.review_started",
                                  "session.declined"]
- Response includes secret_shared_key — store it.
- Every webhook delivery carries an X-Signature-V2 header you MUST verify
  before trusting the payload.  HMAC-SHA256 verification MUST run against the raw body bytes (the raw payload as Didit sent it) BEFORE any JSON parsing — re-serialising the parsed body changes whitespace and key order, which invalidates the signature.Algorithm:
    1. sortKeys(payload) recursively
    2. shortenFloats (truncate trailing zeros after the decimal point)
    3. JSON.stringify the result
    4. HMAC-SHA256 with the secret_shared_key
    5. Hex-encode, compare to the X-Signature-V2 header.

## 5. Element catalog (use these in the builder)
Input elements:
  SHORT_TEXT, LONG_TEXT, NUMBER, EMAIL, PHONE, ADDRESS, DATE_PICKER, TIME
Choice elements:
  DROPDOWN, SINGLE_CHOICE, MULTIPLE_CHOICE, COUNTRY, CONSENT
  - DROPDOWN and SINGLE_CHOICE support per-option requires_text_input —
    selecting "Other" can demand a free-text follow-up.
Upload elements:
  IMAGE, FILE_UPLOAD
  - max_files (1-5) per element.
Layout elements:
  PARAGRAPH, SECTION_HEADER, SEPARATOR (read-only, not answerable).

## 6. Reading the report
The session report contains a questionnaire_responses array (one entry
per questionnaire step in the workflow graph). Each entry has:
- node_id: identifies the questionnaire step in the workflow graph
- questionnaire_id: which questionnaire this response is for
- title, description, languages, default_language, is_active
- sections: array of { title, description, items[] }
- each item: { uuid, order, element_type, is_required, title,
              description, placeholder, choices, max_files, answer }
- answer: { value, text, files[] } — only the fields relevant to the
  element_type are present.
- status: "Approved" | "In Review" | "Not Finished"

Status semantics:
- Not Finished — user has not completed the questionnaire yet.
- In Review — submitted, pending manual review. The Console flag
  "force manual review" pins every response to this state until a human
  approves it.
- Approved — reviewed and accepted.

Note: questionnaires do NOT emit risk warnings. Governance is achieved
through required fields, validation, manual review, and the workflow
graph (branching nodes route compliance-sensitive answers to In Review).

## 7. Hard rules — do not change
- Base URL for /v3/* endpoints is verification.didit.me (NOT apx.didit.me).
- Feature enum is UPPERCASE: QUESTIONNAIRE, ID_VERIFICATION, LIVENESS,
  FACE_MATCH, AML, IP_ANALYSIS.
- Element type enums are UPPERCASE + underscored: SHORT_TEXT, LONG_TEXT,
  FILE_UPLOAD, SINGLE_CHOICE, etc.
- Auth header is x-api-key (lowercase, hyphenated).
- Webhook signature header is X-Signature-V2 (NOT X-Signature).
- Always verify webhook signatures before trusting payload data.
- Status casing matches exactly: "Approved", "In Review", "Not Finished"
  (title-cased, space-separated).

## 8. Pricing reference (public)
- $0.10 per questionnaire submission (Path A or Path B).
- No minimums. No per-language surcharge. No per-element surcharge.
  Conditional branching, file uploads, manual review — all included at
  the same per-submission price.

## 9. Verify your integration
- Sandbox starts on signup at https://business.didit.me — no separate flag.
- Use one of the pre-built templates (Source of Funds, Employment
  Details, Purpose of Account, Beneficial Ownership, Tax Residency, Risk
  Assessment) to ship a draft in under a minute, then customise.
- Switch to live: flip the application's environment toggle in console.

When in doubt: https://docs.didit.me/core-technology/questionnaires/overview
Need more context? See the full module docs.docs.didit.me →
Compliant by design

Open a new country in one click. We do the hard work.

We open the local subsidiaries, secure the licenses, run the penetration tests, earn the certifications, and align with every new regulation. To ship verifications in a new country, flip a toggle. 220+ countries live, audited and pen-tested every quarter — the only identity provider an EU member-state government has formally called safer than in-person verification.
Read the security & compliance dossier
EU financial sandbox
Tesoro · SEPBLAC · BdE
ISO/IEC 27001
Information security · 2026
SOC 2 · Type I
AICPA · 2026
iBeta Level 1 PAD
NIST / NIAP · 2026
GDPR
EU 2016/679
DORA
EU 2022/2554
MiCA
EU 2023/1114
AMLD6 · eIDAS 2.0
EU-aligned by design

Proof numbers

Proof numbers
  • 0
    Element types — input, choice, upload, layout.
  • 0
    Pre-built templates including Source of Funds.
  • $0.00
    Per questionnaire submission, any pattern.
  • 0
    Free verifications every month, forever.
Three tiers, one price list

Start free. Pay per usage. Scale to Enterprise.

500 free verifications every month, forever. Pay-as-you-go for production. Custom contracts, data residency, and SLAs (Service Level Agreements) on Enterprise.
Free

Free

$0 / month. No credit card required.

  • Free KYC bundle (ID Verification + Passive Liveness + Face Match + Device & IP Analysis) — 500 / month, every month
  • Blocklisted Users
  • Duplicate Detection
  • 200+ fraud signals on every session
  • Reusable KYC across the Didit network
  • Case Management Platform
  • Workflow Builder
  • Public docs, sandbox, SDKs, MCP (Model Context Protocol) server
  • Community support
Most popular
Pay per usage

Usage Based

Pay only for what you use. 25+ modules. Public per-module pricing, no monthly minimum fee.

  • Full KYC at $0.33 (ID + Biometric + IP / Device)
  • 10,000+ AML datasets — sanctions, PEPs, adverse media
  • 1,000+ government data sources for Database Validation
  • Transaction Monitoring at $0.02 per transaction
  • Live KYB at $2.00 per business
  • Wallet Screening at $0.15 per check
  • Whitelabel verification flow — your brand, our infrastructure
Enterprise

Enterprise

Custom MSA & SLA. For large volumes and regulated programs.

  • Annual contracts
  • Custom MSA, DPA, and SLA
  • Dedicated Slack and WhatsApp channel
  • Manual reviewers on demand
  • Reseller and white-label terms
  • Exclusive features and partner integrations
  • Named CSM, security review, compliance support

Start free → pay only when a check runs → unlock Enterprise for a custom contract, SLA, or data residency.

FAQ

Common questions

Infrastructure for identity and fraud.

One API for KYC, KYB, Transaction Monitoring, and Wallet Screening. Integrate in 5 minutes.

Ask an AI to summarise this page