ID Mobile — Verificación silenciosa del número

Support DQE
Support DQE
  • Actualización
Number Verify - API ID Mobile

Utiliza este endpoint para verificar si el número de teléfono enviado en la solicitud coincide con el número que inicia la solicitud. El proceso consta de dos pasos: iniciar la solicitud de verificación y luego recuperar el resultado.

Related ID Mobile documentation:

Paso 1: Solicitar la verificación

Solicitud

Se admiten tanto GET como POST. Esto abre una página de consentimiento que el usuario final debe aceptar antes de poder recuperar el resultado en el paso 2.

{SERVER_ADDRESS} y {LICENCE_CODE} son proporcionados por DQE al crear la cuenta. {TOKEN} es el token de acceso obtenido del endpoint ID Mobile Access Token. Ponte en contacto con tu gestor de cuenta DQE para obtener la dirección del servidor y el código de licencia.
GEThttps://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify&redirect_uri={URL_REDIRECT}

Ejemplos de código

Solicitar un enlace de consentimiento de Number Verify

curl "https://{SERVER_ADDRESS}/IDMOBILE/?number=33612345678&token={TOKEN}&mode=2&name=MYCOMPANY&licence={LICENCE_CODE}&scope=numVerify"
fetch("https://{SERVER_ADDRESS}/IDMOBILE/?" + new URLSearchParams({ number: "33612345678", token: "{TOKEN}", mode: "2", name: "MYCOMPANY", licence: "{LICENCE_CODE}", scope: "numVerify" })) .then(r => r.json()) .then(data => console.log(data));
import requests response = requests.get( "https://{SERVER_ADDRESS}/IDMOBILE/", params={ "number": "33612345678", "token": "{TOKEN}", "mode": "2", "name": "MYCOMPANY", "licence": "{LICENCE_CODE}", "scope": "numVerify", }, ) print(response.json())
<?php $params = http_build_query([ 'number' => '33612345678', 'token' => '{TOKEN}', 'mode' => '2', 'name' => 'MYCOMPANY', 'licence' => '{LICENCE_CODE}', 'scope' => 'numVerify', ]); $ch = curl_init("https://{SERVER_ADDRESS}/IDMOBILE/?{$params}"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true);
const axios = require('axios'); axios.get('https://{SERVER_ADDRESS}/IDMOBILE/', { params: { number: '33612345678', token: '{TOKEN}', mode: '2', name: 'MYCOMPANY', licence: '{LICENCE_CODE}', scope: 'numVerify' } }) .then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient(); String url = "https://{SERVER_ADDRESS}/IDMOBILE/" + "?number=33612345678&token={TOKEN}&mode=2&name=MYCOMPANY&licence={LICENCE_CODE}&scope=numVerify"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .GET() .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
using var client = new HttpClient(); var url = "https://{SERVER_ADDRESS}/IDMOBILE/" + "?number=33612345678&token={TOKEN}&mode=2&name=MYCOMPANY&licence={LICENCE_CODE}&scope=numVerify"; var response = await client.GetAsync(url); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);
package main import ( "fmt" "io" "net/http" ) func main() { url := "https://{SERVER_ADDRESS}/IDMOBILE/" + "?number=33612345678&token={TOKEN}&mode=2&name=MYCOMPANY&licence={LICENCE_CODE}&scope=numVerify" resp, err := http.Get(url) if err != nil { panic(err) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) fmt.Println(string(body)) }
POSThttps://{SERVER_ADDRESS}/IDMOBILE/

Añade los siguientes parámetros en el cuerpo de la solicitud usando Content-Type: application/x-www-form-urlencoded:

Ejemplos de código

Solicitar un enlace de consentimiento de Number Verify

curl -X POST "https://{SERVER_ADDRESS}/IDMOBILE/" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "licence={LICENCE_CODE}" \ -d "number=33612345678" \ -d "token={TOKEN}" \ -d "mode=2" \ -d "name=MYCOMPANY" \ -d "scope=numVerify"
fetch("https://{SERVER_ADDRESS}/IDMOBILE/", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ licence: "{LICENCE_CODE}", number: "33612345678", token: "{TOKEN}", mode: "2", name: "MYCOMPANY", scope: "numVerify" }) }) .then(r => r.json()) .then(data => console.log(data));
import requests response = requests.post( "https://{SERVER_ADDRESS}/IDMOBILE/", data={ "licence": "{LICENCE_CODE}", "number": "33612345678", "token": "{TOKEN}", "mode": "2", "name": "MYCOMPANY", "scope": "numVerify", }, ) print(response.json())
<?php $ch = curl_init("https://{SERVER_ADDRESS}/IDMOBILE/"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ 'licence' => '{LICENCE_CODE}', 'number' => '33612345678', 'token' => '{TOKEN}', 'mode' => '2', 'name' => 'MYCOMPANY', 'scope' => 'numVerify', ])); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true);
const axios = require('axios'); const qs = require('querystring'); axios.post('https://{SERVER_ADDRESS}/IDMOBILE/', qs.stringify({ licence: '{LICENCE_CODE}', number: '33612345678', token: '{TOKEN}', mode: '2', name: 'MYCOMPANY', scope: 'numVerify' })) .then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient(); String form = "licence={LICENCE_CODE}&number=33612345678&token={TOKEN}&mode=2&name=MYCOMPANY&scope=numVerify"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://{SERVER_ADDRESS}/IDMOBILE/")) .header("Content-Type", "application/x-www-form-urlencoded") .POST(HttpRequest.BodyPublishers.ofString(form)) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
using var client = new HttpClient(); var form = new Dictionary<string, string> { ["licence"] = "{LICENCE_CODE}", ["number"] = "33612345678", ["token"] = "{TOKEN}", ["mode"] = "2", ["name"] = "MYCOMPANY", ["scope"] = "numVerify" }; var response = await client.PostAsync( "https://{SERVER_ADDRESS}/IDMOBILE/", new FormUrlEncodedContent(form)); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);
package main import ( "fmt" "io" "net/http" "net/url" ) func main() { form := url.Values{} form.Set("licence", "{LICENCE_CODE}") form.Set("number", "33612345678") form.Set("token", "{TOKEN}") form.Set("mode", "2") form.Set("name", "MYCOMPANY") form.Set("scope", "numVerify") resp, err := http.PostForm("https://{SERVER_ADDRESS}/IDMOBILE/", form) if err != nil { panic(err) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) fmt.Println(string(body)) }

Parámetros

Parámetro Descripción Obl / Opc
SERVER_ADDRESS Dirección del servidor DQE que procesará los datos. Mandatory
licence Número que se te asigna como código de licencia. Mandatory
number Número de teléfono. Mandatory
token Token obtenido mediante la autenticación. Mandatory
mode Valor estático. Debe ser 2. Mandatory
name Nombre del partner en la base de datos de DQE, normalmente el nombre de tu empresa. Mandatory
scope Valor estático. Debe ser numVerify para este scope. Mandatory
redirect_uri URL de redirección. DQE añade el token de sesión y el estado a la redirección. Optional
Combinación de scopes — numVerify se puede combinar con info (información del número de teléfono) en una sola solicitud, por ejemplo scope=numVerify,info. Consulta los campos de info más abajo.

Campos adicionales de info — se devuelven además de los campos propios de este endpoint cuando se incluye info en scope:

Campo Descripción Ejemplo
telorigine Número de teléfono de la solicitud. 0600000000
tel Número de teléfono formateado. +33600000000
geolocation Situación geográfica del número de teléfono. FRANCE
operator Operador actual del número de teléfono, si está suscrito. ORANGE
oldoperator Operador anterior del número de teléfono. SFR
ported Indica si el número de teléfono está portado, si está suscrito. Y
type Tipo de número de teléfono. MOBILE
iderror Código de error de la comprobación (0 o 1). 1

Respuesta

En caso de éxito, la API devuelve un objeto JSON que contiene la URL de la página de consentimiento que debe presentarse al usuario final.

Clave Descripción Tipo
status success String
operator Operador. String
url URL de la API del operador. String

Ejemplo de respuesta

