Quickstart · API REST
Integra DSI ⓥerify en 4 pasos
Descripción y tipos de datos a la izquierda · request y response a la derecha. Cambia de stack con las pestañas.
Genera tus credenciales
Para que tu sistema pueda hablar con la API, necesitas una API key. Es la contraseña que identifica a tu sistema.
Cómo generarla
- Entra al panel admin · verify.dsi-mx.com.mx/admin
- Configuración → API Keys
- Click en "Generar nuevo API key"
- Ponle nombre (ej. "Backend producción") y crea
⚠ Cópialo al momento. Es la única vez que verás el key completo. Después solo verás el prefijo y los últimos 4 caracteres.
Guárdalo en variables de entorno o un secrets manager. Nunca en frontend.
Crea una verificación
Llamas POST /api/v1/sessions. Te devolvemos un id y una url única que compartes con tu cliente.
Datos que envías
| Campo | Tipo · Ejemplo | Requerido | Default | Descripción |
|---|---|---|---|---|
tipo_documento |
string · enum ej. "ine" |
Opcional | "ine" |
ine, pasaporte_mx, pasaporte_extranjero |
return_url |
string · URL ej. "https://miempresa.com/exito" |
Opcional | null |
Botón "Volver al sitio" al final apunta aquí. Máx 500 chars. |
webhook_url |
string · URL HTTPS ej. "https://miempresa.com/webhooks/dsi" |
Opcional | null |
POST automático con el resultado al terminar. Máx 500 chars. |
metadata |
object ej. {"customer_id":"CLI-12345"} |
Opcional | null |
Cajita libre con TUS datos para identificar la sesión cuando llegue el webhook.
DSI no la lee ni la modifica — solo la guarda y te la regresa intacta.
Ejemplo más completo: {
"customer_id": "CLI-12345",
"order_id": "ORD-2026-9988",
"source": "app-movil"
}
|
expires_in |
integer · seg ej. 3600 |
Opcional | 86400 |
Vigencia. Min 300, max 604800. |
Datos que recibes
| Campo | Tipo · Ejemplo | Descripción |
|---|---|---|
id |
string · ULID 26 chars ej. "01KQB7ZDTPJCNFGCHFV86B6R21" |
Guárdalo — lo usas en el Paso 4 |
reference |
string ej. "KYC-VVYW4YYJF6" |
Referencia interna corta |
url |
string · URL ej. "https://verify.dsi-mx.com.mx/?token=01KQB..." |
Compártela con tu cliente |
hosted_url |
string · URL | Alias de url |
status |
string · enum ej. "requires_input" |
Inicial: requires_input |
expires_at |
string · ISO 8601 ej. "2026-04-30T05:01:51Z" |
Cuándo expira la sesión |
metadata |
object · null ej. {"customer_id":"CLI-12345"} |
Lo que mandaste, intacto |
created_at |
string · ISO 8601 ej. "2026-04-29T05:01:51Z" |
Timestamp de creación |
El usuario completa el flow
Tu cliente abre la URL y completa solo:
- Selecciona tipo de documento
- Toma foto del frente del documento
- Toma foto del reverso (solo INE)
- Toma una selfie
- Espera ~10 seg mientras el motor valida
- Ve su resultado
Mientras esto pasa, no haces nada. Tu sistema espera. Consulta después (Paso 4) o configura webhook (Paso 5).
Revisa la respuesta
Llamas GET /api/v1/sessions/{id} con el id del Paso 2. Devolvemos el estado y, si terminó, el resultado completo.
Datos que envías
Solo el path param id y el header Authorization. Sin body.
Datos que recibes
| Campo | Tipo · Ejemplo | Cuándo | Descripción | ||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id |
string · ULID ej. "01KQB7ZDTPJCNFGCHFV86B6R21" |
siempre | El mismo de la sesión | ||||||||||||||||||||||||||||||||
reference |
string ej. "KYC-VVYW4YYJF6" |
siempre | Referencia interna corta | ||||||||||||||||||||||||||||||||
url |
string · URL ej. "https://verify.dsi-mx.com.mx/?token=01KQB..." |
siempre | URL hosteada | ||||||||||||||||||||||||||||||||
status |
string · enum ej. "verified" |
siempre | requires_input, verified, requires_review, rejected |
||||||||||||||||||||||||||||||||
expires_at |
string · ISO 8601 ej. "2026-04-30T05:01:51Z" |
siempre | Cuándo expira la sesión | ||||||||||||||||||||||||||||||||
metadata |
object · null ej. {"customer_id":"CLI-12345"} |
siempre | Lo que mandaste al crear, intacto | ||||||||||||||||||||||||||||||||
created_at |
string · ISO 8601 | siempre | Timestamp de creación | ||||||||||||||||||||||||||||||||
updated_at |
string · ISO 8601 | siempre | Última modificación | ||||||||||||||||||||||||||||||||
result |
object | solo si terminó |
Bloque con el resultado completo de la verificación.
|
||||||||||||||||||||||||||||||||
webhook |
object | si webhook configurado |
Estado del envío del webhook al cliente:
|
Bonus · Recibir resultado por webhook
En el Paso 4 usaste pull (tú preguntas). Ahora push — nosotros te avisamos automáticamente cuando termina.
⚠ Tú construyes el endpoint receptor. El webhook es una llamada que nosotros hacemos a tu servidor — necesitas exponer una URL pública.
Headers que mandamos
| Header | Tipo | Descripción |
|---|---|---|
X-DSI-Signature | string · base64 | HMAC-SHA256 sobre "{ts}.{raw_body}" |
X-DSI-Timestamp | string · Unix epoch | Anti-replay (rechaza fuera de 5 min) |
X-DSI-Event | string | Hoy: session.completed |
User-Agent | string | DSIVerify-Webhook/1.0 |
Body que mandamos
| Campo | Tipo | Descripción |
|---|---|---|
event | string | Hoy: session.completed |
created_at | string · ISO 8601 | Cuándo se generó |
session_id | string · ULID | El id de la sesión |
reference | string | Referencia interna |
status | string · enum | verified, rejected, requires_review |
score | integer · 0-100 | Puntaje agregado |
metadata | object · null | Lo que mandaste al crear |
titular | object | Mismos campos que GET result.titular |
⚠ Crítico: tu endpoint siempre debe validar la firma HMAC antes de procesar. Sin esto, cualquiera puede mandarte requests falsos.
Reintentos
Si tu endpoint NO devuelve 2xx en 15 seg, reintentamos hasta 4 veces con backoff: 1m → 5m → 15m → 1h.
Reentrega manual
POST /api/v1/sessions/{id}/redeliver reagenda el envío. Útil si tu servidor estaba caído.
Referencia · Estados del webhook
El campo webhook.status en GET /sessions/{id} refleja el estado de delivery del último intento de entrega. Los errores de cada endpoint se documentan junto al endpoint correspondiente.