Phone Verification
Phone verification in TrustGate is a passive intelligence capability built into the Device Intelligence service. It validates phone numbers and assesses risk based on phone type, carrier, fraud score, and abuse signals -- all without requiring the user to interact with an OTP flow.
Under the hood, phone intelligence is powered by a fraud intelligence provider.
Phone verification is not a standalone endpoint. To run a phone check, include the phone and phone_country parameters when calling the Device Intelligence analyze endpoint.
Running a Phone Check
Submit a phone number as part of a device intelligence analysis:
curl -X POST https://api.bytrustgate.com/api/v1/device-intel/analyze \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"ip_address": "203.0.113.1",
"phone": "+14155551234",
"phone_country": "US",
"applicant_id": "550e8400-e29b-41d4-a716-446655440000"
}'
| Parameter | Type | Required | Description |
|---|---|---|---|
ip_address | string | Yes | IP address for device analysis |
phone | string | No | Phone number to validate (E.164 format recommended) |
phone_country | string | No | ISO 2-letter country code for number formatting |
applicant_id | UUID | No | Associate the check with an applicant |
Response
The response includes a phone_check object alongside the other device intelligence results:
{
"phone_check": {
"phone": "+14155551234",
"valid": true,
"fraud_score": 15,
"line_type": "mobile",
"carrier": "Verizon",
"country": "US",
"risky": false,
"recent_abuse": false
}
}
Phone Check Fields
| Field | Type | Description |
|---|---|---|
phone | string | The phone number that was checked |
valid | boolean | Whether the phone number is valid and active |
fraud_score | integer | Risk score from 0 (safe) to 100 (high risk) |
line_type | string | Phone line type: mobile, landline, voip, toll_free, premium, etc. |
carrier | string | Carrier or provider name |
country | string | ISO country code where the number is registered |
risky | boolean | Whether the number has been flagged as risky |
recent_abuse | boolean | Whether the number has been associated with recent abuse |
Phone Types
| Type | Description | Risk Level |
|---|---|---|
mobile | Standard mobile phone | Low |
landline | Fixed landline | Low |
voip | Voice over IP | Medium |
toll_free | 1-800 numbers | High |
premium | Premium rate numbers | High |
virtual | Virtual numbers | Medium-High |
Risk Factors
High Risk
| Factor | Risk Contribution | Description |
|---|---|---|
fraud_history | +40 | Phone linked to fraud |
premium_rate | +30 | Premium rate number |
recently_ported | +20 | Number ported in last 30 days |
known_fraud_carrier | +35 | Carrier associated with fraud |
Medium Risk
| Factor | Risk Contribution | Description |
|---|---|---|
voip_number | +15 | VoIP provider number |
virtual_number | +20 | Virtual phone service |
prepaid | +10 | Prepaid SIM card |
country_mismatch | +15 | Phone country differs from applicant |
Low Risk
| Factor | Risk Contribution | Description |
|---|---|---|
new_number | +5 | Number recently activated |
unusual_carrier | +5 | Less common carrier |
VoIP Detection
TrustGate detects VoIP numbers through its fraud intelligence provider and flags them with a higher fraud score. When a VoIP number is detected, the line_type field returns "voip" and the valid field may be set to false depending on risk thresholds.
Example: VoIP Number Detected
{
"phone_check": {
"phone": "+14155559999",
"valid": false,
"fraud_score": 45,
"line_type": "voip",
"carrier": "Google Voice",
"country": "US",
"risky": true,
"recent_abuse": false
}
}
When a phone check fails validation, the response includes reason codes to help you understand why:
| Reason Code | Description |
|---|---|
voip_detected | VoIP phone numbers have higher fraud risk |
high_fraud_score | Phone number associated with suspicious activity (fraud score >= 85) |
risky_number | Phone number flagged as potentially risky |
invalid_number | Unable to validate the phone number |
Workflow Rules
Flag VoIP Numbers for Review
curl -X POST https://api.bytrustgate.com/api/v1/workflows/rules \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"rule_id": "flag_voip_phones",
"trigger": "device_analysis_complete",
"conditions": {
"all": [
{"field": "phone_check.line_type", "operator": "eq", "value": "voip"}
]
},
"actions": [
{
"type": "add_flag",
"flag": "voip_phone"
},
{
"type": "request_info",
"info_needed": "VoIP number detected - manual review recommended"
}
]
}'
Flag High Fraud Score Phones
curl -X POST https://api.bytrustgate.com/api/v1/workflows/rules \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"rule_id": "flag_high_risk_phone",
"trigger": "device_analysis_complete",
"conditions": {
"all": [
{"field": "phone_check.fraud_score", "operator": "gte", "value": 75}
]
},
"actions": [
{
"type": "add_flag",
"flag": "high_risk_phone"
},
{
"type": "create_case",
"case_type": "fraud",
"priority": "high",
"title": "High fraud score phone number detected"
}
]
}'
Programmatic Access
Phone verification is also available as a standalone primitive for use in custom pipelines:
from app.primitives.device_intel import PhoneCheckPrimitive
result = await PhoneCheckPrimitive.run(
phone="+14155551234",
phone_country="US"
)
Next Steps
- Risk Signals - All fraud signals explained
- Email Verification - Email risk assessment
- Device Intelligence - Device fingerprinting