Ejemplo de respuesta correcta
{ "status": "success", "operator": "SFR", "url": "htt***fr.fr/api/a**l8ET6UMbsaG0AOm5FsakgyKu*" }

Errores

Nota sobre los códigos de error 05-07 — estos tres códigos forman parte de la lista de validación compartida del paso 1 utilizada en todos los scopes de ID Mobile. Hacen referencia al parámetro user_infos y a su clave phone, que pertenecen a otros scopes (como Matching without OTP) — la propia solicitud de Number Verify no tiene esos campos, por lo que no se espera que estos códigos se activen en una llamada estándar de Number Verify.
ID de error Tipo de error Ejemplo de solicitud Respuesta
01 invalid request https://{SERVER_ADDRESS}/IDMOBILE/?token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
Ejemplo: falta el parámetro number.
{"status": "error", "error_id": "01", "error_type": "invalid request"}
02 invalid licence key https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={INCORRECT_LICENCE_CODE}&scope=numVerify
{"status": "error", "error_id": "02", "error_type": "invalid licence key"}
04 invalid scope https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=wrongScope
{"status": "error", "error_id": "04", "error_type": "invalid scope"}
05 missing or empty parameter (user_infos) for this scope No se activa con los parámetros propios de Number Verify
Este código proviene de una capa de validación compartida entre los scopes de ID Mobile y hace referencia a los campos user_infos/phone utilizados por otros scopes (como Matching without OTP). Number Verify no tiene ese parámetro.
{"status": "error", "error_id": "05", "error_type": "missing or empty parameter (user_infos) for this scope"}
06 bad parameter format (user_infos) is not a valid JSON No se activa con los parámetros propios de Number Verify
Este código proviene de una capa de validación compartida entre los scopes de ID Mobile y hace referencia a los campos user_infos/phone utilizados por otros scopes (como Matching without OTP). Number Verify no tiene ese parámetro.
{"status": "error", "error_id": "06", "error_type": "bad parameter format (user_infos) is not a valid JSON"}
07 missing mandatory key in user informations (phone) No se activa con los parámetros propios de Number Verify
Este código proviene de una capa de validación compartida entre los scopes de ID Mobile y hace referencia a los campos user_infos/phone utilizados por otros scopes (como Matching without OTP). Number Verify no tiene ese parámetro.
{"status": "error", "error_id": "07", "error_type": "missing mandatory key in user informations (phone)"}
09 ineligible phone number https://{SERVER_ADDRESS}/IDMOBILE/?number={INELIGIBLE_NUMBER}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
{"status": "error", "error_id": "09", "error_type": "ineligible phone number"}
10 invalid phone number https://{SERVER_ADDRESS}/IDMOBILE/?number={INVALID_NUMBER}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
{"status": "error", "error_id": "10", "error_type": "invalid phone number"}
11 phone number is empty https://{SERVER_ADDRESS}/IDMOBILE/?number=&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
{"status": "error", "error_id": "11", "error_type": "phone number is empty"}
12 phone check failed https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
Condición del lado del operador — una solicitud sintácticamente válida puede fallar aquí.
{"status": "error", "error_id": "12", "error_type": "phone check failed"}
13 operator [Operator Name] not found https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
Condición del lado del operador.
{"status": "error", "error_id": "13", "error_type": "operator [Operator Name] not found"}
14 operator [Operator Name] not authorized for this licence https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
Condición del lado del operador — tu licencia no está autorizada para este operador.
{"status": "error", "error_id": "14", "error_type": "operator [Operator Name] not authorized for this licence"}
15 operator [Operator Name] not supported yet https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
Condición del lado del operador.
{"status": "error", "error_id": "15", "error_type": "operator [Operator Name] not supported yet"}
16 operator [Operator Name] unreachable https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
Condición del lado del operador.
{"status": "error", "error_id": "16", "error_type": "operator [Operator Name] unreachable"}
17 scope not supported by this operator [Operator Name] yet https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
Condición del lado del operador.
{"status": "error", "error_id": "17", "error_type": "scope not supported by this operator [Operator Name] yet"}
30 invalid or expired token https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={EXPIRED_TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
{"status": "error", "error_id": "30", "error_type": "invalid or expired token"}

Probar la API

Haz clic en el botón de abajo para probar este endpoint en directo en tu navegador.

Abrir consola
Paso 2 — Recuperar el resultado

Una vez que el usuario final haya aceptado (o rechazado) la página de consentimiento del paso 1, llama a este endpoint para recuperar el resultado de la verificación.

Paso 2: Recuperar el resultado

Solicitud

Se admiten tanto GET como POST.

{SERVER_ADDRESS} y {LICENCE_CODE} son proporcionados por DQE al crear la cuenta. {TOKEN} es el mismo token de acceso utilizado en el paso 1.
GEThttps://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify

Ejemplos de código

Recuperar el resultado de Number Verify

curl "https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify"
fetch("https://{SERVER_ADDRESS}/GET/?" + new URLSearchParams({ token: "{TOKEN}", Licence: "{LICENCE_CODE}", scope: "numVerify" })) .then(r => r.json()) .then(data => console.log(data));
import requests response = requests.get( "https://{SERVER_ADDRESS}/GET/", params={ "token": "{TOKEN}", "Licence": "{LICENCE_CODE}", "scope": "numVerify", }, ) print(response.json())
<?php $params = http_build_query([ 'token' => '{TOKEN}', 'Licence' => '{LICENCE_CODE}', 'scope' => 'numVerify', ]); $ch = curl_init("https://{SERVER_ADDRESS}/GET/?{$params}"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true);
const axios = require('axios'); axios.get('https://{SERVER_ADDRESS}/GET/', { params: { token: '{TOKEN}', Licence: '{LICENCE_CODE}', scope: 'numVerify' } }) .then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient(); String url = "https://{SERVER_ADDRESS}/GET/" + "?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .GET() .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
using var client = new HttpClient(); var url = "https://{SERVER_ADDRESS}/GET/" + "?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify"; var response = await client.GetAsync(url); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);
package main import ( "fmt" "io" "net/http" ) func main() { url := "https://{SERVER_ADDRESS}/GET/" + "?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify" resp, err := http.Get(url) if err != nil { panic(err) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) fmt.Println(string(body)) }
POSThttps://{SERVER_ADDRESS}/GET/

Añade los siguientes parámetros en el cuerpo de la solicitud usando Content-Type: application/x-www-form-urlencoded:

Ejemplos de código

Recuperar el resultado de Number Verify

curl -X POST "https://{SERVER_ADDRESS}/GET/" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "Licence={LICENCE_CODE}" \ -d "token={TOKEN}" \ -d "scope=numVerify"
fetch("https://{SERVER_ADDRESS}/GET/", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ Licence: "{LICENCE_CODE}", token: "{TOKEN}", scope: "numVerify" }) }) .then(r => r.json()) .then(data => console.log(data));
import requests response = requests.post( "https://{SERVER_ADDRESS}/GET/", data={ "Licence": "{LICENCE_CODE}", "token": "{TOKEN}", "scope": "numVerify", }, ) print(response.json())
<?php $ch = curl_init("https://{SERVER_ADDRESS}/GET/"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ 'Licence' => '{LICENCE_CODE}', 'token' => '{TOKEN}', 'scope' => 'numVerify', ])); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true);
const axios = require('axios'); const qs = require('querystring'); axios.post('https://{SERVER_ADDRESS}/GET/', qs.stringify({ Licence: '{LICENCE_CODE}', token: '{TOKEN}', scope: 'numVerify' })) .then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient(); String form = "Licence={LICENCE_CODE}&token={TOKEN}&scope=numVerify"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://{SERVER_ADDRESS}/GET/")) .header("Content-Type", "application/x-www-form-urlencoded") .POST(HttpRequest.BodyPublishers.ofString(form)) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
using var client = new HttpClient(); var form = new Dictionary<string, string> { ["Licence"] = "{LICENCE_CODE}", ["token"] = "{TOKEN}", ["scope"] = "numVerify" }; var response = await client.PostAsync( "https://{SERVER_ADDRESS}/GET/", new FormUrlEncodedContent(form)); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);
package main import ( "fmt" "io" "net/http" "net/url" ) func main() { form := url.Values{} form.Set("Licence", "{LICENCE_CODE}") form.Set("token", "{TOKEN}") form.Set("scope", "numVerify") resp, err := http.PostForm("https://{SERVER_ADDRESS}/GET/", form) if err != nil { panic(err) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) fmt.Println(string(body)) }

