Anti-Cheat
curl --request POST \
--url https://api.deepidv.com/v1/igaming/anti-cheatimport requests
url = "https://api.deepidv.com/v1/igaming/anti-cheat"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.deepidv.com/v1/igaming/anti-cheat', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.deepidv.com/v1/igaming/anti-cheat",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.deepidv.com/v1/igaming/anti-cheat"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.deepidv.com/v1/igaming/anti-cheat")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.deepidv.com/v1/igaming/anti-cheat")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_body{
"verdict": "UNIQUE",
"action": "allow"
}
iGaming Checks
Anti-Cheat
Face-based dedup, multi-accounting, and self-exclusion enforcement
POST
/
v1
/
igaming
/
anti-cheat
Anti-Cheat
curl --request POST \
--url https://api.deepidv.com/v1/igaming/anti-cheatimport requests
url = "https://api.deepidv.com/v1/igaming/anti-cheat"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.deepidv.com/v1/igaming/anti-cheat', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.deepidv.com/v1/igaming/anti-cheat",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.deepidv.com/v1/igaming/anti-cheat"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.deepidv.com/v1/igaming/anti-cheat")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.deepidv.com/v1/igaming/anti-cheat")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_body{
"verdict": "UNIQUE",
"action": "allow"
}
POST /v1/igaming/anti-cheat
anti-cheat step configuration. Persists the full result to the session’s analysis data; the response returned here is intentionally redacted to just a verdict and an action.
Identity self-exclusion and document/name multi-accounting signals read
OCR’d data already present on the session. Run a document scan first for
full coverage.
This check fails soft. If an internal error occurs, or the
image is missing, malformed, or has no usable face,
it returns 200 with verdict: "UNAVAILABLE" and
action: "allow" rather than blocking or erroring.Anti-cheat only evaluates sessions that are not in a terminal status
(
FAILED, REJECTED, VOIDED, EXPIRED) and whose workflow includes the
ANTI_CHEAT step; otherwise it returns UNAVAILABLE / allow. If another
check blocked the session first, anti-cheat will not run — order your checks
accordingly.Request
Headers
| Header | Required | Description |
|---|---|---|
x-api-key | Yes | Your API key |
Content-Type | Yes | application/json |
Body parameters
Bodies use snake_case field names — there are no camelCase aliases.| Parameter | Type | Required | Description |
|---|---|---|---|
session_id | string | Yes | The session to score |
image | string | Yes | The applicant’s face as a base64-encoded JPEG/PNG — raw base64 with no data: prefix. The whole JSON body must stay under 5 MB (roughly a 3.5 MB image); a 640×480 selfie is ample |
device_fingerprint | string | No | Stable per-device identifier used as a multi-accounting signal (when signal_device_enabled). In a server-to-server flow this and the biometric match are the linkage signals that always apply; the IP signal reads the submission IP captured by deepidv’s hosted flow, and document/name signals need OCR’d ID data on the session |
Example request
curl -X POST https://api.deepidv.com/v1/igaming/anti-cheat \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"session_id": "b8991ba9-2566-4fe5-b758-66f387c3e28b",
"image": "/9j/4AAQSkZJRgABAQ... (base64 JPEG)",
"device_fingerprint": "d3b07384-d9a7-4e1c-9f2a-1c2b3d4e5f60"
}'
const response = await fetch("https://api.deepidv.com/v1/igaming/anti-cheat", {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": "YOUR_API_KEY",
},
body: JSON.stringify({
session_id: "b8991ba9-2566-4fe5-b758-66f387c3e28b",
image: "/9j/4AAQSkZJRgABAQ... (base64 JPEG)",
device_fingerprint: "d3b07384-d9a7-4e1c-9f2a-1c2b3d4e5f60",
}),
});
const data = await response.json();
import requests
response = requests.post(
"https://api.deepidv.com/v1/igaming/anti-cheat",
headers={
"Content-Type": "application/json",
"x-api-key": "YOUR_API_KEY",
},
json={
"session_id": "b8991ba9-2566-4fe5-b758-66f387c3e28b",
"image": "/9j/4AAQSkZJRgABAQ... (base64 JPEG)",
"device_fingerprint": "d3b07384-d9a7-4e1c-9f2a-1c2b3d4e5f60",
},
)
Response
200 — Success
| Field | Type | Description |
|---|---|---|
verdict | string | UNIQUE, DUPLICATE, SELF_EXCLUSION, or UNAVAILABLE |
action | string | allow, flag, manual-review, or block |
Verdicts
| Verdict | Meaning |
|---|---|
UNIQUE | First sight of this face — enrolled into the org’s dedup collection. Action is allow unless multi-accounting links fire |
DUPLICATE | The face matches an existing enrollment at or above match_threshold — action is action_on_duplicate (default flag). The face is not enrolled again |
SELF_EXCLUSION | The applicant’s document number or matched face is on the self-exclusion registry — action is always block |
UNAVAILABLE | No usable face, the step isn’t configured, the session is terminal, or the body was invalid — fails soft to allow |
When
action is block, the session is marked as failed. The response is redacted to verdict and action; the full record — similarity, matched_session_id, face_id, multi-accounting links, and the applied actions — is persisted as anti_cheat_data on the session. See Retrieve session → iGaming check data.Error responses
| Status | Description |
|---|---|
401 Unauthorized | Invalid or revoked API key |
403 Forbidden | x-api-key header missing |
404 Not Found | Session not found, or not in your org |
{
"verdict": "UNIQUE",
"action": "allow"
}