> ## 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.

# Recorrido de verificación de usuarios: flujo KYC y UX

> Experiencia de verificación de Didit de principio a fin: captura del documento, prueba de vida, reintentos inteligentes y feedback en tiempo real.



Prompt del ciclo de vida de la sesión
        Copy prompt to clipboard



      
      

\<pre>

\````# Goal — drive a user through a full verification session

The session is the unit you build against. One `POST /v3/session/` returns a hosted URL; your user opens it; Didit runs the workflow; you receive a webhook with the decision.

For the complete recipe (SDK pick per platform, HMAC signature pipeline, decision parsing, every status), copy the canonical prompt at:

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

\## Session lifecycle at a glance

\| Phase | Trigger | What happens |
\|---|---|---|
\| Create | `POST https://verification.didit.me/v3/session/` | Returns `session_id`, `url`, `session_token`. Status = `Not Started`. |
\| User opens `url` | SDK / iframe / redirect | Status flips to `In Progress`. The hosted flow handles country, ID capture, liveness, retries. |
\| Processing | Didit backend | OCR, liveness, face match, AML, etc. run; per-feature plural arrays populate on the decision. |
\| Decision | `status.updated` webhook | One of `Approved`, `Declined`, `In Review`, `Awaiting User` (KYB resub), `Resubmitted`, `Abandoned`, `Expired`, `Kyc Expired`. |

\## 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"
}'
\```

Always pass `vendor_data` — it is the linking key that binds the session to the persistent [User entity](/entities/users/overview). Without it the session is orphaned.

\## Receive the decision

Webhook (recommended) — register a destination with `webhook_version: "v3"` subscribed to `status.updated` and `data.updated`. Verify the `X-Signature-V2` header (HMAC-SHA256 of canonical JSON).

Polling fallback —
\```bash
curl https://verification.didit.me/v3/session/$SESSION_ID/decision/ \
-H "x-api-key: $DIDIT_API_KEY"
\```

The V3 decision returns plural arrays for every feature: `id_verifications[]`, `liveness_checks[]`, `face_matches[]`, `aml_screenings[]`, `nfc_verifications[]`, `proof_of_address_checks[]`, etc. Never assume V2 singular fields.

\## Failure modes

\- Missing API key → `401 {"detail": "Invalid or missing API key"}`.
\- Invalid `workflow_id` → `400`.
\- User abandons the flow → status becomes `Abandoned`.
\- Workflow asks for resubmit → status `Resubmitted`, payload includes `resubmit_info`; re-deliver the same `url`.

\## Sources of truth

\- /sessions-api/create-session — request body schema
\- /sessions-api/retrieve-session — V3 decision schema
\- /integration/verification-statuses — literal status strings
\- /integration/webhooks — signature verification, retries
\- /reference/data-models — per-feature decision shape
\- /integration/integration-prompt — canonical end-to-end prompt````

\</pre>



      
      

Paste into

Esta guía explica qué experimenta un usuario final durante una sesión de **verificación de documento de identidad + prueba de vida**, y destaca las optimizaciones de UX que impulsan altas tasas de finalización.Esta lección de Didit Academy sigue el flujo alojado tal como lo ve el usuario: la primera pantalla, la captura del documento, el selfie de prueba de vida y cada pantalla de resultado, desde aprobado hasta rechazado.[Lo que tus usuarios ven realmente — Didit Academy](https://www.youtube.com/embed/LzGe-dMWjUw?rel=0\&playsinline=1)## Visión general del flujo![Recorrido de verificación de identidad de Didit: desde la pantalla de inicio, pasando por la captura del documento y del selfie, hasta el resultado](https://mintcdn.com/didit-0f962782/z6T2GHM4Zh-iSj-K/images/user-verification-flow.png?fit=max\&auto=format\&n=z6T2GHM4Zh-iSj-K\&q=85\&s=cc77846e25a476c7e91281295f079e80)**1. Pantalla de inicio**El usuario llega a una pantalla limpia y con tu marca que fija expectativas (por ejemplo, "Necesitarás tu documento de identidad y tu rostro"). Esto reduce el abandono al eliminar la incertidumbre.**2. Selección de país y documento**El usuario selecciona su país y el tipo de documento (pasaporte, documento de identidad, etc.).> [!NOTE]
>
> Si tu flujo de verificación (workflow) está configurado para un **único tipo de documento**, esta pantalla se **omite automáticamente** y el usuario pasa directamente a la captura.**3. Captura del documento con reintentos inteligentes**El usuario fotografía el anverso de su documento.
**Control de calidad en el dispositivo** - Antes de enviar, el SDK comprueba si hay reflejos, desenfoque o bordes cortados. Si detecta un problema, se le pide al usuario que repita la foto.**Validación en el backend con reintento guiado** - Una vez enviada:- **Correcta** → pasa a la prueba de vida
- **Fallida** → el usuario ve instrucciones concretas (por ejemplo, "Documento caducado", "MRZ ilegible: repite la foto con más luz") en lugar de un error genéricoEste bucle de reintento autoservicio aumenta de forma notable las tasas de aprobación. Consulta la lista completa de resultados de validación en [Advertencias de la verificación de identidad](https://docs.didit.me/core-technology/id-verification/warnings-id-verification.md).**4. Prueba de vida + coincidencia facial**Una prueba de vida con selfie garantiza que el usuario está presente físicamente y evita ataques de reproducción y deepfakes. Si el usuario no responde a tiempo, el proceso **se reintenta una vez automáticamente** en lugar de fallar de inmediato.**5. Resultado final**Cuando terminan todas las comprobaciones, el usuario ve uno de tres resultados:| Resultado | Descripción |
| - | - |
| **Aprobado** | Todas las comprobaciones se superaron. Los datos se extraen y están disponibles por API o webhook. |
| **Rechazado** | El sistema determinó que la verificación no se puede aprobar. |
| **En revisión** | Las comprobaciones automáticas no fueron concluyentes: requiere revisión manual. |Gracias a una UX inteligente, la validación progresiva, el feedback accionable y los reintentos fluidos, el recorrido de verificación de Didit mantiene en marcha a los buenos usuarios y deja fuera a los malos actores, sin intervención manual.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.