Parámetros

Parámetro Descripción Obl / Opc
SERVER_ADDRESS Dirección del servidor DQE que procesará los datos. Mandatory
Licence Número que se te asigna como código de licencia. Mandatory
token Token obtenido mediante la autenticación. Mandatory
scope Valor estático. Debe ser numVerify para este scope. Mandatory

Respuesta

Éxito

Clave Descripción Tipo
status success: information was successfully retrieved. String
scope Contiene el scope enviado previamente. String
numVerify Siempre es true cuando esta clave está presente — confirma que el número de teléfono coincide. Un número de teléfono que no coincide nunca se devuelve como numVerify: false en una respuesta correcta; en su lugar, se devuelve como el error 20 (consulta Errores más abajo). Boolean

Pendiente

Se devuelve mientras DQE sigue esperando la respuesta del operador — vuelve a consultar el paso 2 tras una breve espera.

Clave Descripción Tipo
status pending: DQE is waiting for the operator response. String
scope Contiene numVerify. String

Ejemplo de respuesta

Ejemplo de respuesta correcta
{ "status": "success", "scope": "numVerify", "numVerify": true }
Ejemplo de respuesta pendiente
{ "status": "pending", "scope": "numVerify" }

Errores

ID de error Tipo de error Ejemplo de solicitud Respuesta
01 invalid request https://{SERVER_ADDRESS}/GET/?Licence={LICENCE_CODE}&scope=numVerify
Example: missing token parameter.
{"status": "error", "error_id": "01", "error_type": "invalid request"}
02 invalid licence key https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={INCORRECT_LICENCE_CODE}&scope=numVerify
{"status": "error", "error_id": "02", "error_type": "invalid licence key"}
04 invalid scope https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=wrongScope
{"status": "error", "error_id": "04", "error_type": "invalid scope"}
18 failed to retrieve data from operator https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify
No se recibieron datos tras la validación OTP.
{"status": "error", "error_id": "18", "error_type": "failed to retrieve data from operator"}
20 Not the same phone number between the phone in the request https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify
El número de teléfono enviado en la solicitud no coincide con el que inicia la solicitud — esto equivale a un resultado numVerify: false, devuelto como error en lugar de como respuesta correcta.
{"status": "error", "error_id": "20", "error_type": "Not the same phone number between the phone in the request"}
21 access denied https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify
La validación OTP fue rechazada.
{"status": "error", "error_id": "21", "error_type": "access denied"}
30 invalid or expired token https://{SERVER_ADDRESS}/GET/?token={EXPIRED_TOKEN}&Licence={LICENCE_CODE}&scope=numVerify
{"status": "error", "error_id": "30", "error_type": "invalid or expired token"}
99 internal server error https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify
Error del servidor.
{"status": "error", "error_id": "99", "error_type": "internal server error"}
Example error response
{ "status": "error", "error_id": "20", "error_type": "OTP process failed" }

Probar la API

Haz clic en el botón de abajo para probar este endpoint en directo en tu navegador.

Abrir consola

Ver también

