API de verificación

URL base: https://kyc.menteia.com/api/v1. Autentícate con el header x-api-key. Pide tu llave en contacto@menteia.com.

1 · Crear verificación

POST /api/v1/verifications
{
  "reference": "cliente-1024",          // requerido: tu id interno
  "metadata": { "canal": "whatsapp" },  // opcional
  "expected_details": {                 // opcional: validación cruzada
    "first_name": "Ana", "last_name": "López", "date_of_birth": "1990-04-12"
  }
}

201 → { "id": "uuid", "url": "https://…/session/…", "status": "Not Started" }

Envía el url a tu usuario (liga por WhatsApp, redirect o iframe con allow="camera; microphone; fullscreen").

2 · Consultar resultado

GET /api/v1/verifications/{id}          // ?full=1 incluye el detalle completo de cada validación
GET /api/v1/verifications?reference=cliente-1024

200 → {
  "id": "uuid", "reference": "cliente-1024",
  "status": "Approved", "approved": true,
  "result": {
    "document":   { "type": "Identity Card", "number": "…", "personal_number": "CURP…",
                    "first_name": "…", "last_name": "…", "date_of_birth": "…", "expiration_date": "…" },
    "liveness":   { "status": "Approved", "score": 97 },
    "face_match": { "status": "Approved", "score": 94 }
  },
  "registry": {                          // fuentes de autoridades
    "verdict": "valid",                  // valid | invalid | inconclusive | not_applicable
    "ine_lista_nominal": { "result": "valid" },
    "curp_renapo":       { "result": "valid" },
    "dob_mismatch": false                // fecha de nacimiento RENAPO ≠ documento
  }
}

Una verificación queda Approved solo si el documento, la prueba de vida y la comparación facial pasan y la credencial está vigente en la Lista Nominal del INE y la CURP es válida en RENAPO. Si un registro de gobierno no responde, queda In Review.

3 · Webhook (opcional)

Si registras una URL, te enviamos un POST en cada cambio de estado con {"event":"verification.updated","data":{…}} (el mismo objeto que el GET). Verifica la firma:

firma = HMAC_SHA256(tu_api_key, X-KYC-Timestamp + "." + body_crudo)  // hex
// compárala con X-KYC-Signature y rechaza timestamps con más de 5 min

Estados

statusSignificado
Not StartedSesión creada; el usuario aún no abre el enlace.
In ProgressEl usuario está completando el flujo.
In ReviewRequiere revisión manual.
ApprovedIdentidad verificada.
DeclinedRechazada (documento inválido, rostro no coincide, suplantación…).
ResubmittedSe pidió repetir un paso.
Abandoned / ExpiredNo se completó o expiró el enlace.
Kyc ExpiredLa verificación caducó por política de retención.

Toma la decisión de negocio solo con Approved. El redirect del usuario no es prueba de aprobación.