Cheater-Datenbank-API
GET /v1/db/query/:discordId
Die Cheater-Datenbank-API ist die programmatische Version der Seite Query User. Sie durchsucht die Cheater-Datenbank per Discord-ID und liefert das Community-Profil, die Abfrage im externen Netzwerk und jeden Ocean-Scan, in dem das Konto gesehen wurde.
Erfordert DB Access
Nur Konten mit Datenbankzugriff können einen API-Schlüssel mit der Berechtigung db:query erstellen. DB Access stammt aus einem aktiven DB-Access-Plan, einem dir zugewiesenen Enterprise-Datenbankplatz oder einer Staff-Rolle. Die Berechtigung ist im Tab API-Schlüssel ausgegraut, bis du sie hast.
Der Zugriff wird bei jeder einzelnen Anfrage neu geprüft, nicht nur beim Erstellen des Schlüssels. Läuft der DB-Access-Plan ab, funktioniert der Schlüssel für seine anderen Berechtigungen weiter, aber dieser Endpunkt antwortet mit 403.
- Basis-URL
https://api.anticheat.ac/v1- Authentifizierung
- API-Schlüssel erforderlich mit
db:query - Erfordert
- Aktive Lizenz oder Enterprise-Mitgliedschaft sowie Datenbankzugriff
Datenbank per Discord-ID durchsuchen
Gibt alles zurück, was die Datenbank zu einer Discord-ID enthält, aus drei unabhängigen Quellen. Jede davon kann null liefern, wenn nichts vorliegt.
GET/v1/db/query/:discordId
Parameter
| Name | Typ | Beschreibung |
|---|---|---|
| discordId | string | Die zu suchende Discord-Nutzer-ID. Muss 5 bis 25 Ziffern haben |
Header
| Header | Erforderlich | Beschreibung |
|---|---|---|
| x-api-key | Ja | Dein API-Schlüssel |
| x-server-name | Nein | Ein Label für den Server, der den Aufruf macht. Wird im Nutzungsprotokoll erfasst, damit du deine eigenen Integrationen unterscheiden kannst. Siehe Nutzungsprotokollierung |
Antwort
{
"discordId": "123456789012345678",
"botConfigured": true,
"botProfile": {
"username": "PlayerUsername",
"displayName": "Player",
"avatarUrl": "https://cdn.discordapp.com/avatars/...",
"firstSeen": "2024-03-02T18:41:00.000Z",
"lastSeen": "2026-08-11T22:05:00.000Z",
"perGameCounts": { "fivem": 12, "rust": 3 },
"totals": { "servers": 15, "roleChanges": 41, "messages": 208 },
"isConfirmedCheater": true,
"confirmedCheater": {
"reason": "Sold FiveM menus",
"caughtby": "OceanStaff",
"confirmedAt": "2025-11-30T14:02:00.000Z"
},
"roleHistory": [],
"messages": []
},
"networkLookup": {
"found": true,
"playerName": "Player",
"totalPlaytimeSeconds": 482910,
"identifiers": {
"discord": "123456789012345678",
"steam": "11000010aaaaaaa",
"all": ["discord:...", "steam:..."]
},
"servers": [
{
"serverName": "Some Roleplay",
"totalHours": 134,
"firstSeen": "2025-02-11T20:00:00.000Z",
"lastSeen": "2026-07-30T03:12:00.000Z"
}
],
"bans": { "total": 2, "activeCount": 1, "removedCount": 1, "active": [], "removed": [] },
"dangerousDiscords": { "count": 3, "guilds": [] },
"blacklist": { "listed": false }
},
"ocean": {
"scannedUser": {
"discordId": "123456789012345678",
"username": "PlayerUsername",
"overallStatus": "cheating",
"totalScans": 5,
"totalDetections": 3,
"allDetections": ["Generic Cheat Loader - Detection"],
"gamesScanned": ["FiveM"],
"firstSeenAt": "2025-01-10T08:00:00.000Z",
"lastSeenAt": "2026-08-20T15:45:00.000Z",
"relatedAccounts": [],
"scanHistory": []
},
"scanMatches": [
{
"discordIds": ["123456789012345678"],
"usernames": ["PlayerUsername"],
"cheating": "Yes",
"detects": ["Generic Cheat Loader - Detection"],
"suspicious": [],
"warning": [],
"country": "AR",
"scannedAt": "2026-08-20T15:45:00.000Z",
"matchType": "discord"
}
]
}
}Antwortfelder
| Feld | Typ | Beschreibung |
|---|---|---|
| discordId | string | Die gesuchte Discord-ID |
| botConfigured | boolean | Ob das Community-Datenbank-Backend erreichbar ist. Bei false ist botProfile immer null |
| botProfile | object | null | Community-Datenbankprofil: gesehene Server, Rollenverlauf, Nachrichtenaktivität und Status als bestätigter Cheater |
| networkLookup | object | null | Profil im externen Netzwerk: verknüpfte Kennungen, Spielzeit pro Server, Bann-Verlauf und Blacklist-Status |
| ocean.scannedUser | object | null | Zusammenfassung des Ocean-Scans: Status, Erkennungen, Spiele, verwandte Konten und Scan-Verlauf |
| ocean.scanMatches | array | Einzelne Scans, denen dieses Konto zugeordnet wurde, entweder per Discord-ID oder über gemeinsamen HWID |
Fehler
| Status | Bedeutung |
|---|---|
| 400 | Die Discord-ID fehlt oder hat nicht 5 bis 25 Ziffern |
| 401 | Der API-Schlüssel fehlt, ist deaktiviert oder abgelaufen |
| 403 | Dem Schlüssel fehlt die Berechtigung db:query, oder das Konto hat keinen Datenbankzugriff mehr |
| 429 | Rate-Limit für diesen API-Schlüssel überschritten |
Leere Ergebnisse
Eine Discord-ID ohne Einträge liefert eine wohlgeformte Antwort mit leeren Quellen statt eines 404. Discord-IDs auf der Whitelist liefern dieselbe Struktur, daher ist ein Konto auf der Whitelist nicht von einem Konto ohne Einträge zu unterscheiden.
{
"discordId": "123456789012345678",
"botConfigured": true,
"botProfile": null,
"networkLookup": null,
"ocean": {
"scannedUser": null,
"scanMatches": []
}
}Anwendungsbeispiel
cURL
curl -X GET "https://api.anticheat.ac/v1/db/query/123456789012345678" \ -H "x-api-key: your_api_key_here" \ -H "x-server-name: Ocean RP | EU-1"
JavaScript/Node.js
const response = await fetch(
'https://api.anticheat.ac/v1/db/query/123456789012345678',
{
headers: {
'x-api-key': 'your_api_key_here',
'x-server-name': 'Ocean RP | EU-1'
}
}
);
const data = await response.json();
if (data.botProfile?.isConfirmedCheater) {
console.log('Confirmed cheater:', data.botProfile.confirmedCheater.reason);
}
if (data.ocean.scannedUser) {
console.log('Ocean status:', data.ocean.scannedUser.overallStatus);
}
console.log('Active network bans:', data.networkLookup?.bans.activeCount ?? 0);Python
import requests
headers = {
'x-api-key': 'your_api_key_here',
'x-server-name': 'Ocean RP | EU-1'
}
data = requests.get(
'https://api.anticheat.ac/v1/db/query/123456789012345678',
headers=headers
).json()
profile = data.get('botProfile')
if profile and profile['isConfirmedCheater']:
print(f"Confirmed cheater: {profile['confirmedCheater']['reason']}")
scanned = data['ocean']['scannedUser']
if scanned:
print(f"Ocean status: {scanned['overallStatus']}")Faire Nutzung
Exportiere die Datenbank nicht massenhaft
Dieser Endpunkt dient dazu, Spieler zu prüfen, bevor du sie auf deinen Server lässt, nicht dazu, die Datenbank zu spiegeln. Jeder Aufruf wird mit dem aufrufenden Schlüssel, der IP und dem optionalen Servernamen protokolliert. Enumerationsmuster und Schlüsselweitergabe sind Gründe, den Datenbankzugriff zu entziehen.
x-server-name senden
Wenn du mehrere Server mit einem Schlüssel betreibst, sende von jedem einen eigenen x-server-name. So kannst du am schnellsten belegen, welcher deiner Server einen Aufruf gemacht hat, falls die Nutzung jemals hinterfragt wird.