--gray-800: #1F2937; --tp-w: 360px; --mint-light: #E6FFF9; } .dqe *, .dqe *::before, .dqe *::after { box-sizing: border-box; } .dqe { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-size: 14px; line-height: 1.65; color: var(--gray-800); background: #fff; } /* ── LAYOUT ── */ .dqe .layout { display: block; } /* ── MAIN ── */ .dqe .main { padding: 0; display: flex; flex-direction: column; gap: 16px; } .dqe .doc-content { max-width: 760px; } .dqe section { margin-bottom: 24px; } .dqe h1 { font-size: 30px; font-weight: 800; color: var(--blue); margin-bottom: 10px; } .dqe .lead { font-size: 15px; color: var(--gray-600); max-width: 640px; line-height: 1.7; hyphens: none; } .dqe h2 { font-size: 19px; font-weight: 700; color: var(--gray-800); margin-bottom: 14px; padding-bottom: 8px; border-bottom: 2px solid var(--gray-200); } .dqe h2.section-title { font-size: 24px; font-weight: 800; color: var(--blue); margin-bottom: 6px; padding-bottom: 10px; border-bottom: 2px solid var(--azur); } .dqe h3 { font-size: 14px; font-weight: 700; color: var(--gray-800); margin: 20px 0 10px; } .dqe h4 { font-size: 13px; font-weight: 700; color: var(--gray-800); margin: 16px 0 8px; } .dqe p { color: var(--gray-600); margin-bottom: 12px; } .dqe p:last-child { margin-bottom: 0; } .dqe code { font-family: 'SF Mono', 'Consolas', 'Menlo', monospace; font-size: 12px; background: var(--gray-100); color: var(--blue); padding: 1px 5px; border-radius: 3px; } /* ── CALLOUT BOX ── */ .dqe .callout { border-radius: 6px; padding: 13px 16px; margin: 16px 0; font-size: 13px; line-height: 1.6; } .dqe .callout-blue { background: var(--blue-light); border-left: 4px solid var(--azur); } .dqe .callout-yellow { background: #FFFBEB; border-left: 4px solid #F59E0B; } .dqe .callout-mint { background: var(--mint-light); border-left: 4px solid var(--mint); } .dqe .callout strong { color: var(--gray-800); } .dqe .callout-link { display: inline-block; margin-top: 8px; font-size: 12px; font-weight: 600; color: var(--azur); text-decoration: none; } .dqe .callout-link:hover { text-decoration: underline; } /* ── METHOD BADGES ── */ .dqe .badge { display: inline-block; font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .4px; padding: 2px 6px; border-radius: 4px; } .dqe .badge-get { background: #D1FAE5; color: #065F46; } .dqe .badge-post { background: #DBEAFE; color: #1E40AF; } .dqe .badge-mand { background: #FEE2E2; color: #991B1B; } .dqe .badge-opt { background: var(--gray-100); color: var(--gray-600); border-radius: 10px; font-size: 10px; padding: 2px 7px; } /* ── ENDPOINT STRIP ── */ .dqe .endpoint-box { background: var(--gray-800); border-radius: 8px; padding: 14px 18px; margin: 16px 0; font-family: 'SF Mono',monospace; font-size: 13px; color: #E2E8F0; overflow-x: auto; white-space: nowrap; } .dqe .endpoint-box .method { color: var(--mint); font-weight: 700; margin-right: 10px; } .dqe .endpoint-box .param { color: #F59E0B; } .dqe .endpoint-box .seg { color: #C4B5FD; } /* ── CODE BLOCK ── */ .dqe .code-block { background: #1E1E2E; border-radius: 8px; padding: 16px 20px; margin: 12px 0; font-family: 'SF Mono',monospace; font-size: 12px; color: #CDD6F4; overflow-x: auto; white-space: pre; line-height: 1.6; } .dqe .tbl td .code-block { white-space: pre-wrap; word-break: break-word; overflow-x: hidden; margin: 0; padding: 8px 12px; } .dqe .code-block .kw { color: var(--mint); } .dqe .code-block .str { color: #A6E3A1; } .dqe .code-block .key { color: #89B4FA; } .dqe .code-block .num { color: #FAB387; } .dqe .code-block .s { color: #A6E3A1; } .dqe .code-block .n { color: #89B4FA; } .dqe .code-block .p { color: #F38BA8; } .dqe .code-label { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .6px; color: var(--gray-400); margin-bottom: 4px; } .dqe pre.code { background: #1E1E2E; border-radius: 8px; padding: 16px 20px; overflow-x: auto; font-family: 'SF Mono', 'Consolas', monospace; font-size: 12.5px; line-height: 1.85; color: #CDD6F4; margin: 0 0 16px; } .dqe pre.code .k { color: #CBA6F7; } .dqe pre.code .s { color: #A6E3A1; } .dqe pre.code .n { color: #89B4FA; } .dqe pre.code .v { color: #FAB387; } .dqe pre.code .p { color: #F38BA8; } .dqe pre.code .c { color: #6C7086; font-style: italic; } /* ── PAGE-LEVEL JUMP TO ── */ .dqe .page-jump { display: flex; flex-wrap: wrap; gap: 8px; margin: 24px 0 0; padding: 14px 18px; background: var(--gray-50); border: 1px solid var(--gray-200); border-radius: 8px; align-items: center; } .dqe .page-jump-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .6px; color: var(--gray-400); margin-right: 4px; } .dqe .page-jump a { font-size: 13px; font-weight: 600; color: var(--blue); background: var(--blue-light); border: 1px solid #C7D2FE; border-radius: 20px; padding: 4px 14px; text-decoration: none; transition: background .1s; } .dqe .page-jump a:hover { background: #dce4ff; } /* ── SECTION-LEVEL JUMP TO ── */ .dqe .jump-to { display: flex; flex-wrap: wrap; gap: 8px; margin: 12px 0 20px; align-items: center; } .dqe .jump-to-label { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .6px; color: var(--gray-400); margin-right: 4px; } .dqe .jump-to a { font-size: 12px; color: var(--blue); background: var(--blue-light); border: 1px solid #C7D2FE; border-radius: 20px; padding: 3px 10px; text-decoration: none; transition: background .1s; } .dqe .jump-to a:hover { background: #dce4ff; } .dqe .jump-to a.test-api-pill { color: #007A5E; background: #E6FFF9; border-color: #00DBA3; font-weight: 700; } /* ── PAGE TAG ── */ .dqe .page-tag { display: inline-block; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .5px; padding: 3px 9px; border-radius: 10px; background: #EDE9FE; color: #5B21B6; margin-bottom: 14px; } /* ── INTRO FLOW BLOCK ── */ .dqe .flow-intro { margin: 20px 0; } .dqe .path-block { background: #fff; border-radius: 10px; padding: 18px 18px 16px; display: flex !important; flex-direction: column; overflow: hidden; } .dqe .path-block-single { border: 1.5px solid #BFCFFE; } .dqe .path-name { font-size: 11px; font-weight: 800; text-transform: uppercase; letter-spacing: .8px; margin-bottom: 6px; } .dqe .path-name-single { color: var(--azur); } .dqe .path-desc { font-size: 12px; color: var(--gray-600); margin: 0 0 14px; line-height: 1.5; } .dqe .steps-row { display: flex !important; align-items: stretch !important; gap: 8px; flex-wrap: wrap; margin-top: auto; } .dqe .step { display: block !important; padding: 10px 12px; border-radius: 8px; text-decoration: none; transition: box-shadow .15s, transform .1s; flex: 1 1 0; min-width: 0; } .dqe .step:hover { box-shadow: 0 2px 8px rgba(0,0,0,.1); transform: translateY(-1px); } .dqe .step-single { background: var(--blue-light); border: 1px solid #C7D2FE; } .dqe .step-n { display: block !important; font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: .5px; color: var(--gray-400); margin-bottom: 3px; } .dqe .step-api { display: block !important; font-family: 'SF Mono','Consolas',monospace; font-size: 13px; font-weight: 700; margin-bottom: 3px; } .dqe .step-api-single { color: var(--blue); } .dqe .step-desc { display: block !important; font-size: 11px; color: var(--gray-600); line-height: 1.4; } .dqe .step-arrow { display: flex !important; align-items: center !important; color: var(--gray-400); font-size: 18px; flex-shrink: 0; padding: 0 2px; } /* ── BACK TO TOP ── */ /* ── FOOTER ── */ .dqe .foot { margin-top: 48px; padding-top: 20px; border-top: 1px solid var(--gray-200); font-size: 12px; color: var(--gray-400); } /* ── SECTION DIVIDER ── */ .dqe .section-divider { border-top: 2px solid var(--gray-200); margin: 16px 0 32px; } /* ── TEST THE API TOGGLE ── */ .dqe .tryit-details { width: 100%; margin-top: 20px; margin-bottom: 4px; } .dqe .tryit-details summary { list-style: none; display: inline-flex; align-items: center; gap: 8px; cursor: pointer; font-size: 13px; font-weight: 700; color: #007A5E; padding: 8px 16px; background: #E6FFF9; border: 1.5px solid #00DBA3; border-radius: 8px; user-select: none; margin-bottom: 0; } .dqe .tryit-details summary::-webkit-details-marker { display: none; } .dqe .tryit-details summary::marker { display: none; } .dqe .tryit-details summary::before { content: '▶'; font-size: 10px; margin-right: 2px; } .dqe .tryit-details[open] summary::before { content: '▼'; } .dqe .tryit-details[open] summary { margin-bottom: 14px; border-radius: 8px 8px 0 0; } /* ── TRY-IT PANEL ── */ .dqe .tryit-panel { width: 100%; border: 1.5px solid var(--gray-200); border-radius: 12px; background: var(--gray-50); font-size: 13px; } .dqe .tp-header { display: flex; align-items: center; justify-content: space-between; padding: 14px 16px 12px; border-bottom: 1.5px solid var(--gray-200); background: #fff; border-radius: 10px 10px 0 0; } .dqe .tp-title { font-size: 13px; font-weight: 700; color: var(--gray-800); display: flex; align-items: center; gap: 7px; } .dqe .tp-title::before { content: '\25b6'; font-size: 10px; color: var(--mint); } .dqe .tp-endpoint-badge { font-family: 'SF Mono', monospace; font-size: 11px; background: var(--blue-light); color: var(--blue); padding: 2px 8px; border-radius: 4px; font-weight: 600; } .dqe .tp-body { padding: 16px; display: flex; flex-direction: column; gap: 14px; } .dqe .tp-licence-block { background: #FFFBEB; border: 1.5px solid #FDE68A; border-radius: 8px; padding: 12px 13px; } .dqe .tp-licence-block label { display: block; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .5px; color: #92400E; margin-bottom: 6px; } .dqe .tp-licence-input { width: 100%; padding: 7px 10px; border: 1.5px solid #FCD34D; border-radius: 6px; font-size: 13px; font-family: 'SF Mono', monospace; background: #fff; color: var(--gray-800); outline: none; transition: border-color .15s; } .dqe .tp-licence-input:focus { border-color: #F59E0B; } .dqe .tp-section-label { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .6px; color: var(--gray-400); margin-bottom: 8px; } .dqe .tp-fields { display: flex; flex-direction: column; gap: 8px; } .dqe .tp-field { display: flex; flex-direction: column; gap: 4px; } .dqe .tp-field label { font-size: 11px; font-weight: 600; color: var(--gray-600); display: flex; align-items: center; gap: 4px; } .dqe .tp-field label .req { color: #DC2626; font-size: 10px; } .dqe .tp-field label .opt { color: #6B7280; font-size: 10px; font-weight: 400; } .dqe .tp-input { width: 100%; padding: 7px 10px; border: 1.5px solid var(--gray-200); border-radius: 6px; font-size: 13px; background: #fff; color: var(--gray-800); outline: none; transition: border-color .15s, box-shadow .15s; } .dqe .tp-input:focus { border-color: var(--azur); box-shadow: 0 0 0 3px rgba(0,140,255,.1); } .dqe .tp-input::placeholder { color: var(--gray-400); } .dqe .tp-run { width: 100%; padding: 10px 16px; background: var(--mint); color: #fff; font-size: 13px; font-weight: 700; border: none; border-radius: 8px; cursor: pointer; transition: background .15s, transform .1s, box-shadow .15s; display: flex; align-items: center; justify-content: center; gap: 7px; letter-spacing: .2px; } .dqe .tp-run:hover { background: #00c494; box-shadow: 0 2px 10px rgba(0,219,163,.35); } .dqe .tp-run:active { transform: scale(.98); } .dqe .tp-run:disabled { background: var(--gray-200); color: var(--gray-400); cursor: not-allowed; box-shadow: none; } .dqe .tp-spinner { display: none; width: 14px; height: 14px; border: 2px solid rgba(255,255,255,.4); border-top-color: #fff; border-radius: 50%; animation: spin .6s linear infinite; } .dqe .tp-spinner.visible { display: block; } @keyframes spin { to { transform: rotate(360deg); } } .dqe .tp-curl-block { background: #111827; border-radius: 8px; overflow: hidden; } .dqe .tp-curl-top { display: flex; align-items: center; justify-content: space-between; padding: 8px 12px 6px; border-bottom: 1px solid #1F2937; } .dqe .tp-curl-label { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .6px; color: #6B7280; } .dqe .tp-copy-btn { font-size: 11px; color: #9CA3AF; background: none; border: 1px solid #374151; border-radius: 4px; padding: 2px 8px; cursor: pointer; transition: color .15s, border-color .15s; } .dqe .tp-copy-btn:hover { color: #E5E7EB; border-color: #6B7280; } .dqe .tp-copy-btn.copied { color: var(--mint); border-color: var(--mint); } .dqe #tp-curl-text { font-family: 'SF Mono', 'Consolas', monospace; font-size: 11.5px; color: #CDD6F4; padding: 10px 12px 12px; white-space: pre-wrap; word-break: break-all; line-height: 1.7; margin: 0; } .dqe .tp-response-block { border-radius: 8px; overflow: hidden; border: 1.5px solid var(--gray-200); } .dqe .tp-resp-top { display: flex; align-items: center; justify-content: space-between; padding: 8px 12px; background: var(--gray-50); border-bottom: 1.5px solid var(--gray-200); } .dqe .tp-resp-label { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .6px; color: var(--gray-400); } .dqe .tp-status { font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: 10px; } .dqe .tp-status-ok { background: #D1FAE5; color: #065F46; } .dqe .tp-status-err { background: var(--gray-100); color: var(--gray-600); } .dqe .tp-resp-time { font-size: 11px; color: var(--gray-400); } .dqe .tp-resp-pre { background: #1E1E2E; font-family: 'SF Mono', 'Consolas', monospace; font-size: 11.5px; line-height: 1.7; color: #CDD6F4; padding: 12px; overflow: auto; max-height: 340px; margin: 0; white-space: pre; border-radius: 0 0 8px 8px; } .dqe .tp-resp-pre .rj-key { color: #89B4FA; } .dqe .tp-resp-pre .rj-str { color: #A6E3A1; } .dqe .tp-resp-pre .rj-num { color: #FAB387; } .dqe .tp-resp-pre .rj-bool { color: #CBA6F7; } .dqe .tp-resp-pre .rj-null { color: #6C7086; } .dqe .tp-resp-error { background: #2D1416; color: #FCA5A5; font-family: 'SF Mono', 'Consolas', monospace; font-size: 12px; padding: 12px; border-radius: 0 0 8px 8px; line-height: 1.6; } .dqe .tp-resp-error strong { color: #FEE2E2; } .dqe .tp-resp-error-hint { margin-top: 6px; color: #F3A6A6; font-size: 11px; font-family: inherit; opacity: .85; } .dqe .tp-response-block .resp-collapse { margin: 0; } .dqe .tp-response-block .resp-collapse summary { padding: 8px 12px; } /* ── DARK LANGUAGE TABS (for the live Test-API console) ── */ .dqe .tp-lang-tab-bar { display: flex; flex-wrap: wrap; gap: 4px; } .dqe .tp-lang-tab-lbl { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .3px; font-family: 'SF Mono', monospace; color: #6B7280; cursor: pointer; padding: 3px 8px; border-radius: 4px; transition: background .1s, color .1s; } .dqe .tp-lang-tab-lbl:hover { color: #E5E7EB; } .dqe input[id$="-lang-curl"]:checked ~ .tp-curl-top .tp-lang-tab-lbl[for$="-lang-curl"], .dqe input[id$="-lang-js"]:checked ~ .tp-curl-top .tp-lang-tab-lbl[for$="-lang-js"], .dqe input[id$="-lang-py"]:checked ~ .tp-curl-top .tp-lang-tab-lbl[for$="-lang-py"], .dqe input[id$="-lang-php"]:checked ~ .tp-curl-top .tp-lang-tab-lbl[for$="-lang-php"], .dqe input[id$="-lang-node"]:checked ~ .tp-curl-top .tp-lang-tab-lbl[for$="-lang-node"], .dqe input[id$="-lang-java"]:checked ~ .tp-curl-top .tp-lang-tab-lbl[for$="-lang-java"], .dqe input[id$="-lang-csharp"]:checked ~ .tp-curl-top .tp-lang-tab-lbl[for$="-lang-csharp"], .dqe input[id$="-lang-go"]:checked ~ .tp-curl-top .tp-lang-tab-lbl[for$="-lang-go"] { background: #1F2937; color: var(--mint); } /* ── LIVE CONSOLE METHOD TOGGLE ── */ .dqe .tp-method-toggle { display: flex; gap: 6px; margin-bottom: 2px; } .dqe .tp-method-btn { font-size: 11px; font-weight: 700; font-family: inherit; padding: 4px 14px; border-radius: 6px; border: 1.5px solid var(--gray-200); background: #fff; color: var(--gray-600); cursor: pointer; transition: background .1s, color .1s, border-color .1s; } .dqe .tp-method-btn.active { background: var(--blue); border-color: var(--blue); color: #fff; } /* ── METHOD TABS (CSS-only, no JS) ── */ .dqe .m-radio { position: absolute; opacity: 0; pointer-events: none; } .dqe .tab-bar { display: flex; border-bottom: 1.5px solid var(--gray-200); } .dqe .tab-lbl { display: inline-flex; align-items: center; padding: 6px 14px; cursor: pointer; border: 1.5px solid transparent; border-bottom: none; margin-bottom: -1.5px; border-radius: 6px 6px 0 0; color: var(--gray-600); background: var(--gray-100); transition: background .1s; } .dqe .tab-lbl:hover { background: var(--gray-200); } .dqe .tab-pane { display: none; border: 1.5px solid var(--gray-200); border-top: none; border-radius: 0 0 8px 8px; padding: 16px; } .dqe .method-tabs { margin-bottom: 16px; } .dqe #nv1-m-get:checked ~ .t-nv1-get, .dqe #nv1-m-post:checked ~ .t-nv1-post { display: block; } .dqe #nv1-m-get:checked ~ .tab-bar label[for="nv1-m-get"], .dqe #nv1-m-post:checked ~ .tab-bar label[for="nv1-m-post"] { background: #fff; border-color: var(--gray-200); border-bottom-color: #fff; color: var(--gray-800); } .dqe #nv2-m-get:checked ~ .t-nv2-get, .dqe #nv2-m-post:checked ~ .t-nv2-post { display: block; } .dqe #nv2-m-get:checked ~ .tab-bar label[for="nv2-m-get"], .dqe #nv2-m-post:checked ~ .tab-bar label[for="nv2-m-post"] { background: #fff; border-color: var(--gray-200); border-bottom-color: #fff; color: var(--gray-800); } /* ── LANGUAGE TABS (CSS-only, no JS) ── */ .dqe .lang-radio { position: absolute; opacity: 0; pointer-events: none; } .dqe .lang-tabs { margin: 8px 0 4px; } .dqe .lang-tab-bar { display: flex; flex-wrap: wrap; gap: 2px; background: var(--gray-100); border-radius: 6px 6px 0 0; padding: 4px 4px 0; } .dqe .lang-tab-lbl { padding: 6px 14px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .3px; font-family: 'SF Mono', monospace; color: var(--gray-500); cursor: pointer; border-radius: 5px 5px 0 0; transition: background .1s, color .1s; } .dqe .lang-tab-lbl:hover { color: var(--gray-800); } .dqe .lang-pane { display: none; } .dqe .lang-pane .code-block { margin: 0; border-radius: 0 0 8px 8px; } .dqe input[id$="-lang-curl"]:checked ~ .lang-tab-bar label[for$="-lang-curl"], .dqe input[id$="-lang-js"]:checked ~ .lang-tab-bar label[for$="-lang-js"], .dqe input[id$="-lang-py"]:checked ~ .lang-tab-bar label[for$="-lang-py"], .dqe input[id$="-lang-php"]:checked ~ .lang-tab-bar label[for$="-lang-php"], .dqe input[id$="-lang-node"]:checked ~ .lang-tab-bar label[for$="-lang-node"], .dqe input[id$="-lang-java"]:checked ~ .lang-tab-bar label[for$="-lang-java"], .dqe input[id$="-lang-csharp"]:checked ~ .lang-tab-bar label[for$="-lang-csharp"], .dqe input[id$="-lang-go"]:checked ~ .lang-tab-bar label[for$="-lang-go"] { background: #fff; color: var(--gray-800); } .dqe input[id$="-lang-curl"]:checked ~ .lp-curl, .dqe input[id$="-lang-js"]:checked ~ .lp-js, .dqe input[id$="-lang-py"]:checked ~ .lp-py, .dqe input[id$="-lang-php"]:checked ~ .lp-php, .dqe input[id$="-lang-node"]:checked ~ .lp-node, .dqe input[id$="-lang-java"]:checked ~ .lp-java, .dqe input[id$="-lang-csharp"]:checked ~ .lp-csharp, .dqe input[id$="-lang-go"]:checked ~ .lp-go { display: block; } /* ── SPEC DOWNLOAD ── */ .dqe .spec-download-row { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 10px; } .dqe .spec-download-btn { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 600; color: var(--blue); background: var(--blue-light); border: 1px solid #C7D2FE; border-radius: 20px; padding: 5px 14px; cursor: pointer; font-family: inherit; } .dqe .spec-download-btn:hover { background: #dce4ff; } /* ── TABLES ── */ .dqe .tbl { width: 100%; border-collapse: collapse; font-size: 12px !important; margin-bottom: 20px; } .dqe .tbl thead th { text-align: left; padding: 8px 10px; font-size: 11px !important; font-weight: 700; text-transform: uppercase; letter-spacing: .4px; white-space: nowrap; } .dqe .tbl-blue thead { background: var(--blue); } .dqe .tbl-blue thead th { color: #fff; } .dqe .tbl-blue thead th:first-child { border-radius: 6px 0 0 0; } .dqe .tbl-blue thead th:last-child { border-radius: 0 6px 0 0; } .dqe .tbl tbody tr:nth-child(even) td { background: var(--gray-50); } .dqe .tbl tbody tr:hover td { background: var(--blue-light); } .dqe .tbl tbody td { font-size: 12px !important; padding: 8px 10px; border-bottom: 1px solid var(--gray-200); vertical-align: top; } .dqe .pname { font-family: 'SF Mono', monospace; font-size: 12px !important; font-weight: 600; color: var(--blue); white-space: nowrap; } .dqe .tbl-resp thead th:first-child { width: 130px !important; } .dqe .tbl-resp thead th:last-child { width: 105px !important; } .dqe .pdefault { font-size: 11px; color: var(--gray-400); margin-top: 4px; } .dqe .tbl-dark thead { background: var(--gray-800); } .dqe .tbl-dark thead th { color: #fff; } .dqe .tbl-dark thead th:first-child { border-radius: 6px 0 0 0; } .dqe .tbl-dark thead th:last-child { border-radius: 0 6px 0 0; } .dqe .ftype { font-size: 11px; color: var(--gray-400); font-family: 'SF Mono', monospace; } .dqe .na { color: var(--gray-400); font-size: 12px; font-style: italic; } .dqe .http-badge { display: inline-block; font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: 4px; font-family: 'SF Mono',monospace; } .dqe .http-400 { background: #FEE2E2; color: #991B1B; } .dqe .http-401 { background: #FEF3C7; color: #92400E; } .dqe .http-500 { background: #E5E7EB; color: #374151; } /* ── UTILITY ── */ .dqe .ex-label { font-size:12px; font-weight:700; text-transform:uppercase; letter-spacing:.5px; color:var(--gray-400); margin-bottom:4px; } .dqe .ex-label-mt { font-size:12px; font-weight:700; text-transform:uppercase; letter-spacing:.5px; color:var(--gray-400); margin:16px 0 4px; } .dqe .resp-collapse { margin:10px 0; } .dqe .resp-collapse summary { font-size:12px; font-weight:700; text-transform:uppercase; letter-spacing:.5px; color:var(--gray-400); cursor:pointer; list-style:none; padding:6px 0; } .dqe .resp-collapse summary::-webkit-details-marker { display:none; } .dqe .resp-collapse summary::marker { display:none; } .dqe .resp-collapse summary::before { content:'▶ '; font-size:10px; margin-right:4px; } .dqe .resp-collapse[open] summary::before { content:'▼ '; } .dqe .resp-collapse .code-block { margin-top:6px; } .dqe .no-mt { margin-top:0; } @media (max-width: 768px) { .dqe .main { padding: 0; } }
Number Verify - API ID Mobile

