> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Quick start: launch your first KYC verification flow

> Go from zero to live KYC verification in minutes. Create an account, build a workflow, launch a session, and receive webhooks. Pay-per-call from $0.30.

export const AgentPromptAccordion = ({prompt, title = "AI Agent Integration Prompt"}) => {
  const [copied, setCopied] = React.useState(false);
  const handleCopy = e => {
    e.stopPropagation();
    if (!prompt) return;
    navigator.clipboard.writeText(prompt.trim()).then(() => {
      setCopied(true);
      setTimeout(() => setCopied(false), 2000);
    });
  };
  const agents = ["Claude Code", "Codex", "Cursor", "Devin", "Windsurf", "GitHub Copilot"];
  return <div className="didit-agent-card">
      {}
      <div className="didit-agent-titlebar">
        <div className="didit-agent-dots" aria-hidden="true">
          <span className="didit-agent-dot didit-agent-dot-red"></span>
          <span className="didit-agent-dot didit-agent-dot-yellow"></span>
          <span className="didit-agent-dot didit-agent-dot-green"></span>
        </div>
        <span className="didit-agent-filename">{title}</span>
        <button type="button" className={`didit-agent-copy ${copied ? "didit-agent-copy-copied" : ""}`} onClick={handleCopy} title="Copy prompt to clipboard" aria-label={copied ? "Copied!" : "Copy prompt to clipboard"}>
          {copied ? <>
              <svg width="13" height="13" viewBox="0 0 16 16" fill="none">
                <path d="M3 8.5l3.5 3.5L13 4" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
              </svg>
              <span>Copied</span>
            </> : <>
              <svg width="13" height="13" viewBox="0 0 16 16" fill="none">
                <rect x="5" y="5" width="9" height="9" rx="1.5" stroke="currentColor" strokeWidth="1.5" />
                <path d="M11 5V3.5A1.5 1.5 0 0 0 9.5 2h-6A1.5 1.5 0 0 0 2 3.5v6A1.5 1.5 0 0 0 3.5 11H5" stroke="currentColor" strokeWidth="1.5" />
              </svg>
              <span>Copy</span>
            </>}
        </button>
      </div>

      {}
      <pre className="didit-agent-body"><code>{prompt.trim()}</code></pre>

      {}
      <div className="didit-agent-footer">
        <span className="didit-agent-footer-label">Paste into</span>
        <div className="didit-agent-chips">
          {agents.map(name => <span key={name} className="didit-agent-chip">{name}</span>)}
        </div>
      </div>
    </div>;
};

export const VideoEmbed = ({src, title = "Video", type = "iframe"}) => <div className={type === "iframe" ? "didit-video-embed" : "didit-video-embed didit-video-native"}>
    {type === "iframe" ? <iframe src={src} title={title} style={{
  width: "100%",
  height: "100%",
  border: 0,
  borderRadius: "12px"
}} allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowFullScreen /> : <video controls autoPlay muted loop playsInline src={src} title={title} style={{
  width: "100%",
  height: "auto",
  display: "block",
  borderRadius: "12px"
}} />}
  </div>;

<VideoEmbed src="https://www.youtube.com/embed/h0i9Q0-izcw?rel=0&playsinline=1" title="Didit Platform Overview & Quick Start" />

<AgentPromptAccordion
  title="Quick Start Prompt"
  prompt={`# Goal — ship your first Didit verification end-to-end

You are integrating Didit (https://docs.didit.me) into my project. Take me from zero to a working KYC / KYB flow: account, workflow, session, hosted UI, webhook, decision.

For the full canonical recipe (5K-token version covering SDK pick, webhook HMAC verification, every status, decision parsing), use:

https://docs.didit.me/integration/integration-prompt

That page has a "Copy Prompt" button — copy its prompt and follow it. The summary below is enough to bootstrap if you can't fetch the full prompt.

## My application context

<my_stack>
Stack: [framework + language, e.g. Next.js 15 + TypeScript]
Surface: [web | iOS | Android | React Native | Flutter | backend-only]
Use case: [KYC at signup | KYB at business onboarding | age gate | re-auth]
Database: [Postgres | MySQL | Mongo]
</my_stack>

## Steps

1. **Register programmatically (2 calls)** — \`POST https://apx.didit.me/auth/v2/programmatic/register/\` then \`POST https://apx.didit.me/auth/v2/programmatic/verify-email/\` with the 6-char code. Save \`response.application.api_key\` as \`DIDIT_API_KEY\`.

2. **Create a workflow** —
\`\`\`bash
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",
"workflow_type": "kyc",
"features": [
  {"feature": "OCR"},
  {"feature": "LIVENESS", "config": {"face_liveness_method": "PASSIVE"}},
  {"feature": "FACE_MATCH"},
  {"feature": "AML"}
]
}'
\`\`\`
Persist \`workflow.id\`.

3. **Create a 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": "$WORKFLOW_ID", "vendor_data": "user-42", "callback": "https://myapp.com/kyc/return"}'
\`\`\`
Response contains \`session_id\`, \`url\`, \`session_token\`. Redirect the user to \`url\` (or open in the SDK / an iframe).

4. **Register a webhook destination** — \`POST https://verification.didit.me/v3/webhook/destinations/\` with \`{"url": "...", "subscribed_events": ["status.updated","data.updated","user.status.updated","user.data.updated"], "webhook_version": "v3"}\`. Save the returned \`secret\`.

5. **Receive webhooks** — verify the \`X-Signature-V2\` header (HMAC-SHA256 of canonical JSON; see /integration/webhooks). De-dupe on \`event_id\`. Respond within 5 seconds. Apply decision to your DB based on \`status\`.

6. **Retrieve the decision (fallback)** — \`GET https://verification.didit.me/v3/session/{session_id}/decision/\`. V3 returns plural arrays (\`id_verifications[]\`, \`liveness_checks[]\`, \`face_matches[]\`, \`aml_screenings[]\`, ...). Never assume singular V2 fields.

## Failure modes
- Missing / wrong API key → \`401 {"detail": "Invalid or missing API key"}\` on verification.didit.me, \`403\` on apx.didit.me.
- Invalid \`workflow_id\` → \`400\`.
- Webhook handler slower than 5s → Didit retries with exponential backoff up to ~24h.

## Sources of truth (cross-check before shipping)
- /openapi-25.json — verification API
- /openapi-auth.json — programmatic auth
- /reference/data-models — V3 decision shape
- /integration/integration-prompt — canonical end-to-end prompt
`}
/>

