Blacklist and Duplicates
The four endpoints that blacklist a client, take them off the list, and find accounts that might be the same person.
Overview
These endpoints do two jobs together: blacklisting a client, and finding other accounts that might be the same person. They belong to one decision — someone who gets blacklisted usually comes back with a second account.
Blacklisting is more than a flag: you choose which restrictions come with it. Switch none on and the client is only marked.
Reference
Blacklist Status
Returns whether the client is blacklisted, why, and which restrictions are on.
payment_fraud · chargeback · abuse · spam · tos_violation · false_info · othercurl 'https://panel.example.com/api/v1/admin/clients/42/blacklist' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.example.com/api/v1/admin/clients/42/blacklist', {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/clients/42/blacklist');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Clients()->GetClientBlacklist(['id' => 42]);
if ($response['data']['blacklisted'] ?? false) {
$reason = $response['data']['reason'];
}Blacklisting a Client
Blacklists the client and applies the restrictions you choose.
payment_fraud · chargeback · abuse · spam · tos_violation · false_info · other201. Same shape as the status endpoint above.gate:user.blacklist_add vetoed the operation.curl -X POST 'https://panel.example.com/api/v1/admin/clients/42/blacklist' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"reason":"chargeback","notes":"Two chargebacks","restrictions":{"block_new_orders":true,"suspend_services":true}}'const res = await fetch('https://panel.example.com/api/v1/admin/clients/42/blacklist', {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({"reason":"chargeback","notes":"Two chargebacks","restrictions":{"block_new_orders":true,"suspend_services":true}}),
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/clients/42/blacklist');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'reason' => 'chargeback',
'notes' => 'Two chargebacks',
'restrictions' => [
'block_new_orders' => true,
'suspend_services' => true,
],
]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Clients()->CreateClientBlacklist([
'id' => 42,
'reason' => 'chargeback',
'notes' => 'Two chargebacks',
'restrictions' => [
'block_new_orders' => true,
'suspend_services' => true,
],
]);Removing from the Blacklist
Removes the blacklist record. Bringing suspended services back is a separate choice.
curl -X DELETE 'https://panel.example.com/api/v1/admin/clients/42/blacklist' \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"reactivate_services":true}'const res = await fetch('https://panel.example.com/api/v1/admin/clients/42/blacklist', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ reactivate_services: true }),
});
const body = await res.json();$ch = curl_init('https://panel.example.com/api/v1/admin/clients/42/blacklist');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['reactivate_services' => true]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Clients()->DeleteClientBlacklist([
'id' => 42,
'reactivate_services' => true,
]);Duplicate Account Scan
Returns other accounts that share the client's IP, name or company name.
id, full_name, company_name, ip, created_at.ip, name, company.curl 'https://panel.example.com/api/v1/admin/clients/42/duplicates' \
-H "Authorization: Bearer $API_KEY"const res = await fetch('https://panel.example.com/api/v1/admin/clients/42/duplicates', {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
const sameIp = body.data.matches.filter((m) => m.match_types.includes('ip'));$ch = curl_init('https://panel.example.com/api/v1/admin/clients/42/duplicates');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);$response = Api::Clients()->GetClientDuplicates(['id' => 42]);
foreach ($response['data']['matches'] as $match) {
// Same IP a few days apart is a stronger signal than a name match.
if (in_array('ip', $match['match_types'], true) && $match['days_apart'] < 7) {
$suspects[] = $match['id'];
}
}{
"data": {
"current": {
"id": 42,
"full_name": "John Doe",
"company_name": "",
"ip": "203.0.113.10",
"created_at": "2026-01-01 10:00:00"
},
"matches": [
{
"id": 57,
"full_name": "J. Doe",
"company_name": "",
"ip": "203.0.113.10",
"created_at": "2026-01-03 09:20:00",
"days_apart": 2,
"match_types": ["ip", "name"]
}
]
}
}Pitfalls
Removing the blacklist record does not reactivate suspended services on its own. Send reactivate_services if you want them back; otherwise the client is off the list while the services stay suspended.
The same IP can be a home or an office, and the same name can be a coincidence. Read match_types together with days_apart: two accounts opened from one IP days apart is a far stronger signal than two that only share a name.
The address compared is the IP from sign-up, not the last sign-in. On a long-lived account that address can be years old.
Related Articles
Thanks for your feedback!
Our support team is here around the clock for anything you can't find above.