Utiliza este endpoint para verificar si el número de teléfono enviado en la solicitud coincide con el número que inicia la solicitud. El proceso consta de dos pasos: iniciar la solicitud de verificación y luego recuperar el resultado.

Related ID Mobile documentation:

Paso 1: Solicitar la verificación

Solicitud

Se admiten tanto GET como POST. Esto abre una página de consentimiento que el usuario final debe aceptar antes de poder recuperar el resultado en el paso 2.

{SERVER_ADDRESS} y {LICENCE_CODE} son proporcionados por DQE al crear la cuenta. {TOKEN} es el token de acceso obtenido del endpoint ID Mobile Access Token. Ponte en contacto con tu gestor de cuenta DQE para obtener la dirección del servidor y el código de licencia.
GEThttps://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify&redirect_uri={URL_REDIRECT}

Ejemplos de código

Solicitar un enlace de consentimiento de Number Verify

curl "https://{SERVER_ADDRESS}/IDMOBILE/?number=33612345678&token={TOKEN}&mode=2&name=MYCOMPANY&licence={LICENCE_CODE}&scope=numVerify"
fetch("https://{SERVER_ADDRESS}/IDMOBILE/?" + new URLSearchParams({ number: "33612345678", token: "{TOKEN}", mode: "2", name: "MYCOMPANY", licence: "{LICENCE_CODE}", scope: "numVerify" })) .then(r => r.json()) .then(data => console.log(data));
import requests response = requests.get( "https://{SERVER_ADDRESS}/IDMOBILE/", params={ "number": "33612345678", "token": "{TOKEN}", "mode": "2", "name": "MYCOMPANY", "licence": "{LICENCE_CODE}", "scope": "numVerify", }, ) print(response.json())
<?php $params = http_build_query([ 'number' => '33612345678', 'token' => '{TOKEN}', 'mode' => '2', 'name' => 'MYCOMPANY', 'licence' => '{LICENCE_CODE}', 'scope' => 'numVerify', ]); $ch = curl_init("https://{SERVER_ADDRESS}/IDMOBILE/?{$params}"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true);
const axios = require('axios'); axios.get('https://{SERVER_ADDRESS}/IDMOBILE/', { params: { number: '33612345678', token: '{TOKEN}', mode: '2', name: 'MYCOMPANY', licence: '{LICENCE_CODE}', scope: 'numVerify' } }) .then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient(); String url = "https://{SERVER_ADDRESS}/IDMOBILE/" + "?number=33612345678&token={TOKEN}&mode=2&name=MYCOMPANY&licence={LICENCE_CODE}&scope=numVerify"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .GET() .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
using var client = new HttpClient(); var url = "https://{SERVER_ADDRESS}/IDMOBILE/" + "?number=33612345678&token={TOKEN}&mode=2&name=MYCOMPANY&licence={LICENCE_CODE}&scope=numVerify"; var response = await client.GetAsync(url); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);
package main import ( "fmt" "io" "net/http" ) func main() { url := "https://{SERVER_ADDRESS}/IDMOBILE/" + "?number=33612345678&token={TOKEN}&mode=2&name=MYCOMPANY&licence={LICENCE_CODE}&scope=numVerify" resp, err := http.Get(url) if err != nil { panic(err) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) fmt.Println(string(body)) }
POSThttps://{SERVER_ADDRESS}/IDMOBILE/

