Verificación de Teléfono
La Verificación de Teléfono comprueba que un número de teléfono realmente pertenece a la persona que lo declara, usando una consulta de identity-match del operador. Compara el nombre, la dirección y la fecha de nacimiento del remitente con los datos que el operador móvil tiene para ese número y devuelve una puntuación de coincidencia. Úsala como señal antifraude durante el onboarding o antes de una primera transacción.
Esta comprobación es diagnóstica y explícita — nunca se ejecuta automáticamente desde el flujo de transacción y nunca reescribe el número de teléfono almacenado del remitente. Llámala cuando quieras hacer una comprobación.
Verificar un Número de Teléfono
Endpoint: POST /organizations/{tenant}/v2/people/verifyPhone
Autenticación: A nivel de agente (x-api-key + x-agent-id + x-agent-api-key)
Hay dos modos de llamada mutuamente excluyentes:
| Modo | Enviar | Comportamiento |
|---|---|---|
| Modo persona | Solo personId | Inyo carga el nombre, la dirección y la fecha de nacimiento del remitente desde el registro almacenado, verifica contra el operador y refleja el resultado en la persona (phoneVerificationScore, phoneVerificationStatus, phoneVerificationLastCheckedAt). |
| Modo inline | Los campos de identidad directamente, sin personId | Sin estado — no se lee ni se escribe nada en el registro de la persona. |
⚠️ Los modos no pueden combinarse. Si envías
personId, no debes enviar ningún campo de identidad inline, o la solicitud devuelve422.
Modo Persona
curl --request POST \
--url https://{FQDN}/organizations/$TENANT/v2/people/verifyPhone \
--header 'Content-Type: application/json' \
--header "x-api-key: $API_KEY" \
--header "x-agent-id: $AGENT_ID" \
--header "x-agent-api-key: $AGENT_KEY" \
--data '{
"personId": "48066496-9445-41b7-acbe-85e069a77cb7"
}'
El phoneNumber almacenado del remitente ya debe estar en formato E.164; de lo contrario, la solicitud devuelve 422.
Modo Inline
curl --request POST \
--url https://{FQDN}/organizations/$TENANT/v2/people/verifyPhone \
--header 'Content-Type: application/json' \
--header "x-api-key: $API_KEY" \
--header "x-agent-id: $AGENT_ID" \
--header "x-agent-api-key: $AGENT_KEY" \
--data '{
"phoneNumber": "+14145447770",
"firstName": "John",
"lastName": "Doe",
"addressLine1": "123 Market St",
"city": "San Francisco",
"state": "CA",
"postalCode": "94105",
"addressCountryCode": "US",
"dateOfBirth": "1990-01-15"
}'
Campos de la Solicitud
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
personId | string (UUID) | Modo persona | El remitente a verificar. Cuando está presente, todos los campos de identidad se cargan del registro y ninguno puede enviarse inline. |
phoneNumber | string | Modo inline | El número a verificar, E.164 (+ y 1–15 dígitos, p. ej. +14145447770). No se normaliza — canonicalízalo antes de enviarlo. |
firstName | string | No | Nombre a coincidir |
lastName | string | No | Apellido a coincidir |
addressLine1 | string | No | Dirección a coincidir |
addressLine2 | string | No | Línea de dirección adicional |
city | string | No | Ciudad a coincidir |
state | string | No | Estado/provincia a coincidir |
postalCode | string | No | Código postal a coincidir |
addressCountryCode | string | No | Código de país ISO 3166-1 alfa-2 |
dateOfBirth | string | No | YYYY-MM-DD o YYYYMMDD |
Cuantos más campos de identidad proporciones, más completo será el resultado de coincidencia.
Respuesta
{
"verificationId": 42,
"phoneNumber": "+14145447770",
"status": "MATCH",
"summaryScore": 100,
"callerType": "CONSUMER",
"valid": true,
"nationalFormat": "(414) 544-7770",
"countryCode": "US",
"identityMatch": {
"first_name_match": "exact_match",
"last_name_match": "exact_match",
"address_lines_match": "exact_match",
"date_of_birth_match": "exact_match",
"summary_score": 100
},
"verifiedAt": "2026-09-09T14:22:11+00:00",
"cached": false
}
| Campo | Descripción |
|---|---|
verificationId | Identificador de este registro de verificación |
status | Resultado general — MATCH, PARTIAL, NO_MATCH o ERROR |
summaryScore | Puntuación de coincidencia 0–100, o null cuando el proveedor no devolvió puntuación |
callerType | CONSUMER, BUSINESS o una clasificación similar del operador |
valid | Si el número es una línea válida y contactable |
nationalFormat | El número formateado para su país |
countryCode | Código de país ISO del número |
identityMatch | Detalle de coincidencia por campo (nombre, partes de la dirección, fecha de nacimiento, etc.) |
verifiedAt | Cuándo se realizó la verificación |
cached | true cuando este resultado se sirvió desde caché (ver abajo) |
Umbrales de Estado
status se deriva de summaryScore usando umbrales por tenant (predeterminados: MATCH ≥ 80, PARTIAL ≥ 40, por debajo → NO_MATCH). El estado se captura en el momento de la verificación — los cambios de umbral posteriores no reclasifican los resultados históricos. Contacta a Inyo para ajustar tus umbrales.
Caché
Las solicitudes idénticas se almacenan en caché por tenant durante 90 días, con clave en la tupla completa de entrada (número de teléfono, nombre, dirección, fecha de nacimiento). Un acierto de caché devuelve el resultado almacenado con "cached": true y no vuelve a facturar al proveedor de verificación. Varía cualquier campo de entrada para forzar una consulta nueva.
Respuestas de Error
| HTTP | Error | Causa |
|---|---|---|
422 | VALIDATION_ERROR | Campos faltantes/inválidos, teléfono no E.164, o personId enviado junto con campos de identidad inline |
501 | PROVIDER_NOT_CONFIGURED | El proveedor de verificación no está configurado para tu tenant — contacta al soporte de Inyo |
502 | PROVIDER_ERROR | El proveedor no está disponible temporalmente — reintenta la solicitud |
Pruebas en Sandbox
En el sandbox, la verificación de teléfono no llama al proveedor real — sin facturación, sin consultas en vivo. En su lugar, el resultado se determina completamente por el último dígito del número de teléfono, de modo que puedes ejercitar cada rama eligiendo el número que envías:
| El teléfono termina en | status | summaryScore | Qué simula |
|---|---|---|---|
0, 1, 2 | MATCH | 100 | Coincidencia de identidad total — todos los campos exact_match |
3, 4, 5 | PARTIAL | 60 | Mixto — algunos campos coinciden, otros no |
6, 7 | NO_MATCH | 20 | Mayoría de campos no_match |
8 | ERROR | null | El proveedor no devolvió puntuación (nada con qué comparar) |
9 | — | — | 500 upstream → el endpoint devuelve 502 PROVIDER_ERROR |
Por ejemplo, +14145550002 devuelve MATCH y +14145550009 devuelve 502.
Como la clave de caché incluye el número de teléfono, reejecutar el mismo número de sandbox devuelve
"cached": trueen la segunda llamada. Cambia el número (o cualquier otro campo) para forzar una consulta simulada nueva.
Todos los Endpoints
| Operación | Método | Endpoint |
|---|---|---|
| Verificar un número de teléfono | POST | /organizations/{tenant}/v2/people/verifyPhone |
