Claro
Comprueba quién solicita información y qué necesita exactamente.
Datos fiables, compartidos con control
Verifícate en tu teléfono, comprueba exactamente qué se solicita y aprueba antes de compartir nada.
Por ejemplo:
Consulta la solicitud
El servicio inicia una solicitud de Verihop. Completas la verificación guiada, revisas los datos solicitados y continúas donde lo dejaste.
Un servicio solicita datos concretos. Te verificas en el teléfono, revisas la solicitud y apruebas compartirlos. Al terminar, vuelves al servicio.
Qué puedes esperar
Comprueba quién solicita información y qué necesita exactamente.
Las verificaciones compatibles completadas no pasan por una cola habitual de revisión.
Usa una verificación guardada y válida cuando el servicio la acepte.
Aprueba solo los datos solicitados.
Empieza desde un enlace de Verihop o código QR. Verás quién solicita datos y cuáles necesita antes de compartir nada.
Verihop muestra el servicio solicitante y los datos exactos que necesita.
Sigue las comprobaciones guiadas de documento de identidad y titular en vivo disponibles para la solicitud.
Aprobar la solicituded details and continue where you left off.
Creado para la vida real
Edad
Confirma tu edad y continúa.
Alquileres y servicios
Comparte los datos verificados solicitados.
Alta de cuentas
Completa la comprobación y vuelve directamente al servicio.
Acceso a la cuenta
Verifícate para acciones sensibles, asistencia o recuperación de cuenta.
¿Estás creando una de estas experiencias? Descubre cómo funciona Verihop para empresas, integraciones y recorridos de cliente. Ver PARA EMPRESAS →
Tú decides
Comprobar el documentoLee la MRZ y el chip seguro cuando sea compatible.
Comprobar al titularUtiliza prueba de vida guiada y comparación facial para la verificación activa.
Aprobar la solicitudEl servicio recibe los datos que apruebas.
Cuando quieras
Prueba la demo de control de edad, revisa los datos exactos solicitados y completa el flujo en el teléfono.
API de identidad personal
Crea una sesión. Envía la URL de inicio. Obtén el resultado aprobado. Nos encargamos de la verificación, el consentimiento y el dispositivo.
¿Buscas la visión de producto y negocio? Ver PARA EMPRESAS →
PASOS DE INTEGRACIÓN
POST /v1/sessions
Usa launch_url o qr_url; las apps nativas de iOS abren app_clip_url sin cambios.
session_id + result_token
GET /v1/sessions/{id}/result
Intercambio de un solo uso en tu backend.
Opcional: consulta el estado GET /v1/sessions/{id}
Las claves API permanecen en tu backend. Los datos personales verificados no se incluyen en las URL de callback.
Una sesión controlada por tu backend inicia el flujo; la información de identidad aprobada se obtiene de servidor a servidor.
Prueba en el Customer Portal
Usa una cuenta de prueba para elegir los campos solicitados, configurar un callback, ejecutar el Session Ejemplo e inspeccionar la solicitud, respuesta, estado de sesión y resultado estructurado reales.
Skill de integración para agentes
Una fuente segura para la configuración de pruebas, sesiones del servidor, callbacks, resultados, comportamiento de apertura y patrones concisos para Node, Python, Swift, Kotlin, Java, Go, PHP, Ruby y cURL.
Colección de Postman
Prueba la colección con una clave Test. Conserva la clave de idempotencia para los reintentos y obtén el resultado una sola vez desde tu backend.
Los valores de ejemplo no son credenciales reutilizables. Usa las URL, los identificadores y los plazos devueltos realmente.
URL base: https://api.verihop.com
Autentica las requests de partner solo desde tu backend:
Authorization: Bearer <api_key>
Las solicitudes GET no tienen cuerpo. Usa la clave Test o Live correspondiente para consultar el estado y el resultado; JWKS no requiere clave API.
Crea primero una cuenta de prueba para obtener una API key. Las respuestas de prueba están redactadas por diseño y la misma cuenta puede activarse después para producción.
Test oculta los valores personales devueltos; las comprobaciones del teléfono siguen tratando datos de identidad. El acceso Live requiere aprobación separada del uso, los campos, el callback y la activación.
/v1/sessionsCreate a verification session and receive the public launch fields.
Los ejemplos usan una clave Test. Los ajustes de verificación Live se proporcionan al activar tu cuenta.
Este ejemplo solicita datos personales y documentales de un documento de identidad o un pasaporte; no exige ambos.
expires_at devuelto como plazo absoluto. Abrir el enlace o continuar la verificación nunca amplía este plazo.Authorization: Bearer <api_key>
Content-Type: application/json
Idempotency-Key: <uuid>
{
"app": "RideNow",
"header": "Identity details",
"fields": ["legalName", "over18", "documentNumber", "documentExpiry"],
"allowedDocuments": ["idCard", "passport"],
"callback": "https://partner.example/verihop/callback"
}
app: nombre visible de la app partner dentro de Verihop (máx. 80 caracteres).header: título corto de verificación mostrado al usuario (máx. 120 caracteres).fields: Indica los tokens del catálogo que necesitas. Una lista omitida o vacía no solicita campos.allowedDocuments: Lista opcional de tipos admitidos: passport, idCard, driverLicense o residencePermit. Omítela para aceptar cualquier tipo de documento admitido; no envíes un array vacío.callback: URL base de retorno enviada en POST /v1/sessions. Verihop la abre al terminar y añade session_id, result_token (success path) y opcionalmente callback_jwt; requerida y validada contra tu allowlist de producción.fields says which verified values you request. allowedDocuments says which document types may provide evidence.
{
"fields": ["legalName", "over18"],
"allowedDocuments": ["passport", "idCard"]
}
This means Passport OR ID Card is eligible. It does not require both. The user chooses the concrete document used by each relevant section in the Verihop app.
passport, idCard, driverLicense, and residencePermit are cumulative document-type assertions (AND). A request such as ["legalName", "passport", "idCard"] requires Passport + ID Card.documentNumber, documentExpiry, documentCountry, and documentNationality are one detail bundle. With explicit required types, they apply to each compatible required contributor; without one, the holder chooses one eligible document for the whole bundle. Driving licences do not supply documentNationality.type is not a unique identifier; receipt-backed partner evidence is distinguished by receiptId.documentNationality is also invalid.Authorization: API key partner en formato bearer.Content-Type: usa application/json para parsear el request body.Idempotency-Key: Recomendada para reintentar la creación. Genera un UUID por intento nuevo y reutilízalo solo con el mismo cuerpo de solicitud.201 correcta{
"session_id": "sess_123",
"expires_at": 1893456900,
"launch_url": "https://www.verihop.com/verify.html?session_id=sess_123&token=h_example123456789",
"app_clip_url": "https://appclip.apple.com/id?p=KycBox.VerifyBox.Clip&session_id=sess_123&token=h_example123456789",
"qr_url": "https://www.verihop.com/verify.html?session_id=sess_123&token=h_example123456789",
"status_url": "https://api.verihop.com/v1/sessions/sess_123"
}
session_id: identificador único para tracking y obtención del resultado.expires_at: expiración de sesión (Unix epoch seconds).launch_url: URL principal para web, Android, QR, emails, SMS y handoff general.app_clip_url: URL nativa directa del App Clip para apps partner de iOS. Ábrela exactamente como se devuelve; no la reconstruyas.qr_url: URL segura para QR; actualmente equivalente a launch_url.status_url: endpoint de estado de sesión para polling server-side.401 missing_bearer_token, 401 invalid_api_key403 customer_inactive400 missing_callback_url, invalid_callback_url, callback_host_not_allowed400 field_not_allowed, invalid_field_token, invalid_allowed_documents409 idempotency_key_conflict, idempotency_key_in_progress, idempotency_key_expired413 request_too_large429 rate_limit_exceeded, daily_quota_exceeded/v1/sessions/{id}Opcional: consulta el progreso sin obtener datos personales.
Authorization: Bearer <api_key>
200 correcta{
"session_id": "sess_123",
"status": "issued",
"issued_at": 1893456000,
"expires_at": 1893456900,
"last_status": null,
"last_status_at": null,
"opened_at": null,
"result_available": false,
"result_token_expires_at": null
}
Una sesión completada puede mostrar status: "used" y last_status: "success". result_available indica que se guardó un resultado; puede seguir siendo true tras consumirlo o caducar. Obtén el resultado una sola vez antes de su vencimiento.
Consultar el estado es de solo lectura y no marca la sesión como abierta. Una sesión completada con clave Test también incluye result_token para obtener el resultado redactado en Postman. Los tokens Live llegan mediante el callback.
/v1/sessions/{id}/resultObtén la result payload verificada server-to-server usando un result token de un solo uso.
A launch token starts with h_ and cannot be used here. X-Result-Token requires the short-lived res_ token from a live callback or completed test-key status response.
Authorization: Bearer <api_key>
X-Result-Token: <result_token>
200 correctaRespuesta Test ilustrativa para la solicitud anterior: el usuario eligió un documento de identidad. Los valores personales están redactados; los identificadores y las fechas son ejemplos.
{
"session_id": "sess_123",
"status": "success",
"result": {
"legalName": "XXXTEST_USERXXX",
"over18": "XXXTEST_USERXXX"
},
"personalDetailsDocument": {
"type": "idCard",
"issuingCountry": "ESP",
"receiptId": "dr_AAAAAAAAAAAAAAAAAAAAAAAA"
},
"documents": [
{
"type": "idCard",
"issuingCountry": "ESP",
"receiptId": "dr_AAAAAAAAAAAAAAAAAAAAAAAA",
"details": {
"documentNumber": "XXXTEST_USERXXX",
"documentExpiry": "XXXTEST_USERXXX"
}
}
]
}
result contains requested Personal Details only. personalDetailsDocument identifies the verified document selected by the user as their Personal Details source. The same document also appears in documents[]; that duplication is deliberate and is not an additional verification.
Los resultados de solo documentos omiten personalDetailsDocument.
documents[] contains every unique document that supported the Session: the Personal Details source, generic Document Details source, and each exact required-document source. Every entry contains type, issuingCountry, receiptId, and details. When no document details were requested, details is {}. Internal field attribution is never exposed.
receiptId remite a la evidencia histórica de verificación de ese documento.documents[].receiptId independently with GET /v1/document-receipts/{receipt_id}. There is no combined receipt endpoint or combined JWS.410 result_token_expired; la lectura y verificación de recibos siguen siendo independientes.verified_at; reuse is not represented as a new document verification.Test mode preserves this exact structure and redacts only actual Personal Details and document-detail values with XXXTEST_USERXXX. It does not redact type, issuingCountry, receiptId, or structural keys.
401 missing_bearer_token, invalid_api_key, missing_result_token403 customer_inactive, api_key_environment_mismatch, invalid_result_token410 result_token_expired409 result_token_used404 result_not_available, session_not_found503 document_receipt_unavailable/.well-known/jwks.jsonClaves públicas para verificar JWT de callback y Document Receipts.
No requiere clave API. La caché dura 300 segundos. Verifica las firmas y los claims en tu backend; detén la verificación si falla la obtención de claves o la clave es desconocida.
200 correcta{
"keys": [
{
"kty": "RSA",
"kid": "example-key-id",
"alg": "RS256",
"use": "sig",
"n": "...",
"e": "AQAB"
}
]
}
DOCUMENT RECEIPTS · OPCIONAL
/v1/document-receipts/{receipt_id}Retrieve an already-issued Document Receipt from your partner backend. Persistent retrieval is an optional extension to the four-step Sessions integration.
Authorization: Bearer <api_key>
receiptId devueltos por GET /v1/sessions/{id}/result para obtenerlos.dr_.... Internal receipt identifiers and data-model terminology are not part of the public contract.200 correcta{
"receiptId": "dr_AAAAAAAAAAAAAAAAAAAAAAAA",
"receiptVersion": 1,
"issuedAt": "2026-09-11T12:00:00.000Z",
"document": {
"type": "idCard",
"issuingCountry": "ESP"
},
"receipt": "eyJhbGciOiJSUzI1NiIsImtpZCI6InZocmNwdC1yczI1Ni0yMDI2MDkxMS0wMSIsInR5cCI6InZlcm...eyJyZWNlaXB0X3ZlcnNpb24iOjEsInZlcmlmaWNhdGlvbiI6ey4uLn19.signature-placeholder"
}
The abbreviated signature above is a display placeholder, not a cryptographically valid sample receipt. receipt contains the original compact signed JWS, not a URL. The response identifies the document by type and issuing country without identity PII.
dr_ identifier does not authorize access.404 document_receipt_not_found.verihop_v1 methodology and signature verificationThe partner-facing methodology is verihop_v1, version 1. Verihop obtains document information from the supported document, runs its holder-verification flow, checks liveness, and matches the presented person against the document-holder evidence.
verified, holder verification passed, and liveness passed.Decodificar una JWS compacta no verifica la firma. Verifica en tu backend con el endpoint JWKS de Verihop configurado. Exige alg=RS256, typ=verihop-document-receipt+jwt, un kid conocido para recibos, el issuer configurado y la audience de tu configuración de confianza. No tomes una URL de claves, una audience esperada o una decisión de confianza del token sin verificar. Las claves de callback y Document Receipt tienen finalidades separadas.
400 invalid_document_receipt_id401 missing_bearer_token, 401 invalid_api_key403 customer_inactive, 403 api_key_environment_mismatch404 document_receipt_not_found409 document_receipt_revoked, 423 document_receipt_held, 410 document_receipt_erased503 document_receipt_verification_unavailable, 503 document_receipt_unavailablefields)legalName, dateOfBirth, over18, over21, passport, idCard, driverLicense, residencePermit, documentNumber, documentExpiry, documentCountry, documentNationality
result contiene los datos personales solicitados: legalName, dateOfBirth, over18 y over21. Los atributos documentales solicitados aparecen en documents[].details. Los requisitos de tipo como passport e idCard exigen esos documentos; no añaden un booleano a result ni todos sus atributos.
Sí. Tu backend crea una sesión mediante POST /v1/sessions y muestra la qr_url devuelta dentro de un QR en la página de escritorio. El usuario escanea ese QR con el teléfono y Verihop abre la mejor experiencia disponible.
La mejor experiencia es el inicio directo: codifica la qr_url devuelta. Es el mismo traspaso HTTPS universal que launch_url y admite rutas de app, experiencia ligera y fallback web.
Usa launch_url en Android y para el handoff web general. Una app partner de iOS que quiera mostrar la tarjeta nativa del App Clip debe abrir la app_clip_url devuelta. La forma del callback no cambia: Verihop añade session_id, en caso de éxito result_token y opcionalmente callback_jwt.
Crea la sesión en tu backend y envía la app_clip_url devuelta a tu app iOS. Abre esa URL con SwiftUI Link o UIApplication.open en iOS 17 o posterior. No analices launch_url, no copies su token ni fijes en código el bundle ID del App Clip de Verihop. Si la app completa de Verihop está instalada, iOS la abre conservando la misma sesión.
Si usas un callback personalizado como ridenow://verified, la app Android partner debe declarar un intent filter para ese scheme y host. Si usas un callback https:// para flujos iniciados desde desktop o web, trátalo como un endpoint de backend salvo que tu app Android sea dueña de ese dominio con App Links verificados.
Usa una URL de retorno https:// en tu backend. Verihop la abre en el teléfono con session_id y, en caso de éxito, result_token en la query. Es el retorno del usuario, no un webhook entre servidores. Tu backend valida la sesión almacenada y obtiene GET /v1/sessions/{id}/result. La página de escritorio puede consultar a tu backend si terminó.
No. La creación devuelve campos de orquestación y URL opacas de lanzamiento, no un JWT ni datos privados de identidad. Abre la URL devuelta sin modificarla.
Un retorno correcto incluye session_id y result_token, además de callback_jwt si está habilitado. Algunos flujos añaden metadatos de estado u origen. No son resultados personales ni una prueba de verificación. Valida la sesión, verifica cualquier JWT de callback recibido y obtén el resultado aprobado en tu backend.
callback_jwt, y dónde?Sí, en el backend del partner cuando esté presente. Verifica firma y claims con Verihop JWKS en GET /.well-known/jwks.json. Valida issuer, audience y expiry, y asegúrate de que los claims JWT coincidan con los valores del callback.
No. Mantén las API keys en servidor y obtén resultados solo desde tu backend. El frontend/web client solo debe manejar UI y pasar estado a la sesión de backend.
Primero reconcilia un canje consumido, caducado o incierto. Nunca reintentes automáticamente result GET ni crees otra Session. Solo una nueva acción expresa inicia otro intento.
Abre la launch_url o qr_url devuelta; la página alojada guía al usuario hacia la app, el App Clip o la instalación admitida. En Android puede volver tras instalar y tocar Open Verihop mientras la sesión siga vigente. No crees una sesión nueva solo por necesitar la instalación. Tras caducar, el usuario inicia expresamente otro intento.
POST /v1/sessions soporta Idempotency-Key para llamadas create-session seguras ante retries: la misma key con la misma payload reproduce la respuesta original, mientras que la misma key con una payload distinta devuelve 409 idempotency_key_conflict. El abuso se mitiga además con autenticación por API key, política de callback allowlist, validación de campos permitidos, rate limits/cuota por cliente, TTL corto de sesión y result_token de un solo uso.
Empieza en modo de prueba
Use a redacted cuenta de prueba, keep credentials on your backend, and move to production only after callback and field controls are approved.
Verificación de identidad centrada en la privacidad
Solicita datos de identidad o elegibilidad verificados. Los clientes completan la comprobación en su teléfono y aprueban lo que se comparte.
Por ejemplo:
sin fotos del documento ni archivos de selfies.
De la comprobación a datos fiables
Un servicio solicita datos concretos. El cliente se verifica en su teléfono, revisa la solicitud y aprueba compartirlos. El servicio recibe el resultado aprobado.
Por qué importa
La verificación debe ayudar a los clientes a continuar, sin convertir una decisión en otro archivo de documentos.
de los consumidores británicos encuestados había abandonado un proceso de apertura de cuenta.
FullCircl, State of Identity Verification 2025de las personas encuestadas en los Países Bajos dijo que nunca compartiría online una copia de su pasaporte, documento de identidad o permiso de conducir.
CBS, 2025En el mismo estudio de FullCircl, el alta duró una media de 35 minutos, 2,8 veces más de lo que querían los clientes. FullCircl, State of Identity Verification 2025
La autoridad neerlandesa de protección de datos registró 39.407 notificaciones de brechas de datos personales en 2025. Autoriteit Persoonsgegevens, 2026
Lo que ganas
Elige una ventaja para ver cómo funciona.
La lectura de MRZ y chip NFC apoya la comparación del titular.
La duración puede variar según el dispositivo, el documento y la conexión.
Una verificación satisfactoria devuelve el resultado sin una cola habitual de revisión manual.
Recibe campos aprobados, no la imagen del pasaporte ni el selfie del cliente.
Los clientes pueden aprobar una verificación guardada en su dispositivo cuando siga siendo válida y tu política la acepte.
Empieza por la decisión
Edad y elegibilidad
Solicita un resultado de edad verificado.
Alta de cuentas
Comprueba los datos que necesitas para decidir sobre el alta.
Alquileres y acceso
Verifica la identidad antes de conceder el acceso.
Recuperación de cuentas
Solicita una nueva comprobación para acciones sensibles.
Verihop verifica los datos aprobados. Tu empresa toma la decisión.
Customer Portal
Ejecuta sesiones con datos ocultos e inspecciona el flujo.
Envía tu configuración de producción y el alcance de campos a revisión.
Supervisa sesiones, callbacks, uso y acceso del equipo.
Empieza con un caso de uso
Cuéntanos tu recorrido de cliente y la decisión que necesitas tomar. Definiremos la solicitud mínima útil y cómo probarla.