Añade los siguientes parámetros en el cuerpo de la solicitud usando Content-Type: application/x-www-form-urlencoded:

Ejemplos de código

Solicitar un enlace de consentimiento de Number Verify

curl -X POST "https://{SERVER_ADDRESS}/IDMOBILE/" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "licence={LICENCE_CODE}" \ -d "number=33612345678" \ -d "token={TOKEN}" \ -d "mode=2" \ -d "name=MYCOMPANY" \ -d "scope=numVerify"
fetch("https://{SERVER_ADDRESS}/IDMOBILE/", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ licence: "{LICENCE_CODE}", number: "33612345678", token: "{TOKEN}", mode: "2", name: "MYCOMPANY", scope: "numVerify" }) }) .then(r => r.json()) .then(data => console.log(data));
import requests response = requests.post( "https://{SERVER_ADDRESS}/IDMOBILE/", data={ "licence": "{LICENCE_CODE}", "number": "33612345678", "token": "{TOKEN}", "mode": "2", "name": "MYCOMPANY", "scope": "numVerify", }, ) print(response.json())
<?php $ch = curl_init("https://{SERVER_ADDRESS}/IDMOBILE/"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ 'licence' => '{LICENCE_CODE}', 'number' => '33612345678', 'token' => '{TOKEN}', 'mode' => '2', 'name' => 'MYCOMPANY', 'scope' => 'numVerify', ])); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true);
const axios = require('axios'); const qs = require('querystring'); axios.post('https://{SERVER_ADDRESS}/IDMOBILE/', qs.stringify({ licence: '{LICENCE_CODE}', number: '33612345678', token: '{TOKEN}', mode: '2', name: 'MYCOMPANY', scope: 'numVerify' })) .then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient(); String form = "licence={LICENCE_CODE}&number=33612345678&token={TOKEN}&mode=2&name=MYCOMPANY&scope=numVerify"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://{SERVER_ADDRESS}/IDMOBILE/")) .header("Content-Type", "application/x-www-form-urlencoded") .POST(HttpRequest.BodyPublishers.ofString(form)) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
using var client = new HttpClient(); var form = new Dictionary<string, string> { ["licence"] = "{LICENCE_CODE}", ["number"] = "33612345678", ["token"] = "{TOKEN}", ["mode"] = "2", ["name"] = "MYCOMPANY", ["scope"] = "numVerify" }; var response = await client.PostAsync( "https://{SERVER_ADDRESS}/IDMOBILE/", new FormUrlEncodedContent(form)); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);
package main import ( "fmt" "io" "net/http" "net/url" ) func main() { form := url.Values{} form.Set("licence", "{LICENCE_CODE}") form.Set("number", "33612345678") form.Set("token", "{TOKEN}") form.Set("mode", "2") form.Set("name", "MYCOMPANY") form.Set("scope", "numVerify") resp, err := http.PostForm("https://{SERVER_ADDRESS}/IDMOBILE/", form) if err != nil { panic(err) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) fmt.Println(string(body)) }

