Provero Logo

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.