ID Mobile — Match user identity without OTP

Support DQE
Support DQE
  • Updated
Matching without OTP - ID Mobile API

Use this endpoint to compare user-submitted data against operator data, without requiring user consent (OTP). Returns a similarity score for each field.

Related ID Mobile documentation:

Matching without OTP

Request

Both GET and POST are supported. This is a single-step call — the comparison result is returned directly in the response, no consent page or retrieval step is required.

{SERVER_ADDRESS} and {LICENCE_CODE} are provided by DQE upon account creation. {TOKEN} is the access token obtained from the ID Mobile Access Token endpoint. Contact your DQE account manager for the server address and licence code.
GEThttps://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode={MODE}&name={NAME}&code_name={CODE_NAME}&licence={LICENCE_CODE}&user_infos={INFORMATION}&scope=matching_notp&redirect_uri={URL_REDIRECT}&country={COUNTRY}&format={FORMAT}&period={PERIOD}

Replace the values in braces with your own information — see the Parameters table below.

Code examples

Compare submitted identity data against the operator's — user_infos is shown here as the {INFORMATION} placeholder; see the worked example below the Parameters table for its real JSON shape.

curl "https://{SERVER_ADDRESS}/IDMOBILE/?number=33612345678&token={TOKEN}&mode=2&name=MYCOMPANY&licence={LICENCE_CODE}&user_infos={INFORMATION}&scope=matching_notp"
fetch("https://{SERVER_ADDRESS}/IDMOBILE/?" + new URLSearchParams({ number: "33612345678", token: "{TOKEN}", mode: "2", name: "MYCOMPANY", licence: "{LICENCE_CODE}", user_infos: "{INFORMATION}", scope: "matching_notp" })) .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}", "user_infos": "{INFORMATION}", "scope": "matching_notp", }, ) print(response.json())
<?php $params = http_build_query([ 'number' => '33612345678', 'token' => '{TOKEN}', 'mode' => '2', 'name' => 'MYCOMPANY', 'licence' => '{LICENCE_CODE}', 'user_infos' => '{INFORMATION}', 'scope' => 'matching_notp', ]); $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}', user_infos: '{INFORMATION}', scope: 'matching_notp' } }) .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}&user_infos={INFORMATION}&scope=matching_notp"; 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}&user_infos={INFORMATION}&scope=matching_notp"; 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}&user_infos={INFORMATION}&scope=matching_notp" 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/

Add the following parameters in the request body using Content-Type: application/x-www-form-urlencoded:

Code examples

Compare submitted identity data against the operator's

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 "user_infos={INFORMATION}" \ -d "scope=matching_notp"
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", user_infos: "{INFORMATION}", scope: "matching_notp" }) }) .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", "user_infos": "{INFORMATION}", "scope": "matching_notp", }, ) 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', 'user_infos' => '{INFORMATION}', 'scope' => 'matching_notp', ])); 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', user_infos: '{INFORMATION}', scope: 'matching_notp' })) .then(response => console.log(response.data));
HttpClient client = HttpClient.newHttpClient(); String form = "licence={LICENCE_CODE}&number=33612345678&token={TOKEN}&mode=2&name=MYCOMPANY&user_infos={INFORMATION}&scope=matching_notp"; 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", ["user_infos"] = "{INFORMATION}", ["scope"] = "matching_notp" }; 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("user_infos", "{INFORMATION}") form.Set("scope", "matching_notp") 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)) }

Parameters

Parameter Description Mand / Opt
SERVER_ADDRESS Address of the DQE server that will process the data. Mandatory
licence Number assigned to you as your licence code. Mandatory
number Phone number. Mandatory
token Token retrieved through authentication. Mandatory
mode 2: authentication by code. Mandatory
name Partner name in the DQE Software database, usually your company name. Mandatory
code_name Optional field containing a code associated with name. Optional
user_infos JSON object containing the client information to compare. See the user_infos keys table below. Mandatory if the scope is matching_notp. Optional
scope Static value. Must be matching_notp for this scope. Mandatory
redirect_uri Redirection URL. DQE adds the session token and status to the redirect. Optional
country Use only for international Matching without OTP. Expected value: ISO 2-letter country code. Optional
format Phone number format code (see the DQE Phone API documentation) used to reformat the phone number. Optional
period Validity window for the SIM swap check, in hours (0 to 72). Only relevant when the simswap scope is combined in — see the note below. Optional
Combining scopes — matching_notp can be combined with simswap (fraud prevention) in a single request, e.g. scope=matching_notp,simswap, and with info (phone number intelligence) in any combination, e.g. scope=matching_notp,info. The format parameter is used when the info scope is combined in, and period becomes relevant when the simswap scope is combined in. See the info fields below. Contact your DQE account manager for guidance on the full combined matching_notp+simswap response shape.

info add-on fields — returned in addition to this endpoint's own fields when info is included in scope:

Field Description Example
telorigine Phone number in the request. 0600000000
tel Phone number, formatted. +33600000000
geolocation Geographic situation of the phone number. FRANCE
operator Current operator of the phone number, if subscribed. ORANGE
oldoperator Previous operator of the phone number. SFR
ported Indicates if the phone number is ported, if subscribed. Y
type Type of the phone number. MOBILE
iderror Error code of the check (0 or 1). 1