Parámetros

Parámetro Descripción Obl / Opc
SERVER_ADDRESS Dirección del servidor DQE que procesará los datos. Mandatory
licence Número que se te asigna como código de licencia. Mandatory
number Número de teléfono. Mandatory
token Token obtenido mediante la autenticación. Mandatory
mode Valor estático. Debe ser 2. Mandatory
name Nombre del partner en la base de datos de DQE, normalmente el nombre de tu empresa. Mandatory
scope Valor estático. Debe ser numVerify para este scope. Mandatory
redirect_uri URL de redirección. DQE añade el token de sesión y el estado a la redirección. Optional
Combinación de scopes — numVerify se puede combinar con info (información del número de teléfono) en una sola solicitud, por ejemplo scope=numVerify,info. Consulta los campos de info más abajo.

Campos adicionales de info — se devuelven además de los campos propios de este endpoint cuando se incluye info en scope:

Campo Descripción Ejemplo
telorigine Número de teléfono de la solicitud. 0600000000
tel Número de teléfono formateado. +33600000000
geolocation Situación geográfica del número de teléfono. FRANCE
operator Operador actual del número de teléfono, si está suscrito. ORANGE
oldoperator Operador anterior del número de teléfono. SFR
ported Indica si el número de teléfono está portado, si está suscrito. Y
type Tipo de número de teléfono. MOBILE
iderror Código de error de la comprobación (0 o 1). 1

Respuesta

En caso de éxito, la API devuelve un objeto JSON que contiene la URL de la página de consentimiento que debe presentarse al usuario final.

Clave Descripción Tipo
status success String
operator Operador. String
url URL de la API del operador. String

Ejemplo de respuesta

Ejemplo de respuesta correcta
{ "status": "success", "operator": "SFR", "url": "htt***fr.fr/api/a**l8ET6UMbsaG0AOm5FsakgyKu*" }

Errores

Nota sobre los códigos de error 05-07 — estos tres códigos forman parte de la lista de validación compartida del paso 1 utilizada en todos los scopes de ID Mobile. Hacen referencia al parámetro user_infos y a su clave phone, que pertenecen a otros scopes (como Matching without OTP) — la propia solicitud de Number Verify no tiene esos campos, por lo que no se espera que estos códigos se activen en una llamada estándar de Number Verify.
ID de error Tipo de error Ejemplo de solicitud Respuesta
01 invalid request https://{SERVER_ADDRESS}/IDMOBILE/?token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
Ejemplo: falta el parámetro number.
{"status": "error", "error_id": "01", "error_type": "invalid request"}
02 invalid licence key https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={INCORRECT_LICENCE_CODE}&scope=numVerify
{"status": "error", "error_id": "02", "error_type": "invalid licence key"}
04 invalid scope https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=wrongScope
{"status": "error", "error_id": "04", "error_type": "invalid scope"}
05 missing or empty parameter (user_infos) for this scope No se activa con los parámetros propios de Number Verify
Este código proviene de una capa de validación compartida entre los scopes de ID Mobile y hace referencia a los campos user_infos/phone utilizados por otros scopes (como Matching without OTP). Number Verify no tiene ese parámetro.
{"status": "error", "error_id": "05", "error_type": "missing or empty parameter (user_infos) for this scope"}
06 bad parameter format (user_infos) is not a valid JSON No se activa con los parámetros propios de Number Verify
Este código proviene de una capa de validación compartida entre los scopes de ID Mobile y hace referencia a los campos user_infos/phone utilizados por otros scopes (como Matching without OTP). Number Verify no tiene ese parámetro.
{"status": "error", "error_id": "06", "error_type": "bad parameter format (user_infos) is not a valid JSON"}
07 missing mandatory key in user informations (phone) No se activa con los parámetros propios de Number Verify
Este código proviene de una capa de validación compartida entre los scopes de ID Mobile y hace referencia a los campos user_infos/phone utilizados por otros scopes (como Matching without OTP). Number Verify no tiene ese parámetro.
{"status": "error", "error_id": "07", "error_type": "missing mandatory key in user informations (phone)"}
09 ineligible phone number https://{SERVER_ADDRESS}/IDMOBILE/?number={INELIGIBLE_NUMBER}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
{"status": "error", "error_id": "09", "error_type": "ineligible phone number"}
10 invalid phone number https://{SERVER_ADDRESS}/IDMOBILE/?number={INVALID_NUMBER}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
{"status": "error", "error_id": "10", "error_type": "invalid phone number"}
11 phone number is empty https://{SERVER_ADDRESS}/IDMOBILE/?number=&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
{"status": "error", "error_id": "11", "error_type": "phone number is empty"}
12 phone check failed https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
Condición del lado del operador — una solicitud sintácticamente válida puede fallar aquí.
{"status": "error", "error_id": "12", "error_type": "phone check failed"}
13 operator [Operator Name] not found https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
Condición del lado del operador.
{"status": "error", "error_id": "13", "error_type": "operator [Operator Name] not found"}
14 operator [Operator Name] not authorized for this licence https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
Condición del lado del operador — tu licencia no está autorizada para este operador.
{"status": "error", "error_id": "14", "error_type": "operator [Operator Name] not authorized for this licence"}
15 operator [Operator Name] not supported yet https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
Condición del lado del operador.
{"status": "error", "error_id": "15", "error_type": "operator [Operator Name] not supported yet"}
16 operator [Operator Name] unreachable https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
Condición del lado del operador.
{"status": "error", "error_id": "16", "error_type": "operator [Operator Name] unreachable"}
17 scope not supported by this operator [Operator Name] yet https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
Condición del lado del operador.
{"status": "error", "error_id": "17", "error_type": "scope not supported by this operator [Operator Name] yet"}
30 invalid or expired token https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={EXPIRED_TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=numVerify
{"status": "error", "error_id": "30", "error_type": "invalid or expired token"}

Probar la API

Haz clic en el botón de abajo para probar este endpoint en directo en tu navegador.

Abrir consola
Paso 2 — Recuperar el resultado

Una vez que el usuario final haya aceptado (o rechazado) la página de consentimiento del paso 1, llama a este endpoint para recuperar el resultado de la verificación.

Paso 2: Recuperar el resultado

Solicitud

Se admiten tanto GET como POST.

{SERVER_ADDRESS} y {LICENCE_CODE} son proporcionados por DQE al crear la cuenta. {TOKEN} es el mismo token de acceso utilizado en el paso 1.
GEThttps://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify

Ejemplos de código

Recuperar el resultado de Number Verify

curl "https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify"
fetch("https://{SERVER_ADDRESS}/GET/?" + new URLSearchParams({ token: "{TOKEN}", Licence: "{LICENCE_CODE}", scope: "numVerify" })) .then(r => r.json()) .then(data => console.log(data));
import requests response = requests.get( "https://{SERVER_ADDRESS}/GET/", params={ "token": "{TOKEN}", "Licence": "{LICENCE_CODE}", "scope": "numVerify", }, ) print(response.json())
<?php $params = http_build_query([ 'token' => '{TOKEN}', 'Licence' => '{LICENCE_CODE}', 'scope' => 'numVerify', ]); $ch = curl_init("https://{SERVER_ADDRESS}/GET/?{$params}"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true);
const axios = require('axios'); axios.get('https://{SERVER_ADDRESS}/GET/', { params: { token: '{TOKEN}', Licence: '{LICENCE_CODE}', scope: 'numVerify' } }) .then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient(); String url = "https://{SERVER_ADDRESS}/GET/" + "?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .GET() .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
using var client = new HttpClient(); var url = "https://{SERVER_ADDRESS}/GET/" + "?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify"; var response = await client.GetAsync(url); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);
package main import ( "fmt" "io" "net/http" ) func main() { url := "https://{SERVER_ADDRESS}/GET/" + "?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify" resp, err := http.Get(url) if err != nil { panic(err) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) fmt.Println(string(body)) }
POSThttps://{SERVER_ADDRESS}/GET/

