Provero provides real-time Verification, risk Screening, data Enrichment, and basic format Validation services. Pick what you need or combine several via Multi-Validation.
Available APIs
Multi-Validation
CompositeRun multiple checks in a single request (Phone/Email verification, TPS screening, IP fraud, IP geolocation, Name screening).
- One request, many results
- Only returns blocks for supplied inputs
- Consistent response mapping
Phone (HLR/MNP & Delivery)
VerificationReal-time reachability with network, porting, roaming and delivery status.
- Network & porting status
- Roaming detection
- Delivery verification
- Error mapping
TPS Screening
ScreeningChecks if a phone number appears on UK TPS/CTPS suppression registers.
- UK TPS & CTPS
- Live status check
- Compliance-ready output
Confirms mailbox deliverability and risk signals for an email address.
- SMTP/mailbox checks
- Disposable detection
- Risk level
- Typos
- Syntax validity
UK Postcode
VerificationVerifies UK postcodes and returns structured UK postcode-based address details.
- UK postcode checks
- Standardized output
- Address components
Name Screening
ScreeningScreens names for quality and risk (fake patterns, profanity, etc.).
- Real-name heuristics
- Profanity filtering
- Risk indicators
IP Fraud Detection
ScreeningDetects proxies, VPNs, TOR, bots and other abuse signals.
- Proxy/VPN/TOR
- Bot/crawler ID
- Abuse & risk signals
IP Geolocation
EnrichmentCity/region/country for an IP, with optional distance & matching to an address.
- City/region/country
- GeoMatch option
- Distance calculation
Breach Detection
ScreeningChecks if inputs (email/username/phone/domain/password hash) appear in known data breaches.
- Multiple sources
- Leaked domains
- Flexible inputs
Getting Started
- Choose your API: Pick the Verification, Screening, or Enrichment you need.
- Get your API key: Create keys in your account settings.
- Review the docs: Each API has examples and response formats.
- Integrate: Use the code samples in your preferred language.
Rate Limits
Please contact us for rate limits and pricing for your use case.
Support
- Email: support.provero.io
- Documentation: Browse the API panes above.
All endpoints are secured and require authentication via a Bearer token. You must include your API key in the Authorization header of every request you make. You can create API tokens in your settings page.
Headers
Authorization: Bearer REPLACE_WITH_API_TOKEN
Content-Type: application/json
Accept: application/json
Code Examples
import requests
url = "https://api.provero.io/api/user"
headers = {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json"
"Accept": "application/json"
}
response = requests.get(url, headers=headers)
print(response.status_code)
print(response.text)
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.provero.io/api/user",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer REPLACE_WITH_API_TOKEN",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
const headers = new Headers();
headers.append("Authorization", "Bearer REPLACE_WITH_API_TOKEN");
headers.append("Content-Type", "application/json");
headers.append("Accept", "application/json");
fetch("https://api.provero.io/api/user", {
method: "GET",
headers: headers,
})
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.error("Error:", error));
curl -X GET https://api.provero.io/api/user \
-H "Authorization: Bearer REPLACE_WITH_API_TOKEN" \
-H "Content-Type: application/json"
Response Examples
{
"error": {
"code": "401",
"message": "Unauthenticated. Please provide a valid API key."
}
}
Response Body
Error structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
error.code |
string |
401 | Yes | HTTP status code for the error. |
error.message |
string |
Unauthenticated. Please provide a valid API key. | Yes | A message describing why authentication failed. |
Validate multiple inputs in a single call (email, phone, TPS, IP fraud, IP geolocation, and name). Only supplied fields are processed and only corresponding result blocks are returned.
Response mapping: Each nested object in the response mirrors its standalone validator’s response. For full field descriptions and examples, see the corresponding single-validator panes: Email Validation, Phone Validation, TPS Check, IP Fraud, and GeoIP.
Endpoint
https://api.provero.io/api/validate/multiple
Headers
Authorization: Bearer REPLACE_WITH_API_TOKEN
Content-Type: application/json
Accept: application/json
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
email |
object |
No | Full email validation docs. |
phone |
object |
No | Full phone validation docs. |
address |
object |
No | Full UK postcode verification docs. |
tps |
object |
No | Full TPS validation docs. |
ip |
object |
No | Full IP validation docs. |
breach |
object |
No | Full breach validation docs. |
geoip |
object |
No | Full GEOIP validation docs. |
Request Body example (JSON)
{
"email": {
"email": "test@example.com"
},
"phone": {
"phone": "441234567890",
"roaming": true,
"route": "detailed"
},
"address": {
"postcode": "LS18 5HY"
},
"tps": {
"phone": "441234567890"
},
"ip": {
"ip": "8.8.8.8",
"user_agent": "Mozilla/5.0",
"user_language": "en"
},
"breach": {
"type": "email",
"value": "example@email.com"
},
"geoip": {
"ip": "8.8.8.8",
"address": "London",
"geoMatch": true
}
}
Code Examples
import requests
payload = {
"email": {
"email": "test@example.com"
},
"phone": {
"phone": "441234567890",
"roaming": true,
"route": "detailed",
},
"address": {
"postcode": "LS18 5HY"
},
"tps": {
"phone": "441234567890"
},
"ip": {
"ip": "8.8.8.8",
"user_agent": "Mozilla/5.0",
"user_language": "en"
},
"breach": {
"type": "email",
"value": "test@example.com"
},
"geoip": {
"ip": "8.8.8.8",
"address": "London",
"geoMatch": true
}
}
url = "https://api.provero.io/api/validate/multiple"
headers = {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
}
response = requests.post(url, headers=headers, json=payload)
print(response.status_code)
print(response.json())
<?php
$payload = [
"email" => [
"email" => "test@example.com"
],
"phone" => [
"phone" => "441234567890",
"roaming" => true,
"route" => "detailed",
],
"address" => [
"postcode" => "LS18 5HY"
],
"tps" => [
"phone" => "441234567890"
],
"ip" => [
"ip" => "8.8.8.8",
"user_agent" => "Mozilla/5.0",
"user_language" => "en"
],
"breach" => [
"type" => "email",
"value" => "test@example.com"
],
"geoip" => [
"ip" => "8.8.8.8",
"address" => "London",
"geoMatch" => true
]
];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.provero.io/api/validate/multiple",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer REPLACE_WITH_API_TOKEN",
"Content-Type: application/json",
"Accept: application/json"
]
]);
$response = curl_exec($curl);
if (curl_errno($curl)) {
echo 'Error:' . curl_error($curl);
}
curl_close($curl);
echo $response;
const payload = {
"email": {
"email": "test@example.com"
},
"phone": {
"phone": "441234567890",
"roaming": true,
"route": "detailed",
},
"address": {
"postcode": "LS18 5HY"
},
"tps": {
"phone": "441234567890"
},
"ip": {
"ip": "8.8.8.8",
"user_agent": "Mozilla/5.0",
"user_language": "en"
},
"breach": {
"type": "email",
"value": "test@example.com"
},
"geoip": {
"ip": "8.8.8.8",
"address": "London",
"geoMatch": true
}
};
fetch("https://api.provero.io/api/validate/multiple", {
method: "POST",
headers: {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify(payload)
})
.then(r => r.json())
.then(console.log)
.catch(console.error);
curl -X POST https://api.provero.io/api/validate/multiple \
-H "Authorization: Bearer REPLACE_WITH_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"email": {
"email": "test@example.com"
},
"phone": {
"phone": "441234567890",
"roaming": true,
"route": "detailed",
},
"address": {
"postcode": "LS18 5HY"
},
"tps": {
"phone": "441234567890"
},
"ip": {
"ip": "8.8.8.8",
"user_agent": "Mozilla/5.0",
"user_language": "en"
},
"breach": {
"type": "email",
"value": "test@example.com"
},
"geoip": {
"ip": "8.8.8.8",
"address": "London",
"geoMatch": true
}
}'
Response Examples
{
"email": {
"emailAddress": "test@example.com",
"isSyntaxValid": true,
"isMailboxDeliverable": false,
"isCatchAll": false,
"typoSuggestion": false,
"isDisposable": false,
"isRoleBased": false,
"riskLevel": "HIGH",
"failureReason": "missing_mx"
},
"phone": {
"results": [
{
"to": "+441234567890",
"mccMnc": "23420",
"imsi": "23420",
"originalNetwork": {
"networkName": "Telefonica UK",
"networkPrefix": "1234",
"countryName": "United Kingdom of Great Britain and Northern Ireland",
"countryPrefix": "44",
"networkId": ""
},
"status": {
"groupId": 3,
"groupName": "DELIVERED",
"id": 5,
"name": "DELIVERED_TO_HANDSET",
"description": "The message has reached the recipient\u2019s device successfully."
},
"roaming": false,
"ported": true,
"portedNetwork": {
"networkName": "Hutchison 3G UK (20)",
"networkPrefix": "1234",
"countryName": "United Kingdom of Great Britain and Northern Ireland",
"countryPrefix": "44",
"networkId": ""
},
"error": {
"groupId": 0,
"groupName": "Ok",
"id": 0,
"name": "NO_ERROR",
"description": "The request was processed without any issues.",
"permanent": false
}
}
]
},
"address": {
"valid": true,
"postcode": "LS18 5HY",
"address": {
"Address1": "Otley Old Road",
"Address2": "Horsforth",
"Address3": "",
"Address4": "",
"Town": "Leeds",
"County": "West Yorkshire",
"Postcode": "LS18 5HY",
"PremiseData": "Greengates Cattery|Greengates Stables|;The S Cayton Motor Co|The Barn/Greengates Farm|;|Greengates Farm|;"
}
},
"tps": {
"phone": "441234567890",
"result": false
},
"ip": {
"value": "8.8.8.8",
"proxy": false,
"isp": "Google",
"organization": "Google DNS",
"asn": "15169",
"host": "dns.google",
"countryCode": "US",
"city": "Mountain View",
"region": "California",
"isCrawler": false,
"connectionType": "none",
"latitude": "37.38999939",
"longitude": "-122.06999969",
"zipCode": "N/A",
"timezone": "America/Los_Angeles",
"vpn": false,
"tor": false,
"activeVpn": false,
"activeTor": false,
"recentAbuse": false,
"abuseVelocity": "none",
"botStatus": false,
"mobile": false,
"fraudScore": 0,
"highRiskAttacks": null,
"sharedConnection": null,
"dynamicConnection": null,
"securityScanner": null,
"trustedNetwork": null,
"operatingSystem": "UNK UNK",
"browser": "UNK UNK",
"deviceModel": "N/A",
"deviceBrand": "N/A",
"frequentAbuser": null
},
"breach": {
"value": "test@email.com",
"type": "email",
"leaks": [
{
"name": "Adobe",
"domain": "adobe.com",
"breachDate": "2013-10-04",
"description": "User profile and password hints were exposed."
}
]
},
"geoip": {
"country": "United States",
"regionName": "Virginia",
"city": "Ashburn",
"zip": "20149",
"lat": 39.03,
"lon": -77.5,
"ip": "8.8.8.8",
"distance": {
"km": 3598.695068406005,
"mi": 2236.1247533505075
},
"geoMatch": {
"country": false,
"city": false
}
}
}
{
"message": "The email field must be a valid email address.",
"errors": {
"email.email": [
"The email field must be a valid email address."
]
}
}
{
"message": "The string supplied did not seem to be a phone number.",
"errors": {
"phone.phone": [
"The string supplied did not seem to be a phone number."
],
"phone.ported": [
"The phone.ported field must be true or false."
],
"phone.roaming": [
"The phone.roaming field must be true or false."
],
"phone.route": [
"The route value must be one of: standard, detailed, playground"
]
}
}
{
"message": "The address.postcode field must not be greater than 255 characters.",
"errors": {
"address.postcode": [
"The address.postcode field must not be greater than 255 characters."
]
}
}
{
"message": "The string supplied did not seem to be a phone number.",
"errors": {
"tps.phone": [
"The string supplied did not seem to be a phone number."
]
}
}
{
"message": "The ip.ip field must be a valid IP address.",
"errors": {
"ip.ip": [
"The ip.ip field must be a valid IP address."
]
}
}
{
"message": "The ip field is required when geoip is true.",
"errors": {
"geoip.ip": [
"The geoip.ip field must be a valid IP address."
],
"geoip.geoMatch": [
"The geoip.geo match field must be true or false."
]
}
}
{
"requestError": {
"serviceException": {
"messageId": "Error message",
"code": "400"
}
}
}
Response Body
Success structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
email |
object |
{"emailAddress":"test@example.com","isSyntaxValid":true} | No | Email validation result. See the Email Validation pane for full field list. |
phone |
object |
{"results":[{"status":{"name":"REJECTED_NETWORK"}}]} | No | Phone validation result. See the Phone Validation pane. |
tps |
object |
{"phone":"tel:+44-1302-778473","result":false} | No | TPS check result. See the TPS pane. |
ip |
object |
{"proxy":false,"fraudScore":0} | No | Fraud detection result. See the IP Fraud pane. |
geoip |
object |
{"country":"United States","city":"Ashburn","distance":{"km":3597.32}} | No | Geolocation (and optional distance/match). See the GeoIP pane. |
name |
object |
{"message":"Identity fraud check passed","name":"John Doe"} | No | Name fraud/identity check result. |
Error structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
message |
string |
The email field must be a valid email address. | No | Top-level validation message. |
errors |
object |
{"email":["The email field must be a valid email address."]} | No | Per-field validation errors. |
requestError |
object |
{"serviceException":{"messageId":"Error message","code":"400"}} | No | Application/service errors container. |
Basic Phone Verification provides a lightweight phone validation check without requiring an HLR lookup. It returns number validity, country details, standard number formats, and assigned network data when available from number range metadata.
Endpoint
https://api.provero.io/api/validate/phone-basic
Headers
Authorization: Bearer REPLACE_WITH_API_TOKEN
Content-Type: application/json
Accept: application/json
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
phone |
string |
Yes | The phone number to validate. International format with country code is recommended. |
Request Body example (JSON)
{
"phone": "+447700900123"
}
Code Examples
import requests
userPhone = "REPLACE_WITH_PHONE"
url = "https://api.provero.io/api/validate/phone-basic"
payload = {"phone": userPhone}
headers = {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
}
response = requests.post(url, headers=headers, json=payload)
print(response.status_code)
print(response.text)
<?php
$userPhone = "REPLACE_WITH_PHONE";
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.provero.io/api/validate/phone-basic",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => json_encode(["phone" => $userPhone]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer REPLACE_WITH_API_TOKEN",
"Content-Type: application/json",
"Accept: application/json"
],
]);
$response = curl_exec($curl);
if (curl_errno($curl)) {
echo 'Error:' . curl_error($curl);
}
curl_close($curl);
echo $response;
const userPhone = "REPLACE_WITH_PHONE";
fetch("https://api.provero.io/api/validate/phone-basic", {
method: "POST",
headers: {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify({ phone: userPhone })
})
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.error("Error:", error));
userPhone="REPLACE_WITH_PHONE"
curl -X POST https://api.provero.io/api/validate/phone-basic \
-H "Authorization: Bearer REPLACE_WITH_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d "{\"phone\": \"$userPhone\"}"
Response Examples
{
"input": "+447700900123",
"valid": true,
"country": {
"code": "GB",
"name": "United Kingdom of Great Britain and Northern Ireland",
"callingCode": "44"
},
"format": {
"e164": "+447700900123",
"international": "+44 7700 900123",
"national": "07700 900123",
"rfc3966": "tel:+44-7700-900123"
},
"assignedNetwork": "Vodafone UK"
}
{
"message": "The phone field is required.",
"errors": {
"phone": [
"The phone field is required."
]
}
}
{
"message": "The phone provided is invalid.",
"errors": {
"phone": [
"The phone provided is invalid."
]
}
}
Response Body
Success structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
input |
string |
+447700900123 | Yes | The raw phone number submitted by the client. |
valid |
boolean |
1 | Yes | Whether the number is considered valid by the phone verification service. |
country |
object |
{"code":"GB","name":"United Kingdom of Great Britain and Northern Ireland","callingCode":"44"} | Yes | Resolved country details for the phone number when available. |
country.code |
string |
GB | No | ISO 3166-1 alpha-2 country code. |
country.name |
string |
United Kingdom of Great Britain and Northern Ireland | No | Resolved country name. |
country.callingCode |
string |
44 | No | International calling code for the resolved country. |
format |
object |
{"e164":"+447700900123","international":"+44 7700 900123","national":"07700 900123","rfc3966":"tel:+44-7700-900123"} | Yes | Common formatted versions of the submitted number. |
format.e164 |
string |
+447700900123 | No | Canonical E.164 representation. |
format.international |
string |
+44 7700 900123 | No | Human-readable international format. |
format.national |
string |
07700 900123 | No | National display format. |
format.rfc3966 |
string |
tel:+44-7700-900123 | No | RFC3966 telephone URI representation. |
assignedNetwork |
string |
Vodafone UK | No | Carrier/network label from libphonenumber range data when available. |
Error structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
message |
string |
The phone field is required. | No | Top-level validation message returned on request validation failure. |
errors |
object |
{"phone":["The phone field is required."]} | No | Object of per-field validation errors. |
Phone Verification (HLR/MNP & Delivery) provides real-time number validation by checking active status, network and portability information, and assessing delivery routes to ensure reliable communication.
- HLR: Database checks that validate if a number is active and identify its operator.
- MNP: Process to determine if a number has been ported and confirm the current carrier.
- Delivery: Mechanism for routing messages or calls to the correct destination and confirming their status.
Endpoint
https://api.provero.io/api/validate/phone
Headers
Authorization: Bearer REPLACE_WITH_API_TOKEN
Content-Type: application/json
Accept: application/json
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
phone |
string |
Yes | The phone number to be validated. |
roaming |
boolean |
No | Set to "1" or "true" to include roaming checks. |
msisdn |
boolean |
No | When set to true (default), the MSISDN must be a valid E.164 number. When set to false, non-canonical MSISDN formats may be accepted for routing determination only, including numbers containing a duplicated country code. |
route |
string |
No | Accepted values:
|
Request Body example (JSON)
{
"phone": "+441302778473",
"roaming": true,
"msisdn": true,
"route": "standard"
}
Code Examples
import requests
userPhone = "REPLACE_WITH_PHONE"
roaming = "1"
route = "standard"
url = "https://api.provero.io/api/validate/phone"
payload = {"phone": userPhone, "roaming": roaming, "route": route}
headers = {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
}
response = requests.post(url, headers=headers, json=payload)
print(response.status_code)
print(response.text)
<?php
$userPhone = "REPLACE_WITH_PHONE";
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.provero.io/api/validate/phone",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => json_encode(["phone" => $userPhone, "roaming" => true]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer REPLACE_WITH_API_TOKEN",
"Content-Type: application/json",
"Accept: application/json"
],
]);
$response = curl_exec($curl);
if (curl_errno($curl)) {
echo 'Error:' . curl_error($curl);
}
curl_close($curl);
echo $response;
const userPhone = "REPLACE_WITH_PHONE";
fetch("https://api.provero.io/api/validate/phone", {
method: "POST",
headers: {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify({ phone: userPhone, roaming: true })
})
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.error("Error:", error));
userPhone="REPLACE_WITH_PHONE"
curl -X POST https://api.provero.io/api/validate/phone \
-H "Authorization: Bearer REPLACE_WITH_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d "{\"phone\": \"$userPhone\", \"roaming\": true}"
Response Examples
{
"results": [
{
"to": "+1234567890",
"mccMnc": "123456",
"imsi": "",
"originalNetwork": {
"networkName": "Example",
"networkPrefix": "234",
"countryName": "Example",
"countryPrefix": "1",
"networkId": ""
},
"status": {
"groupId": 3,
"groupName": "DELIVERED",
"id": 5,
"name": "DELIVERED_TO_HANDSET",
"description": "Message delivered to handset"
},
"error": {
"groupId": 0,
"groupName": "Ok",
"id": 0,
"name": "DELIVERED_TO_HANDSET",
"description": "No Error.",
"permanent": false
}
}
]
}
{
"results": [
{
"to": "+1234567890",
"mccMnc": "123456",
"imsi": "",
"originalNetwork": {
"networkName": "Example",
"networkPrefix": "234",
"countryName": "Example",
"countryPrefix": "1",
"networkId": ""
},
"status": {
"groupId": 3,
"groupName": "DELIVERED",
"id": 5,
"name": "DELIVERED_TO_HANDSET",
"description": "Message delivered to handset"
},
"roaming": true,
"roamingNetwork": {
"networkName": "Example",
"networkPrefix": "",
"countryName": "Example",
"countryPrefix": "1",
"networkId": ""
},
"ported": true,
"portedNetwork": {
"networkName": "Example",
"networkPrefix": "234",
"countryName": "Example",
"countryPrefix": "1",
"networkId": ""
},
"error": {
"groupId": 0,
"groupName": "Ok",
"id": 0,
"name": "DELIVERED_TO_HANDSET",
"description": "No Error.",
"permanent": false
}
}
]
}
{
"results": [
{
"to": "+1234567890",
"mccMnc": "123456",
"imsi": "",
"originalNetwork": {
"networkName": "Example",
"networkPrefix": "234",
"countryName": "Example",
"countryPrefix": "1",
"networkId": ""
},
"status": {
"groupId": 3,
"groupName": "DELIVERED",
"id": 5,
"name": "DELIVERED_TO_HANDSET",
"description": "Message delivered to handset"
},
"ported": true,
"portedNetwork": {
"networkName": "Example",
"networkPrefix": "234",
"countryName": "Example",
"countryPrefix": "1",
"networkId": ""
},
"error": {
"groupId": 0,
"groupName": "Ok",
"id": 0,
"name": "DELIVERED_TO_HANDSET",
"description": "No Error.",
"permanent": false
}
}
]
}
{
"results": [
{
"to": "+1234567890",
"mccMnc": "123456",
"imsi": "",
"originalNetwork": {
"networkName": "Example",
"networkPrefix": "234",
"countryName": "Example",
"countryPrefix": "1",
"networkId": ""
},
"status": {
"groupId": 1,
"groupName": "Handset errors",
"id": 27,
"name": "UNDELIVERABLE_NOT_DELIVERED",
"description": "Absent Subscriber"
},
"ported": false,
"error": {
"groupId": 1,
"groupName": "Handset errors",
"id": 27,
"name": "UNDELIVERABLE_NOT_DELIVERED",
"description": "Absent Subscriber",
"permanent": false
}
}
]
}
{
"requestError": {
"serviceException": {
"messageId": "Error message",
"code": "400"
}
}
}
{
"message": "The phone field is required.",
"errors": {
"phone": [
"The phone field is required."
]
}
}
{
"message": "The phone field must not be greater than 15 characters.",
"errors": {
"phone": [
"The phone field must not be greater than 15 characters."
]
}
}
{
"message": "The phone field must be at least 10 characters.",
"errors": {
"phone": [
"The phone field must be at least 10 characters."
]
}
}
Response Body
Error structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
message |
string |
The phone field is required. | No | Top-level error message returned on validation failure. |
errors |
object |
{"phone": ["The phone field is required."]} | No | Object of validation services with validation failures. |
requestError |
object |
{"serviceException": {"messageId": "Error message", "code": "400"}} | No | Object containing service exceptions for application errors. |
The TPS (Telephone Preference Service) Validation API checks whether a UK landline or mobile number is listed with either the official TPS or Corporate TPS (CTPS) registers. Use this to avoid calling users who have opted out of unsolicited sales and marketing contact.
Endpoint
https://api.provero.io/api/validate/phone-tps
Headers
Authorization: Bearer REPLACE_WITH_API_TOKEN
Content-Type: application/json
Accept: application/json
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
phone |
string |
Yes | Phone number to check (in E.164 format, e.g. +441234567890) |
Request Body example (JSON)
{
"phone": "+441302778473"
}
Code Examples
import requests
userPhone = "REPLACE_WITH_PHONE"
url = "https://api.provero.io/api/validate/phone-tps"
payload = {"phone": userPhone}
headers = {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
}
response = requests.post(url, headers=headers, json=payload)
print(response.status_code)
print(response.text)
<?php
$userPhone = "REPLACE_WITH_PHONE";
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.provero.io/api/validate/phone-tps",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => json_encode(["phone" => $userPhone]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer REPLACE_WITH_API_TOKEN",
"Content-Type: application/json",
"Accept: application/json"
],
]);
$response = curl_exec($curl);
if (curl_errno($curl)) {
echo 'Error:' . curl_error($curl);
}
curl_close($curl);
echo $response;
const userPhone = "REPLACE_WITH_PHONE";
fetch("https://api.provero.io/api/validate/phone-tps", {
method: "POST",
headers: {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify({ phone: userPhone })
})
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.error("Error:", error));
userPhone="REPLACE_WITH_PHONE"
curl -X POST https://api.provero.io/api/validate/phone-tps \
-H "Authorization: Bearer REPLACE_WITH_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d "{\"phone\": \"$userPhone\"}"
Response Examples
{
"phone": "tel:+44-1234-567890",
"result": false
}
{
"requestError": {
"serviceException": {
"messageId": "Error message",
"code": "400"
}
}
}
{
"message": "The provided phone number is not valid for the GB region.",
"errors": {
"phone": [
"The provided phone number is not valid for the GB region."
]
}
}
{
"message": "The phone field is required.",
"errors": {
"phone": [
"The phone field is required."
]
}
}
{
"message": "The provided phone number is invalid",
"errors": {
"phone": [
"The provided phone number is invalid"
]
}
}
{
"message": "The string supplied is too short to be a phone number.",
"errors": {
"phone": [
"The string supplied is too short to be a phone number."
]
}
}
Response Body
Success structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
result.status |
string |
TPS | Yes | `TPS`, `CTPS`, or `UNLISTED` depending on registry status |
result.type |
string |
mobile | Yes | The type of number detected (e.g. `mobile`, `landline`) |
result.operator |
string |
Vodafone | No | Detected carrier/operator for the number |
result.date |
string |
2024-03-22 | No | Date the number was registered on TPS/CTPS (if applicable) |
Error structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
message |
string |
The phone field is required. | No | Top-level error message for validation issues |
errors |
object |
{"phone": ["The phone field is required."]} | No | Details of validation field errors |
requestError |
object |
{"serviceException": {"messageId": "Error message", "code": "400"}} | No | Object returned for application-level service errors |
The Email Validation API allows you to validate email addresses, check their deliverability, and assess the risk associated with them among other detailed information.
Endpoint
https://api.provero.io/api/validate/email
Headers
Authorization: Bearer REPLACE_WITH_API_TOKEN
Content-Type: application/json
Accept: application/json
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
email |
string |
Yes | The email to be validated. |
Request Body example (JSON)
{
"email": "test@example.com"
}
Code Examples
import requests
userEmail = "REPLACE_WITH_EMAIL"
url = "https://api.provero.io/api/validate/email"
payload = {"email": userEmail}
headers = {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
}
response = requests.post(url, headers=headers, json=payload)
print(response.status_code)
print(response.text)
<?php
$userEmail = "REPLACE_WITH_EMAIL";
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.provero.io/api/validate/email",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => json_encode(["email" => $userEmail]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer REPLACE_WITH_API_TOKEN",
"Content-Type: application/json",
"Accept: application/json"
],
]);
$response = curl_exec($curl);
if (curl_errno($curl)) {
echo 'Error:' . curl_error($curl);
}
curl_close($curl);
echo $response;
const userEmail = "REPLACE_WITH_EMAIL";
fetch("https://api.provero.io/api/validate/email", {
method: "POST",
headers: {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify({ email: userEmail })
})
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.error("Error:", error));
userEmail="REPLACE_WITH_EMAIL"
curl -X POST https://api.provero.io/api/validate/email \
-H "Authorization: Bearer REPLACE_WITH_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d "{\"email\": \"$userEmail\"}"
Response Examples
{
"emailAddress": "user@example.com",
"isSyntaxValid": true,
"isMailboxDeliverable": false,
"isCatchAll": false,
"typoSuggestion": "user@example.com",
"isDisposable": false,
"isRoleBased": false,
"riskLevel": "HIGH",
"failureReason": "missingMX"
}
{
"requestError": {
"serviceException": {
"messageId": "Error message",
"code": "400"
}
}
}
{
"message": "The email field is required.",
"errors": {
"email": [
"The email field is required."
]
}
}
{
"message": "The email field must be a valid email address.",
"errors": {
"email": [
"The email field must be a valid email address."
]
}
}
Response Body
Success structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
emailAddress |
string |
user@example.com | Yes | The target email address that was looked up. |
isSyntaxValid |
boolean |
1 | Yes | Checks if the email address is formatted correctly and valid. |
isMailboxDeliverable |
boolean |
Yes | Determines if the email address is deliverable. | |
isCatchAll |
boolean |
Yes | Indicates whether the email address domain is configured as catch-all. | |
typoSuggestion |
string |
user@example.com | Yes | Provides a suggested alternate email address that closely resembles the input and may be valid. |
isDisposable |
boolean |
Yes | Checks if the email address is temporary or disposable. | |
isRoleBased |
boolean |
Yes | Checks if the email address is for a team or department. | |
riskLevel |
string |
HIGH | Yes | Indicates the risk status of an email address. HIGH, MEDIUM, LOW, or UNKNOWN. |
failureReason |
string |
missingMX | No | Reason is provided when validMailbox status is unknown. |
Error structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
message |
string |
The email field is required. | No | Top-level error message returned on validation failure. |
errors |
object |
{"email": ["The email field is required."]} | No | Object of validation services with validation failures. |
requestError |
object |
{"serviceException": {"messageId": "Error message", "code": "400"}} | No | Object containing service exceptions for application errors. |
This endpoint verifies UK postcodes and returns structured UK address details from postcode data.
To use this service, you must configure your UK postcode provider account, password, and API key in Settings.
It is not a full global address validation service. A broader Address Verification endpoint will be introduced separately.
Endpoint
https://api.provero.io/api/validate/uk-postcode
Headers
Authorization: Bearer REPLACE_WITH_API_TOKEN
Content-Type: application/json
Accept: application/json
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
postcode |
string |
Yes | Postcode to be validated. |
Request Body example (JSON)
{
"postcode": "string"
}
Code Examples
import requests
postcode = "LS18 5SB"
url = "https://api.provero.io/api/validate/uk-postcode"
payload = {"postcode": postcode}
headers = {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
}
response = requests.post(url, headers=headers, json=payload)
print(response.status_code)
print(response.text)
<?php
$postcode = "LS18 5SB";
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.provero.io/api/validate/uk-postcode",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => json_encode([
"postcode" => $postcode
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer REPLACE_WITH_API_TOKEN",
"Content-Type: application/json",
"Accept: application/json"
],
]);
$response = curl_exec($curl);
if (curl_errno($curl)) {
echo 'Error:' . curl_error($curl);
}
curl_close($curl);
echo $response;
const postcode = "LS18 5SB";
fetch("https://api.provero.io/api/validate/uk-postcode", {
method: "POST",
headers: {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify({ postcode })
})
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.error("Error:", error));
postcode="LS18 5SB"
curl -X POST https://api.provero.io/api/validate/uk-postcode \
-H "Authorization: Bearer REPLACE_WITH_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d "{\"postcode\": \"$postcode\"}"
Response Examples
{
"valid": true,
"postcode": "LS18 5SB",
"address": {
"Address1": "Brownberrie Lane",
"Address2": "Horsforth",
"Address3": "",
"Address4": "",
"Town": "Leeds",
"County": "West Yorkshire",
"Postcode": "LS18 5SB",
"PremiseData": "Old Ball||;||2;||4;||6;||8;||10;||12;||14;||16;||18;||20;||22;||24;||26;||28;||30;||32;||34;||36;||38;||40;||42;||44;||46;||48;||50;||52;||54;"
}
}
{
"requestError": {
"serviceException": {
"messageId": "Error message",
"code": "400"
}
}
}
{
"message": "The postcode field is required.",
"errors": {
"postcode": [
"The postcode field is required."
]
}
}
Response Body
Success structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
postcode |
string |
LS18 5SB | Yes | The request postcode. |
valid |
boolean |
true | Yes | Indicates whether the postcode is valid |
address |
object |
{"Address1":"Brownberrie Lane","Address2":"Horsforth","Address3":"","Address4":"","Town":"Leeds","County":"West Yorkshire","Postcode": "LS18 5SB","PremiseData": "Old Ball||;||2;||4;||6;||8;||10;||12;||14;||16;||18;||20;||22;||24;||26;||28;||30;||32;||34;||36;||38;||40;||42;||44;||46;||48;||50;||52;||54;"} | Yes | Breakdown of address into structured parts. |
Error structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
message |
string |
The postcode field is required. | No | Top-level validation message. |
errors |
object |
{"postcode": ["The postcode field is required."]} | No | Object containing input validation errors. |
requestError |
object |
{"serviceException": {"messageId": "Error message", "code": "400"}} | No | Returned when an internal service exception occurs. |
COMING SOON!!!
The Address Verification API is reserved for a future global address validation and enrichment service.
This endpoint will be used for broader international address verification beyond UK postcode-only checks, including structured address validation and normalization for global coverage.
For UK postcode verification, please use the dedicated UK Postcode Verification endpoint.
Endpoint
https://api.provero.io/api/validate/address
Headers
Authorization: Bearer REPLACE_WITH_API_TOKEN
Content-Type: application/json
Accept: application/json
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
address |
object |
No | Placeholder request body for the upcoming global address verification API. Final request fields are not yet defined. |
Request Body example (JSON)
{
"address": "London"
}
Code Examples
import requests
url = "https://api.provero.io/api/validate/address"
payload = {
"address": {
"line1": "10 Downing Street",
"city": "London",
"postcode": "SW1A 2AA",
"country": "GB"
}
}
headers = {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
}
response = requests.post(url, headers=headers, json=payload)
print(response.status_code)
print(response.text)
<?php
$payload = [
"address" => [
"line1" => "10 Downing Street",
"city" => "London",
"postcode" => "SW1A 2AA",
"country" => "GB"
]
];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.provero.io/api/validate/address",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer REPLACE_WITH_API_TOKEN",
"Content-Type: application/json",
"Accept: application/json"
]
]);
$response = curl_exec($curl);
if (curl_errno($curl)) {
echo 'Error:' . curl_error($curl);
}
curl_close($curl);
echo $response;
const payload = {
address: {
line1: "10 Downing Street",
city: "London",
postcode: "SW1A 2AA",
country: "GB"
}
};
fetch("https://api.provero.io/api/validate/address", {
method: "POST",
headers: {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify(payload)
})
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.error("Error:", error));
curl -X POST https://api.provero.io/api/validate/address \
-H "Authorization: Bearer REPLACE_WITH_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"address": {
"line1": "10 Downing Street",
"city": "London",
"postcode": "SW1A 2AA",
"country": "GB"
}
}'
Response Examples
{
"message": "Address verification is not available yet. This endpoint is reserved for an upcoming release.",
"status": "not_implemented"
}
Response Body
Error structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
message |
string |
Address verification is not available yet. This endpoint is reserved for an upcoming release. | Yes | Placeholder message returned until the global address verification service is implemented. |
status |
string |
not_implemented | Yes | Placeholder status indicating the endpoint is reserved for a future release. |
COMING SOON!!!
The Identity Validation API allows you to validate personal identities, ensuring they are accurate and legitimate.
We determine whether a name is likely to belong to a real person rather than a fictional/historical character, cultural icon, or fabricated identity.
This API also includes built-in profanity filtering to detect and reject names that contain offensive or inappropriate language.
Endpoint
https://api.provero.io/api/fraud-check/name
Headers
Authorization: Bearer REPLACE_WITH_API_TOKEN
Content-Type: application/json
Accept: application/json
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
firstName |
string |
Yes | The first name to be validated. |
lastName |
string |
Yes | The last name to be validated. |
Request Body example (JSON)
{
"firstName": "string",
"lastName": "string"
}
Code Examples
import requests
firstName = "John"
lastName = "Doe"
url = "https://api.provero.io/api/fraud-check/name"
payload = {"firstName": firstName, "lastName": lastName}
headers = {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
}
response = requests.post(url, headers=headers, json=payload)
print(response.status_code)
print(response.text)
<?php
$firstName = "John";
$lastName = "Doe";
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.provero.io/api/fraud-check/name",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => json_encode([
"firstName" => $firstName,
"lastName" => $lastName
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer REPLACE_WITH_API_TOKEN",
"Content-Type: application/json",
"Accept: application/json"
],
]);
$response = curl_exec($curl);
if (curl_errno($curl)) {
echo 'Error:' . curl_error($curl);
}
curl_close($curl);
echo $response;
const firstName = "John";
const lastName = "Doe";
fetch("https://api.provero.io/api/fraud-check/name", {
method: "POST",
headers: {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify({ firstName, lastName })
})
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.error("Error:", error));
firstName="John"
lastName="Doe"
curl -X POST https://api.provero.io/api/fraud-check/name \
-H "Authorization: Bearer REPLACE_WITH_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d "{\"firstName\": \"$firstName\", \"lastName\": \"$lastName\"}"
Response Examples
{
"fullName": "John Doe",
"isValid": true,
"isProfane": false,
"riskLevel": "LOW",
"notes": "Name is a common real-world identity."
}
{
"requestError": {
"serviceException": {
"messageId": "Error message",
"code": "400"
}
}
}
{
"message": "The firstName field is required.",
"errors": {
"firstName": [
"The firstName field is required."
]
}
}
{
"message": "The lastName field is required.",
"errors": {
"lastName": [
"The lastName field is required."
]
}
}
Response Body
Success structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
fullName |
string |
John Doe | Yes | The validated full name. |
isValid |
boolean |
true | Yes | Whether the name is considered real and legitimate. |
isProfane |
boolean |
false | Yes | Indicates whether the name contains any profanity. |
riskLevel |
string |
LOW | Yes | A risk rating of the name (LOW, MEDIUM, HIGH, UNKNOWN). |
notes |
string |
Name is a common real-world identity. | No | Additional metadata or validation observations. |
Error structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
message |
string |
The firstName field is required. | No | Top-level validation message. |
errors |
object |
{"firstName": ["The firstName field is required."]} | No | Object containing input validation errors. |
requestError |
object |
{"serviceException": {"messageId": "Error message", "code": "400"}} | No | Returned when an internal service exception occurs. |
This endpoint performs IP fraud detection by evaluating indicators such as proxies, VPNs, bots, TOR nodes, device fingerprints, and other markers. It returns a detailed fraud risk profile.
Endpoint
https://api.provero.io/api/fraud-check/ip
Headers
Authorization: Bearer REPLACE_WITH_API_TOKEN
Content-Type: application/json
Accept: application/json
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
ip |
string |
Yes | The IP address to be validated. |
user_agent |
string |
No | User-Agent header string of the client. |
user_language |
string |
No | User language country code (e.g., "en"). |
Request Body example (JSON)
{
"ip": "8.8.8.8",
"user_agent": "Mozilla/5.0",
"user_language": "en"
}
Code Examples
import requests
payload = {
"ip": "0.0.0.0", # Replace with users IP address
"user_agent": "REPLACE_WITH_USER_AGENT", # Example: "Mozilla/5.0 (...)"
"user_language": "en" # Language code e.g. "en" for English
}
url = "https://api.provero.io/api/fraud-check/ip"
headers = {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
}
response = requests.post(url, headers=headers, json=payload)
print(response.status_code)
print(response.text)
<?php
$payload = [
"ip" => "0.0.0.0", // Replace with clients IP address
"user_agent" => "REPLACE_WITH_USER_AGENT", // Example: "Mozilla/5.0 (...)"
"user_language" => "en" // Language code e.g. "en" for English
];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.provero.io/api/fraud-check/ip",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer REPLACE_WITH_API_TOKEN",
"Content-Type: application/json",
"Accept: application/json"
],
]);
$response = curl_exec($curl);
if (curl_errno($curl)) {
echo 'Error:' . curl_error($curl);
}
curl_close($curl);
echo $response;
const payload = {
ip: "0.0.0.0", // Replace with clients IP address
user_agent: "REPLACE_WITH_USER_AGENT", // Example: "Mozilla/5.0 (...)"
user_language: "en" // Language code e.g. "en" for English
};
fetch("https://api.provero.io/api/fraud-check/ip", {
method: "POST",
headers: {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify(payload)
})
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.error("Error:", error));
curl -X POST https://api.provero.io/api/fraud-check/ip \
-H "Authorization: Bearer REPLACE_WITH_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"ip": "0.0.0.0", # Replace with clients IP address
"user_agent": "REPLACE_WITH_USER_AGENT", # Example: "Mozilla/5.0 (...)"
"user_language": "en" # Language code e.g. "en" for English
}'
Response Examples
{
"message": "IP fraud check passed",
"result": {
"value": "127.0.0.1",
"proxy": true,
"isp": "Reserved",
"organization": "Reserved",
"asn": "3",
"host": "localhost",
"countryCode": "N/A",
"city": "N/A",
"region": "N/A",
"isCrawler": "",
"connectionType": "Premium required.",
"latitude": "0",
"longitude": "0",
"zipCode": "N/A",
"timezone": "",
"vpn": true,
"tor": false,
"activeVpn": false,
"activeTor": false,
"recentAbuse": true,
"abuseVelocity": "Premium required.",
"botStatus": true,
"mobile": false,
"fraudScore": 100,
"highRiskAttacks": null,
"sharedConnection": null,
"dynamicConnection": null,
"securityScanner": null,
"trustedNetwork": null,
"operatingSystem": "Mac 10.15",
"browser": "Chrome 136.0",
"deviceModel": "N/A",
"deviceBrand": "Apple",
"frequentAbuser": null
}
}
{
"requestError": {
"serviceException": {
"messageId": "Error message",
"code": "400"
}
}
}
Response Body
Error structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
requestError |
object |
{"serviceException": {"messageId": "Error message", "code": "400"}} | No | Returned when an internal application or request error occurs. |
The IP Geolocation API provides insights about the country and city associated with an IP address, along with optional distance comparison to a user-provided address.
This can be used to flag unexpected or foreign leads without affecting lead acceptance decisions.
Endpoint
https://api.provero.io/api/fraud-check/geoip
Headers
Authorization: Bearer REPLACE_WITH_API_TOKEN
Content-Type: application/json
Accept: application/json
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
ip |
string |
Yes | The IP address to be validated. |
address |
string |
No | Optional address or postcode to calculate distance from IP location. Required if geoMatch is used. |
geoMatch |
boolean |
No | Enable matching between IP’s geolocation and the supplied address. |
Request Body example (JSON)
{
"ip": "8.8.8.8",
"address": "London",
"geoMatch": true
}
Code Examples
import requests
ip = "0.0.0.0" # Replace with clients IP
address = "REPLACE_WITH_AN_ADDRESS" # Optional address for distance calculation
geoMatch = true # Enable geoMatch to compare IP location with address
url = "https://api.provero.io/api/fraud-check/geoip"
headers = {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
}
payload = {"ip": ip, "address": address, "geoMatch": geoMatch}
response = requests.post(url, headers=headers, json=payload)
print(response.status_code)
print(response.text)
<?php
$ip = "0.0.0.0"; // Replace with clients IP
$address = "REPLACE_WITH_AN_ADDRESS"; // Optional address for distance calculation
$geoMatch = true; // Enable geoMatch to compare IP location with address
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.provero.io/api/fraud-check/geoip",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => json_encode([
"ip" => $ip,
"address" => $address,
"geoMatch" => $geoMatch
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer REPLACE_WITH_API_TOKEN",
"Content-Type: application/json",
"Accept: application/json"
]
]);
$response = curl_exec($curl);
if (curl_errno($curl)) {
echo 'Error:' . curl_error($curl);
}
curl_close($curl);
echo $response;
const ip = "0.0.0.0"; // Replace with clients IP
const address = "REPLACE_WITH_AN_ADDRESS"; // Optional address for distance calculation
const geoMatch = true; // Enable geoMatch to compare IP location with address
fetch("https://api.provero.io/api/fraud-check/geoip", {
method: "POST",
headers: {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify({ ip, address, geoMatch })
})
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.error("Error:", error));
ip="0.0.0.0" # Replace with clients IP
address="REPLACE_WITH_AN_ADDRESS" # Optional address for distance calculation
geoMatch=true # Enable geoMatch to compare IP location with address
curl -X POST https://api.provero.io/api/fraud-check/geoip \
-H "Authorization: Bearer REPLACE_WITH_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d "{ \"ip\": \"$ip\", \"address\": \"$address\", \"geoMatch\": $geoMatch }"
Response Examples
{
"country": "Ireland",
"regionName": "Leinster",
"city": "Dublin",
"zip": "D02",
"lat": "53.3498",
"lon": "-6.26031",
"ip": "46.51.128.144",
"distance": {
"km": 0.0514,
"mi": 0.0319
},
"geoMatch": {
"country": true,
"city": true
}
}
{
"requestError": {
"serviceException": {
"messageId": "Error message",
"code": "400"
}
}
}
{
"message": "The ip field is required.",
"errors": {
"ip": [
"The ip field is required."
]
}
}
{
"message": "The ip field must be a valid IP address.",
"errors": {
"ip": [
"The ip field must be a valid IP address."
]
}
}
{
"message": "Please provide a valid destination to match.",
"errors": {
"address": [
"Please provide a valid destination to match."
]
}
}
Response Body
Success structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
country |
string |
Ireland | Yes | Country of the IP's location |
regionName |
string |
Leinster | Yes | Region/province/state |
city |
string |
Dublin | Yes | City of the IP location |
zip |
string |
D02 | Yes | Postcode of the IP |
lat |
string |
53.3498 | Yes | Latitude |
lon |
string |
-6.2603 | Yes | Longitude |
ip |
string |
46.51.128.144 | Yes | IP address submitted |
distance.km |
string |
0.051 | No | Distance to address (km) |
distance.mi |
string |
0.031 | No | Distance to address (miles) |
geoMatch.country |
boolean |
true | No | Country match result |
geoMatch.city |
boolean |
true | No | City match result |
Error structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
message |
string |
The ip field is required. | No | Top-level error message returned on validation failure. |
errors |
object |
{"ip": ["The ip field is required."]} | No | Object of validation services with validation failures. |
requestError |
object |
{"serviceException": {"messageId": "Error message", "code": "400"}} | No | Object containing service exceptions for application errors. |
The Breach Detection API checks if an email, username, phone number, domain, or password has been compromised in known data breaches.
It provides information on the breach source and the type of data exposed.
Password lookups: when type is password, send the full SHA-1 hash of the password as the value. Do not send the plaintext password. The API uses a partial-hash lookup approach so only a small portion of the hash is used for the upstream search, with the full match confirmed server-side.
Endpoint
https://api.provero.io/api/fraud-check/breach
Headers
Authorization: Bearer REPLACE_WITH_API_TOKEN
Content-Type: application/json
Accept: application/json
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
type |
enum |
Yes | Accepted values: email, username, phone, domain, password. |
value |
string |
Yes | The actual data item you want to check for breach exposure. For type=password, this must be the full 40-character SHA-1 hash of the password, for example 5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8. |
Request Body example (JSON)
{
"type": "string",
"value": "string"
}
Code Examples
import requests
import hashlib
type = "email" # Replace with "email", "username", "phone", "domain", or "password"
raw_value = "support.provero.io" # Replace with the source value
value = raw_value
if type == "password":
value = hashlib.sha1(raw_value.encode("utf-8")).hexdigest().upper()
url = "https://api.provero.io/api/fraud-check/breach"
headers = {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json"
}
response = requests.post(url, headers=headers, json={"type": type, "value": value})
print(response.status_code)
print(response.text)
<?php
$type = "email"; // Replace with "email", "username", "phone", "domain", or "password"
$rawValue = "support.provero.io"; // Replace with the source value
$value = $rawValue;
if ($type === "password") {
$value = strtoupper(sha1($rawValue));
}
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.provero.io/api/fraud-check/breach",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => json_encode(['type' => $type, 'value' => $value]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer REPLACE_WITH_API_TOKEN",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
if (curl_errno($curl)) {
echo 'Error:' . curl_error($curl);
}
curl_close($curl);
echo $response;
const type = "email"; // Replace with "email", "username", "phone", "domain", or "password"
const rawValue = "support.provero.io"; // Replace with the source value
const apiToken = "REPLACE_WITH_API_TOKEN";
async function sha1Hex(value) {
if (!window.isSecureContext || !window.crypto || !window.crypto.subtle) {
throw new Error("SHA-1 hashing requires a secure browser context (HTTPS) with Web Crypto support.");
}
const data = new TextEncoder().encode(value);
const hashBuffer = await window.crypto.subtle.digest("SHA-1", data);
return Array.from(new Uint8Array(hashBuffer))
.map((byte) => byte.toString(16).padStart(2, "0"))
.join("")
.toUpperCase();
}
async function breachCheck(type, rawValue, apiToken) {
const value = type === "password" ? await sha1Hex(rawValue) : rawValue;
const response = await fetch("https://api.provero.io/api/fraud-check/breach", {
method: "POST",
headers: {
"Authorization": `Bearer ${apiToken}`,
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify({ type, value })
});
const payload = await response.json();
if (!response.ok) {
throw new Error(payload.message || "Breach detection request failed.");
}
return payload;
}
breachCheck(type, rawValue, apiToken)
.then((result) => {
console.log(result);
})
.catch((error) => {
console.error(error);
});
type="email" # Replace with "email", "username", "phone", "domain", or "password"
raw_value="support.provero.io" # Replace with the source value
value="$raw_value"
if [ "$type" = "password" ]; then
value=$(printf '%s' "$raw_value" | shasum -a 1 | awk '{print toupper($1)}')
fi
curl -X POST https://api.provero.io/api/fraud-check/breach \
-H "Authorization: Bearer REPLACE_WITH_API_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"type\": \"$type\", \"value\": \"$value\"}"
Response Examples
{
"value": "requested_value",
"type": "requested_type",
"leaks": [
{
"name": "Adobe",
"domain": "adobe.com",
"breachDate": "2013-10-04",
"description": "User profile and password hints were exposed."
}
]
}
{
"requestError": {
"serviceException": {
"messageId": "Error message",
"code": "400"
}
}
}
{
"message": "Please provide a type.",
"errors": {
"email": [
"Please provide a type."
]
}
}
{
"message": "Type must be one of email, username, phone, domain, password.",
"errors": {
"type": [
"Type must be one of email, username, phone, domain, password."
]
}
}
{
"message": "Please provide a value to search.",
"errors": {
"email": [
"Please provide a value to search."
]
}
}
{
"message": "The value field must be a valid email address.",
"errors": {
"type": [
"The value field must be a valid email address."
]
}
}
{
"message": "The value should be a valid phone number.",
"errors": {
"value": [
"The value should be a valid phone number."
]
}
}
{
"message": "The value must be a valid domain.",
"errors": {
"type": [
"The value must be a valid domain."
]
}
}
{
"message": "The value must be a valid 40-character SHA-1 hash.",
"errors": {
"value": [
"The value must be a valid 40-character SHA-1 hash."
]
}
}
{
"message": "Type must be one of email, username, phone, domain, password.",
"errors": {
"type": [
"Type must be one of email, username, phone, domain, password."
]
}
}
Response Body
Success structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
type |
enum |
Yes | The type of data checked, matching the requests type parameter. |
|
value |
string |
support.provero.io | Yes | The actual data that was checked for breaches. |
leaks |
array |
[{"name":"Adobe","domain":"adobe.com","breachDate":"2013-10-04","description":"User profile and password hints were exposed."}] | Yes | An array of breach objects. Each object may include name, domain, breachDate, and description. Fields that are not available for a given breach type are returned as null. |
Error structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
message |
string |
The value field must be a valid IP address. | No | Top-level error message. |
errors |
object |
{"type": ["The value field must be a valid IP address."]} | No | Validation error details. |
requestError |
object |
{"serviceException": {"messageId": "Error message", "code": "400"}} | No | Application-level error response object. |