user_infos keys — each key must be present, even if no value is provided:

Key Description
street_address Street type and name.
postal_code Postal code.
locality City.
country Country name in full.
birthdate Date of birth in YYYY-MM-DD format.
email Email address.
lastname Last name.
maiden_name Maiden name.
gender Gender: M or F.
firstname First name.
phone Phone number.
number Street number. This key must be present in the JSON payload, but it does not need to be filled in.

Example user_infos value (all keys present, empty where unknown)

{ "street_address": "", "postal_code": "", "locality": "", "country": "", "birthdate": "", "email": "", "lastname": "", "maiden_name": "", "gender": "", "firstname": "", "phone": "", "number": "" }

Response

The API returns a JSON object with a similarity score for each field:

Key Description Type
family_name Similarity score for the last name. Number
gender Similarity score for civility. Number
birthdate Similarity score for the date of birth. Number
given_name Similarity score for the first name. Number
address Object containing address similarity scores. Keys: country, postal_code, street_address, locality. Object
email Similarity score for the email address. Number

Response example

Example success response
{ "family_name": 1.0, "gender": "", "birthdate": 1.0, "given_name": 1.0, "address": { "country": 1.0, "postal_code": 0.78, "street_address": 0.56, "locality": 0.44 }, "email": 1.0 }

Errors

The API returns a JSON object containing status, error_type and error_id on failure:

Error ID Error type Example request Response
01 invalid request https://{SERVER_ADDRESS}/IDMOBILE/?token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&user_infos={INFORMATION}&scope=matching_notp
Example: missing number parameter.
{"status": "error", "error_type": "invalid request", "error_id": "01"}
02 invalid licence key https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={INCORRECT_LICENCE_CODE}&user_infos={INFORMATION}&scope=matching_notp
{"status": "error", "error_type": "invalid licence key", "error_id": "02"}
04 invalid scope https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&user_infos={INFORMATION}&scope=wrongScope
{"status": "error", "error_type": "invalid scope", "error_id": "04"}
05 missing or empty parameter (user_infos) for this scope https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&scope=matching_notp
Example: missing user_infos parameter.
{"status": "error", "error_type": "missing or empty parameter (user_infos) for this scope", "error_id": "05"}
06 bad parameter format (user_infos) is not a valid JSON https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&user_infos=not-valid-json&scope=matching_notp
{"status": "error", "error_type": "bad parameter format (user_infos) is not a valid JSON", "error_id": "06"}
07 missing mandatory key in user informations (phone) https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&user_infos=%7B...no+phone+key...%7D&scope=matching_notp
Example: the user_infos JSON object is missing its phone key.
{"status": "error", "error_type": "missing mandatory key in user informations (phone)", "error_id": "07"}
09 ineligible phone number https://{SERVER_ADDRESS}/IDMOBILE/?number={INELIGIBLE_NUMBER}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&user_infos={INFORMATION}&scope=matching_notp
{"status": "error", "error_type": "ineligible phone number", "error_id": "09"}
10 invalid phone number https://{SERVER_ADDRESS}/IDMOBILE/?number={INVALID_NUMBER}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&user_infos={INFORMATION}&scope=matching_notp
{"status": "error", "error_type": "invalid phone number", "error_id": "10"}
11 phone number is empty https://{SERVER_ADDRESS}/IDMOBILE/?number=&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&user_infos={INFORMATION}&scope=matching_notp
{"status": "error", "error_type": "phone number is empty", "error_id": "11"}
12 phone check failed https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&user_infos={INFORMATION}&scope=matching_notp
Operator-side condition — a syntactically valid request can still fail here.
{"status": "error", "error_type": "phone check failed", "error_id": "12"}
13 operator [Operator Name] not found https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&user_infos={INFORMATION}&scope=matching_notp
Operator-side condition.
{"status": "error", "error_type": "operator [Operator Name] not found", "error_id": "13"}
14 operator [Operator Name] not authorized for this licence https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&user_infos={INFORMATION}&scope=matching_notp
Operator-side condition — your licence is not authorised for this operator.
{"status": "error", "error_type": "operator [Operator Name] not authorized for this licence", "error_id": "14"}
15 operator [Operator Name] not supported yet https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&user_infos={INFORMATION}&scope=matching_notp
Operator-side condition.
{"status": "error", "error_type": "operator [Operator Name] not supported yet", "error_id": "15"}
16 operator [Operator Name] unreachable https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&user_infos={INFORMATION}&scope=matching_notp
Operator-side condition.
{"status": "error", "error_type": "operator [Operator Name] unreachable", "error_id": "16"}
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}&user_infos={INFORMATION}&scope=matching_notp
Operator-side condition.
{"status": "error", "error_type": "scope not supported by this operator [Operator Name] yet", "error_id": "17"}
30 invalid or expired token https://{SERVER_ADDRESS}/IDMOBILE/?number={NUM}&token={EXPIRED_TOKEN}&mode=2&name={NAME}&licence={LICENCE_CODE}&user_infos={INFORMATION}&scope=matching_notp
{"status": "error", "error_type": "invalid or expired token", "error_id": "30"}
Example error response
{ "status": "error", "error_type": "invalid phone number", "error_id": "10" }

Test the API

Click the button below to test this endpoint live in your browser.

Open console

See also

Was this article helpful?

0 out of 0 found this helpful