SIM Swap Check
Checks for SIM change activity within a configurable lookback period. Use the result as a risk signal: a SIM change does not by itself prove account compromise, and a negative result does not guarantee that an account is safe.
Endpoint
POST
https://api.provero.io/api/validate/sim-swap
Headers
Authorization: Bearer REPLACE_WITH_API_TOKEN
Content-Type: application/json
Accept: application/json
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
phone
|
string |
Yes | UK mobile number; national or international format. |
period_days
|
integer |
No | Number of days to check. Must be greater than zero; defaults to 30. |
Request Body example (JSON)
{
"phone": "+441302778473",
"period_days": "string"
}
Code Examples
import requests
url = "https://api.provero.io/api/validate/sim-swap"
payload = {
"phone": "+447700900123",
"period_days": 30
}
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 = [
"phone" => "+447700900123",
"period_days" => 30,
];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.provero.io/api/validate/sim-swap",
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;
$response = Http::withToken('REPLACE_WITH_API_TOKEN')
->acceptJson()
->post('https://api.provero.io/api/validate/sim-swap', [
'phone' => '+447700900123',
'period_days' => 30,
]);
return $response->json();
fetch("https://api.provero.io/api/validate/sim-swap", {
method: "POST",
headers: {
"Authorization": "Bearer REPLACE_WITH_API_TOKEN",
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify({
phone: "+447700900123",
period_days: 30
})
})
.then(response => response.json())
.then(result => console.log(result))
.catch(error => console.error("Error:", error));
curl -X POST https://api.provero.io/api/validate/sim-swap \
-H "Authorization: Bearer REPLACE_WITH_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"phone":"+447700900123","period_days":30}'
Response Examples
Success - SIM Change Detected
{
"phone": "+447700900123",
"phone_valid": true,
"period_days": 30,
"sim_swapped": true,
"status": "swapped"
}
Success - No SIM Change Detected
{
"phone": "+447700900123",
"phone_valid": true,
"period_days": 30,
"sim_swapped": false,
"status": "not_swapped"
}
Success - Result Unavailable
{
"phone": "+447700900123",
"phone_valid": true,
"period_days": 30,
"sim_swapped": null,
"status": "unknown"
}
Error - Missing or Invalid API Token (401)
{
"message": "Unauthenticated."
}
Payment Required - Insufficient Balance (402)
{
"message": "Insufficient balance for validation request.",
"service": "sim_swap",
"required_amount": "0.0060000000",
"current_balance": "0.0000000000"
}
Forbidden - Account Disabled (403)
{
"message": "This account has been disabled. Contact support."
}
Additional response examples 4
Validation Error - Phone Not Provided (422)
{
"message": "The phone field is required.",
"errors": {
"phone": [
"The phone field is required."
]
}
}
Validation Error - Invalid Phone (422)
{
"message": "Invalid phone number for GB region",
"errors": {
"phone": [
"Invalid phone number for GB region"
]
}
}
Validation Error - Invalid Period (422)
{
"message": "The period days field must be at least 1.",
"errors": {
"period_days": [
"The period days field must be at least 1."
]
}
}
Application Error - Check Could Not Be Completed (400, 401, 403, 404, 408, 415, 429, 502, 503)
{
"requestError": {
"serviceException": {
"messageId": "SIM swap check could not be completed.",
"code": 503
}
}
}
Response Body
Success structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
phone |
string |
+447700900123 | Yes | Normalized UK mobile number. |
phone_valid |
boolean |
1 | Yes | Whether the number passed local UK phone validation. |
period_days |
integer |
30 | Yes | Lookback period evaluated for this request. |
sim_swapped |
boolean|null |
1 | Yes | true means a SIM change was detected during the lookback period. false means no change was detected. null means a conclusive result was unavailable. |
status |
string |
swapped | Yes | One of swapped, not_swapped, or unknown. |
Error structure
| Field Name | Type | Example | Always Present | Description |
|---|---|---|---|---|
message |
string |
The phone field is required. | No | Top-level message returned for authentication, account, balance, or input validation errors. |
requestError |
object |
{"serviceException":{"messageId":"SIM swap check could not be completed.","code":503}} | No | Returned when the check cannot be completed. |
errors |
object |
{"phone":["The phone field is required."]} | No | Input validation errors, keyed by request field. |
service |
string |
sim_swap | No | Service identifier returned when the available balance is insufficient. |
required_amount |
string |
0.0060000000 | No | Balance required to perform the check. |
current_balance |
string |
0.0000000000 | No | Available balance when the request was rejected. |