ID Mobile API — Formfilling
Utilice este endpoint para recuperar la información del usuario (nombre, fecha de nacimiento, correo electrónico, dirección postal) registrada en el operador, con el consentimiento del usuario. El proceso consta de dos pasos: iniciar la solicitud de consentimiento y, después, recuperar los datos.
Flujo en dos pasos - Primero llame a /IDMOBILE/ para solicitar el consentimiento del usuario y obtener la URL de la página de consentimiento del operador. Una vez completado el consentimiento, llame a /GET/ para recuperar los datos del usuario.
Documentación relacionada de ID Mobile:
⬇ Descargar la especificación OpenAPI 3.0.0 (JSON)
Paso 1 de 2 — Solicitar consentimiento
Inicie la solicitud de consentimiento y obtenga la URL de la página de consentimiento del operador.
Paso 1 — Iniciar la solicitud de consentimiento
Solicitud
Se admiten tanto GET como POST.
{SERVER_ADDRESS} y {LICENCE_CODE} son proporcionados por DQE al crear la cuenta. Póngase en contacto con su gestor de cuenta de DQE para obtenerlos.
GET POST
GET https://{SERVER_ADDRESS}/IDMOBILE/?number ={NUM}&token ={TOKEN}&mode ={MODE}&name ={NAME}&code_name ={CODE_NAME}&licence ={LICENCE_CODE}&scope =formfilling&redirect_uri ={URL_REDIRECT}
Ejemplos de código
Solicitar el consentimiento para recuperar los datos del usuario
cURL JavaScript Python PHP Node.js Java C# Go
curl "https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode={MODE}&name={NAME}&code_name={CODE_NAME}&licence={LICENCE_CODE}&scope=formfilling&redirect_uri={URL_REDIRECT}"
fetch("https://{SERVER_ADDRESS}/IDMOBILE/?" + new URLSearchParams({
number: "{NUM}",
token: "{TOKEN}",
mode: "{MODE}",
name: "{NAME}",
code_name: "{CODE_NAME}",
licence: "{LICENCE_CODE}",
scope: "formfilling",
redirect_uri: "{URL_REDIRECT}"
}))
.then(r => r.json())
.then(data => console.log(data));
import requests
response = requests.get(
"https://{SERVER_ADDRESS}/IDMOBILE/",
params={
"number": "{NUM}",
"token": "{TOKEN}",
"mode": "{MODE}",
"name": "{NAME}",
"code_name": "{CODE_NAME}",
"licence": "{LICENCE_CODE}",
"scope": "formfilling",
"redirect_uri": "{URL_REDIRECT}",
},
)
print(response.json())
<?php
$params = http_build_query([
'number' => '{NUM}',
'token' => '{TOKEN}',
'mode' => '{MODE}',
'name' => '{NAME}',
'code_name' => '{CODE_NAME}',
'licence' => '{LICENCE_CODE}',
'scope' => 'formfilling',
'redirect_uri' => '{URL_REDIRECT}',
]);
$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: '{NUM}',
token: '{TOKEN}',
mode: '{MODE}',
name: '{NAME}',
code_name: '{CODE_NAME}',
licence: '{LICENCE_CODE}',
scope: 'formfilling',
redirect_uri: '{URL_REDIRECT}'
}
})
.then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient();
String url = "https://{SERVER_ADDRESS}/IDMOBILE/"
+ "?number={NUM}&token={TOKEN}&mode={MODE}&name={NAME}&code_name={CODE_NAME}&licence={LICENCE_CODE}&scope=formfilling&redirect_uri={URL_REDIRECT}";
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={NUM}&token={TOKEN}&mode={MODE}&name={NAME}&code_name={CODE_NAME}&licence={LICENCE_CODE}&scope=formfilling&redirect_uri={URL_REDIRECT}";
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={NUM}&token={TOKEN}&mode={MODE}&name={NAME}&code_name={CODE_NAME}&licence={LICENCE_CODE}&scope=formfilling&redirect_uri={URL_REDIRECT}"
resp, err := http.Get(url)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
POST https://{SERVER_ADDRESS}/IDMOBILE/
Añada los siguientes parámetros en el cuerpo de la solicitud usando x-www-form-urlencoded.
Ejemplos de código
Solicitar el consentimiento para recuperar los datos del usuario
cURL JavaScript Python PHP Node.js Java C# Go
curl -X POST "https://{SERVER_ADDRESS}/IDMOBILE/" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "licence={LICENCE_CODE}" \
-d "number={NUM}" \
-d "token={TOKEN}" \
-d "mode={MODE}" \
-d "name={NAME}" \
-d "code_name={CODE_NAME}" \
-d "scope=formfilling" \
-d "redirect_uri={URL_REDIRECT}"
fetch("https://{SERVER_ADDRESS}/IDMOBILE/", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
licence: "{LICENCE_CODE}",
number: "{NUM}",
token: "{TOKEN}",
mode: "{MODE}",
name: "{NAME}",
code_name: "{CODE_NAME}",
scope: "formfilling",
redirect_uri: "{URL_REDIRECT}"
})
})
.then(r => r.json())
.then(data => console.log(data));
import requests
response = requests.post(
"https://{SERVER_ADDRESS}/IDMOBILE/",
data={
"licence": "{LICENCE_CODE}",
"number": "{NUM}",
"token": "{TOKEN}",
"mode": "{MODE}",
"name": "{NAME}",
"code_name": "{CODE_NAME}",
"scope": "formfilling",
"redirect_uri": "{URL_REDIRECT}",
},
)
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' => '{NUM}',
'token' => '{TOKEN}',
'mode' => '{MODE}',
'name' => '{NAME}',
'code_name' => '{CODE_NAME}',
'scope' => 'formfilling',
'redirect_uri' => '{URL_REDIRECT}',
]));
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: '{NUM}',
token: '{TOKEN}',
mode: '{MODE}',
name: '{NAME}',
code_name: '{CODE_NAME}',
scope: 'formfilling',
redirect_uri: '{URL_REDIRECT}'
}))
.then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient();
String form = "licence={LICENCE_CODE}&number={NUM}&token={TOKEN}&mode={MODE}&name={NAME}&code_name={CODE_NAME}&scope=formfilling&redirect_uri={URL_REDIRECT}";
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"] = "{NUM}",
["token"] = "{TOKEN}",
["mode"] = "{MODE}",
["name"] = "{NAME}",
["code_name"] = "{CODE_NAME}",
["scope"] = "formfilling",
["redirect_uri"] = "{URL_REDIRECT}"
};
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", "{NUM}")
form.Set("token", "{TOKEN}")
form.Set("mode", "{MODE}")
form.Set("name", "{NAME}")
form.Set("code_name", "{CODE_NAME}")
form.Set("scope", "formfilling")
form.Set("redirect_uri", "{URL_REDIRECT}")
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.
Obligatorio
licence
Número asignado como su código de licencia.
Obligatorio
number
Número de teléfono.
Obligatorio
token
Token obtenido mediante la autenticación.
Obligatorio
mode
2: autenticación por código.Fixed value: 2
Obligatorio
name
Nombre del partner en la base de datos de DQE Software, normalmente el nombre de su empresa.
Obligatorio
code_name
Campo opcional que contiene un código asociado a name.
Opcional
scope
Static value. Must be formfilling for this scope.Fixed value: formfilling
Obligatorio
redirect_uri
URL de redirección. DQE añade el token de sesión y el estado a la redirección.
Opcional
Combinación de scopes — formfilling se puede combinar con billing (ambos basados en consentimiento) en una sola solicitud, p. ej. scope=formfilling,billing, y con info (información del número de teléfono) en cualquier combinación, p. ej. scope=formfilling,info. Consulte los campos de info a continuación. Póngase en contacto con su gestor de cuenta de DQE para conocer la estructura completa de la respuesta combinada de formfilling+billing.
Campos adicionales de info — se devuelven además de los campos propios de este endpoint cuando info se incluye en scope:
Campo
Descripción
Ejemplo
telorigine
Número de teléfono en 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 ha sido portado, si está suscrito.
Y
type
Tipo de número de teléfono.
MOBILE
iderror
Código de error de la verificación (0 o 1).
1
Respuesta
Si la solicitud se realiza correctamente, la API devuelve un objeto JSON con las siguientes claves.
Clave
Descripción
Tipo
status
success
STRING
operator
Operador.
STRING
url
URL de la API del operador.
STRING
Ejemplo de respuesta
Solicitud de consentimiento correcta {
"status" : "success" ,
"operator" : "Orange" ,
"url" : "https://api.operator/openidconnect/fr"
}
Errores
ID de error
Tipo de error
Descripción
01
invalid request
La solicitud no es válida.
02
invalid licence key
La licencia no es válida.
04
invalid scope
Scope no válido.
05
missing or empty parameter (user_infos) for this scope
Falta un parámetro para el scope solicitado.
06
bad parameter format (user_infos) is not a valid JSON
El parámetro user_infos no es un JSON válido.
07
missing mandatory key in user informations (phone)
La clave phone es obligatoria en el parámetro user_infos para este operador.
09
ineligible phone number
El número de teléfono no es apto para la solución.
10
invalid phone number
El número de teléfono no existe.
11
phone number is empty
El número de teléfono está vacío.
12
phone check failed
La verificación del operador falló.
13
operator [Operator Name] not found
No se pudo encontrar el operador.
14
operator [Operator Name] not authorized for this licence
Su licencia no está autorizada para este operador.
15
operator [Operator Name] not supported yet
La solución aún no está disponible para este operador.
16
operator [Operator Name] unreachable
No se pudo contactar con el operador.
17
scope not supported by this operator [Operator Name] yet
Este scope no es compatible con el operador.
30
invalid or expired token
El token ha expirado.
Probar la API
Haga clic en el botón de abajo para probar este endpoint en directo desde su navegador.
Abrir consola
Paso 2 de 2 — Recuperar los datos del usuario
Una vez que el usuario haya dado su consentimiento, recupere los datos devueltos por el operador.
Paso 2 — Recuperar los datos del usuario
Solicitud
Se admiten tanto GET como POST.
{SERVER_ADDRESS} y {LICENCE_CODE} son proporcionados por DQE al crear la cuenta. Póngase en contacto con su gestor de cuenta de DQE para obtenerlos.
GET POST
GET https://{SERVER_ADDRESS}/GET/?token ={TOKEN}&Licence ={LICENCE_CODE}&scope =formfilling
Ejemplos de código
Recuperar los datos del usuario una vez completado el consentimiento
cURL JavaScript Python PHP Node.js Java C# Go
curl "https://{SERVER_ADDRESS}/GET/?token={TOKEN}&Licence={LICENCE_CODE}&scope=formfilling"
fetch("https://{SERVER_ADDRESS}/GET/?" + new URLSearchParams({
token: "{TOKEN}",
Licence: "{LICENCE_CODE}",
scope: "formfilling"
}))
.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": "formfilling",
},
)
print(response.json())
<?php
$params = http_build_query([
'token' => '{TOKEN}',
'Licence' => '{LICENCE_CODE}',
'scope' => 'formfilling',
]);
$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: 'formfilling'
}
})
.then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient();
String url = "https://{SERVER_ADDRESS}/GET/"
+ "?token={TOKEN}&Licence={LICENCE_CODE}&scope=formfilling";
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=formfilling";
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=formfilling"
resp, err := http.Get(url)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
POST https://{SERVER_ADDRESS}/GET/
Añada los siguientes parámetros en el cuerpo de la solicitud usando x-www-form-urlencoded.
Ejemplos de código
Recuperar los datos del usuario una vez completado el consentimiento
cURL JavaScript Python PHP Node.js Java C# Go
curl -X POST "https://{SERVER_ADDRESS}/GET/" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "Licence={LICENCE_CODE}" \
-d "token={TOKEN}" \
-d "scope=formfilling"
fetch("https://{SERVER_ADDRESS}/GET/", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
Licence: "{LICENCE_CODE}",
token: "{TOKEN}",
scope: "formfilling"
})
})
.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": "formfilling",
},
)
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' => 'formfilling',
]));
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: 'formfilling'
}))
.then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient();
String form = "Licence={LICENCE_CODE}&token={TOKEN}&scope=formfilling";
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"] = "formfilling"
};
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", "formfilling")
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.
Obligatorio
Licence
Número asignado como su código de licencia.
Obligatorio
token
Token obtenido mediante la autenticación.
Obligatorio
scope
Static value. Must be formfilling for this scope.Fixed value: formfilling
Obligatorio
Respuesta
The API returns a JSON object containing the following keys:
Clave
Descripción
Tipo
status
success: la información se recuperó correctamente.
STRING
scope
Contiene el scope enviado previamente.
STRING
code_name
Contiene el code_name enviado previamente.
STRING
formfilling
Objeto que contiene los datos del usuario recuperados. Consulte la tabla de claves a continuación.
JSON OBJECT
Clave
Descripción
Tipo
phone_number
Número de teléfono.
STRING(10)
family_name
Last name.
STRING
name
First name and last name.
STRING
locale
Native language.
STRING(3)
gender
Gender: M for male, F for female.
STRING
updated_at
Date of last information update.
DATE
birthdate
Birth date.
DATE
birthplace
Birth department.
STRING
given_name
First name.
STRING
address
Postal address object. Keys: country, postal_code, formatted, street_address, number, locality.
JSON OBJECT
email
Complete email address.
STRING
email_domain
Email domain.
STRING
email_account
Email username.
STRING
subscriber_msisdn
Phone number used for the contract subscription.
STRING(10)
sub
Customer identifier in the operator database.
STRING
Pending
Clave
Descripción
Tipo
status
pending: DQE está esperando la respuesta del operador.
STRING
scope
Contiene formfilling.
STRING
Ejemplo de respuesta
Recuperación correcta {
"status" : "success" ,
"scope" : "formfilling" ,
"code_name" : "" ,
"formfilling" : {
"phone_number" : "" ,
"family_name" : "" ,
"name" : " -" ,
"locale" : "fr-FR" ,
"gender" : "M" ,
"email_domain" : ".com" ,
"updated_at" : "-08-09" ,
"birthdate" : "-08-30" ,
"birthplace" : "-08-30" ,
"given_name" : "" ,
"address" : {
"locality" : "" ,
"country" : "" ,
"number" : "" ,
"formatted" : "" ,
"postal_code" : "" ,
"street_address" : ""
},
"email_account" : "" ,
"email" : "" ,
"subscriber_msisdn" : "" ,
"sub" : ""
}
}
Pendiente — esperando al operador {
"status" : "pending" ,
"scope" : "formfilling"
}
Error {
"status" : "error" ,
"error_type" : "internal server error" ,
"error_id" : "99"
}
Errores
ID de error
Tipo de error
Descripción
01
invalid request
La solicitud no es válida.
02
invalid licence key
La licencia no es válida.
04
invalid scope
Scope no válido.
18
failed to retrieve data from operator
No se recibieron datos tras la validación del OTP.
20
OTP incorrect
La validación del OTP no se completó.
21
access denied
La validación del OTP fue rechazada.
30
invalid or expired token
El token ha expirado.
99
internal server error
Error del servidor.
Probar la API
Haga clic en el botón de abajo para probar este endpoint en directo desde su navegador.
Abrir consola