Phone Trust
curl --request POST \
--url https://api.deepidv.com/v1/screening/phone-trustimport requests
url = "https://api.deepidv.com/v1/screening/phone-trust"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.deepidv.com/v1/screening/phone-trust', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.deepidv.com/v1/screening/phone-trust",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.deepidv.com/v1/screening/phone-trust"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.deepidv.com/v1/screening/phone-trust")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.deepidv.com/v1/screening/phone-trust")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_body{
"tripped": false,
"tripReasons": [],
"simSwappedRisk": "LOW_RISK",
"simChangedDate": "2025-09-15T16:27:35.000Z",
"forwardingRisk": "NO_RISK",
"sensitivity": "medium",
"statusMessage": "Response from one supplier",
"checkedAt": "2026-09-16T16:27:35.444Z",
"correlationId": "c1793fcc-2dd0-4808-baf2-006955c3ffcc"
}
{
"tripped": true,
"tripReasons": ["SIM_SWAP_HIGH_RISK"],
"simSwappedRisk": "HIGH_RISK",
"simChangedDate": "2026-09-15T08:00:00.000Z",
"forwardingRisk": "NO_RISK",
"sensitivity": "medium",
"statusMessage": "Response from one supplier",
"checkedAt": "2026-09-16T16:27:35.444Z",
"correlationId": "5a93f894-7e78-45ad-99c6-5432c83d8ef4"
}
Carrier Intelligence
Phone Trust
Ask the mobile carrier for SIM-swap and call-forwarding signals on a phone number
POST
/
v1
/
screening
/
phone-trust
Phone Trust
curl --request POST \
--url https://api.deepidv.com/v1/screening/phone-trustimport requests
url = "https://api.deepidv.com/v1/screening/phone-trust"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.deepidv.com/v1/screening/phone-trust', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.deepidv.com/v1/screening/phone-trust",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.deepidv.com/v1/screening/phone-trust"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.deepidv.com/v1/screening/phone-trust")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.deepidv.com/v1/screening/phone-trust")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_body{
"tripped": false,
"tripReasons": [],
"simSwappedRisk": "LOW_RISK",
"simChangedDate": "2025-09-15T16:27:35.000Z",
"forwardingRisk": "NO_RISK",
"sensitivity": "medium",
"statusMessage": "Response from one supplier",
"checkedAt": "2026-09-16T16:27:35.444Z",
"correlationId": "c1793fcc-2dd0-4808-baf2-006955c3ffcc"
}
{
"tripped": true,
"tripReasons": ["SIM_SWAP_HIGH_RISK"],
"simSwappedRisk": "HIGH_RISK",
"simChangedDate": "2026-09-15T08:00:00.000Z",
"forwardingRisk": "NO_RISK",
"sensitivity": "medium",
"statusMessage": "Response from one supplier",
"checkedAt": "2026-09-16T16:27:35.444Z",
"correlationId": "5a93f894-7e78-45ad-99c6-5432c83d8ef4"
}
POST /v1/screening/phone-trust
tripped verdict for the requested sensitivity.
The check is passive. No SMS is sent to the subscriber, and the check never blocks anything on its own. Use tripped in your own flow, for example to require a step-up before a high-value action.
Carrier coverage varies by country. Where the carrier route is not live, signals come back as
NO_DATA and the check never trips. UK numbers return live data today; US and Canadian numbers return NO_DATA.Request
Headers
| Header | Required | Description |
|---|---|---|
x-api-key | Yes | Your API key |
Content-Type | Yes | application/json |
Body parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
phone | string | Yes* | Mobile number in E.164 format (+ and country code). Bare 10-digit North American numbers are treated as +1. |
sessionId | string | No | Attach the result to an existing verification session instead of creating a standalone screening record. See Attaching to a session. |
sensitivity | string | No | low, medium (default) or high. See Sensitivity. |
email | string | No | Applicant email for the screening record. A placeholder is synthesized when omitted. |
firstName | string | No | Applicant first name for the screening record (1–255 chars). |
lastName | string | No | Applicant last name for the screening record (1–255 chars). |
sessionId is given, in which case it defaults to the session applicant’s phone.
Sensitivity
| Sensitivity | Trips on |
|---|---|
low | SIM swap in the last 72 hours only |
medium | SIM swap in the last 72 hours or the last 30 days, or active unconditional call forwarding |
high | Same as medium |
NO_DATA on a signal never trips the check.
Example request
curl -X POST https://api.deepidv.com/v1/screening/phone-trust \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"phone": "+447425604497",
"sensitivity": "medium"
}'
const response = await fetch("https://api.deepidv.com/v1/screening/phone-trust", {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": "YOUR_API_KEY",
},
body: JSON.stringify({
phone: "+447425604497",
sensitivity: "medium",
}),
});
const data = await response.json();
import requests
response = requests.post(
"https://api.deepidv.com/v1/screening/phone-trust",
headers={
"Content-Type": "application/json",
"x-api-key": "YOUR_API_KEY",
},
json={
"phone": "+447425604497",
"sensitivity": "medium",
},
)
Response
200 — Success
| Field | Type | Description |
|---|---|---|
tripped | boolean | true when the signals exceed the chosen sensitivity |
tripReasons | array | Zero or more of SIM_SWAP_HIGH_RISK, SIM_SWAP_MEDIUM_RISK, CALL_FORWARDING_ACTIVE |
simSwappedRisk | string | HIGH_RISK (SIM changed in the last 72 hours), MEDIUM_RISK (last 30 days), LOW_RISK (no recent change) or NO_DATA |
simChangedDate | string | ISO 8601 timestamp of the last SIM change, when the carrier reports it |
forwardingRisk | string | HIGH_RISK (unconditional call forwarding active), NO_RISK or NO_DATA |
sensitivity | string | The sensitivity that was applied |
statusMessage | string | Carrier status text |
checkedAt | string | ISO 8601 timestamp of the check |
correlationId | string | Provider correlation id. Quote it in support requests |
sessionId | string | Present when the result was attached to a verification session |
Error responses
| Status | Description |
|---|---|
400 Bad Request | Request body failed schema validation, or sessionId was given without phone and the session applicant has no phone on file |
401 Unauthorized | API key is invalid |
402 Payment Required | Insufficient balance for this check |
403 Forbidden | API key is missing, or the session belongs to another organization |
404 Not Found | sessionId does not exist |
503 Service Unavailable | The carrier data provider is temporarily unavailable. Nothing was billed; retry later |
500 Server Error | Unexpected server error |
{
"tripped": false,
"tripReasons": [],
"simSwappedRisk": "LOW_RISK",
"simChangedDate": "2025-09-15T16:27:35.000Z",
"forwardingRisk": "NO_RISK",
"sensitivity": "medium",
"statusMessage": "Response from one supplier",
"checkedAt": "2026-09-16T16:27:35.444Z",
"correlationId": "c1793fcc-2dd0-4808-baf2-006955c3ffcc"
}
{
"tripped": true,
"tripReasons": ["SIM_SWAP_HIGH_RISK"],
"simSwappedRisk": "HIGH_RISK",
"simChangedDate": "2026-09-15T08:00:00.000Z",
"forwardingRisk": "NO_RISK",
"sensitivity": "medium",
"statusMessage": "Response from one supplier",
"checkedAt": "2026-09-16T16:27:35.444Z",
"correlationId": "5a93f894-7e78-45ad-99c6-5432c83d8ef4"
}
Attaching to a session
By default each call is filed as a completed silent-screening session for audit and billed on success. PasssessionId to attach the result to one of your existing verification sessions instead:
- The result is written to that session’s
analysis_data.phone_checks.trust, visible on Retrieve Session and in the console’s Carrier Intelligence tab. phonemay be omitted; it defaults to the session applicant’s phone.- A repeat call overwrites the previous result.
- If the session’s workflow already contains the Phone Trust Check step, no second charge is taken because the passive step billed at session creation.