<Steps>
  <Step title="Create your Didit account">
    1. Go to [business.didit.me](https://business.didit.me)
    2. Sign up with SSO or email and password
    3. Create your **Organization** — this is where your team manages workflows, API keys, and verification activity
  </Step>

  <Step title="Build a verification workflow">
    Navigate to **Workflows** in the sidebar and click **Create New**. Choose a workflow type:

    | Type                    | Description                                                                      |
    | ----------------------- | -------------------------------------------------------------------------------- |
    | **Simple Workflow**     | Steps run in a defined order — ideal for standard onboarding flows               |
    | **Node-Based Workflow** | Flexible branching logic — build conditional paths based on verification results |

    Pick a template to get started:

    | Template                      | Use case                          |
    | ----------------------------- | --------------------------------- |
    | **KYC**                       | Standard user onboarding          |
    | **Adaptive Age Verification** | Selfie age check with ID fallback |
    | **Biometric Authentication**  | Passwordless selfie re-auth       |
    | **Address Verification**      | Proof of address flow             |

    Customize by toggling blocks: Liveness, Face Match, AML, NFC, Phone, Email, and more.

    <VideoEmbed src="https://didit.me/docs/create-workflow.mp4" title="Workflow Builder" type="video" />
  </Step>

  <Step title="Configure webhook and copy API key">
    Go to **API & Webhooks** in the sidebar:

    1. Add your **Webhook URL** — Didit sends status updates here
    2. Copy your **API Key** — keep it server-side only, never expose in frontend code
    3. Save the destination's **signing secret** as `DIDIT_WEBHOOK_SECRET` in your `.env` — it's required to verify the `X-Signature-V2` HMAC on incoming webhooks

    <Tip>
      You can **test webhooks directly** from this page with different data and statuses — no need to run a full verification. This lets you validate your integration is working correctly before going live.
    </Tip>
  </Step>

  <Step title="Start a verification session">
    **Option A — Hosted sessions** (recommended)

    Our preferred integration method. Hosted sessions are optimized with A/B testing for onboarding rate, speed, and security — plus AI-powered UX, charge optimization, and more.

    In the Console, click **"+"** → select a workflow → generate a link or QR code. Or create sessions programmatically:

    ```bash theme={null}
    curl -X POST https://verification.didit.me/v3/session/ \
      -H "x-api-key: YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"workflow_id": "your-workflow-id"}'
    ```

    <Note>
      Find your `workflow_id` under **Workflows** in the sidebar.
    </Note>

    <VideoEmbed src="https://didit.me/docs/create-session.mp4" title="Create Session" type="video" />

    **Option B — Standalone APIs** (advanced)

    Call endpoints directly from your backend — no session required. Best for server-to-server or custom flows:

    | Endpoint                     | Purpose            |
    | ---------------------------- | ------------------ |
    | `POST /v3/id-verification/`  | Document check     |
    | `POST /v3/face-match/`       | Selfie vs ID       |
    | `POST /v3/aml/`              | Sanctions & PEP    |
    | `POST /v3/passive-liveness/` | Deepfake detection |

    See the full list in [API Reference](/standalone-apis/id-verification).
  </Step>

  <Step title="Receive real-time results">
    Didit sends webhook events to your endpoint — no polling needed.

    | Event                        | Trigger                                               |
    | ---------------------------- | ----------------------------------------------------- |
    | `status.updated`             | User-session or business-session status changes       |
    | `data.updated`               | Session or business-session verification data changes |
    | `user.status.updated`        | Vendor user status changes                            |
    | `user.data.updated`          | Vendor user profile or aggregate data changes         |
    | `business.status.updated`    | Vendor business status changes                        |
    | `business.data.updated`      | Vendor business profile or aggregate data changes     |
    | `activity.created`           | Activity event recorded                               |
    | `transaction.created`        | Transaction created                                   |
    | `transaction.status.updated` | Transaction status changes                            |

    See [Webhooks](/integration/webhooks) for payload format and signature verification.
  </Step>

  <Step title="Manage and monitor">
    Use the Console to:

    * View session progress in real time
    * Download PDF/CSV reports for compliance
    * Blocklist suspicious IDs or faces
    * Manually update or reject sessions

    <VideoEmbed src="https://didit.me/docs/manage-and-monitor.mp4" title="Session Management" type="video" />
  </Step>
</Steps>

## Need help?

<CardGroup cols={2}>
  <Card title="WhatsApp" icon="comments" href="https://wa.me/+19544659728">
    Fastest response — reach us directly.
  </Card>

  <Card title="Email" icon="envelope" href="mailto:hello@didit.me">
    [hello@didit.me](mailto:hello@didit.me)
  </Card>
</CardGroup>