Añade los siguientes parámetros en el cuerpo de la solicitud usando Content-Type: application/x-www-form-urlencoded:

Ejemplos de código

Recuperar el resultado de Number Verify

curl -X POST "https://{SERVER_ADDRESS}/GET/" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "Licence={LICENCE_CODE}" \ -d "token={TOKEN}" \ -d "scope=numVerify"
fetch("https://{SERVER_ADDRESS}/GET/", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ Licence: "{LICENCE_CODE}", token: "{TOKEN}", scope: "numVerify" }) }) .then(r => r.json()) .then(data => console.log(data));
import requests response = requests.post( "https://{SERVER_ADDRESS}/GET/", data={ "Licence": "{LICENCE_CODE}", "token": "{TOKEN}", "scope": "numVerify", }, ) print(response.json())
<?php $ch = curl_init("https://{SERVER_ADDRESS}/GET/"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ 'Licence' => '{LICENCE_CODE}', 'token' => '{TOKEN}', 'scope' => 'numVerify', ])); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true);
const axios = require('axios'); const qs = require('querystring'); axios.post('https://{SERVER_ADDRESS}/GET/', qs.stringify({ Licence: '{LICENCE_CODE}', token: '{TOKEN}', scope: 'numVerify' })) .then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient(); String form = "Licence={LICENCE_CODE}&token={TOKEN}&scope=numVerify"; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://{SERVER_ADDRESS}/GET/")) .header("Content-Type", "application/x-www-form-urlencoded") .POST(HttpRequest.BodyPublishers.ofString(form)) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body());
using var client = new HttpClient(); var form = new Dictionary<string, string> { ["Licence"] = "{LICENCE_CODE}", ["token"] = "{TOKEN}", ["scope"] = "numVerify" }; var response = await client.PostAsync( "https://{SERVER_ADDRESS}/GET/", new FormUrlEncodedContent(form)); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);
package main import ( "fmt" "io" "net/http" "net/url" ) func main() { form := url.Values{} form.Set("Licence", "{LICENCE_CODE}") form.Set("token", "{TOKEN}") form.Set("scope", "numVerify") resp, err := http.PostForm("https://{SERVER_ADDRESS}/GET/", form) if err != nil { panic(err) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) fmt.Println(string(body)) }

Parámetros

Parámetro Descripción Obl / Opc
SERVER_ADDRESS Dirección del servidor DQE que procesará los datos. Mandatory
Licence Número que se te asigna como código de licencia. Mandatory
token Token obtenido mediante la autenticación. Mandatory
scope Valor estático. Debe ser numVerify para este scope. Mandatory

Respuesta

Éxito

Clave Descripción Tipo
status success: information was successfully retrieved. String
scope Contiene el scope enviado previamente. String
numVerify Siempre es true cuando esta clave está presente — confirma que el número de teléfono coincide. Un número de teléfono que no coincide nunca se devuelve como numVerify: false en una respuesta correcta; en su lugar, se devuelve como el error 20 (consulta Errores más abajo). Boolean

Pendiente

Se devuelve mientras DQE sigue esperando la respuesta del operador — vuelve a consultar el paso 2 tras una breve espera.

Clave Descripción Tipo
status pending: DQE is waiting for the operator response. String
scope Contiene numVerify. String

Ejemplo de respuesta

Ejemplo de respuesta correcta
{ "status": "success", "scope": "numVerify", "numVerify": true }
Ejemplo de respuesta pendiente
{ "status": "pending", "scope": "numVerify" }

Errores

ID de error Tipo de error Ejemplo de solicitud Respuesta
01 invalid request https://{SERVER_ADDRESS}/GET/?Licence={LICENCE_CODE}&scope=numVerify
Example: missing token parameter.
{"status": "error", "error_id": "01", "error_type": "invalid request"}
02 invalid licence key https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={INCORRECT_LICENCE_CODE}&scope=numVerify
{"status": "error", "error_id": "02", "error_type": "invalid licence key"}
04 invalid scope https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=wrongScope
{"status": "error", "error_id": "04", "error_type": "invalid scope"}
18 failed to retrieve data from operator https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify
No se recibieron datos tras la validación OTP.
{"status": "error", "error_id": "18", "error_type": "failed to retrieve data from operator"}
20 Not the same phone number between the phone in the request https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify
El número de teléfono enviado en la solicitud no coincide con el que inicia la solicitud — esto equivale a un resultado numVerify: false, devuelto como error en lugar de como respuesta correcta.
{"status": "error", "error_id": "20", "error_type": "Not the same phone number between the phone in the request"}
21 access denied https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify
La validación OTP fue rechazada.
{"status": "error", "error_id": "21", "error_type": "access denied"}
30 invalid or expired token https://{SERVER_ADDRESS}/GET/?token={EXPIRED_TOKEN}&Licence={LICENCE_CODE}&scope=numVerify
{"status": "error", "error_id": "30", "error_type": "invalid or expired token"}
99 internal server error https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=numVerify
Error del servidor.
{"status": "error", "error_id": "99", "error_type": "internal server error"}
Example error response
{ "status": "error", "error_id": "20", "error_type": "OTP process failed" }

Probar la API

Haz clic en el botón de abajo para probar este endpoint en directo en tu navegador.

Abrir consola

Ver también

¿Fue útil este artículo?

Usuarios a los que les pareció útil: 0 de 0