Zum Hauptinhalt springen

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

NameTypBeschreibung
discordIdstringDie zu suchende Discord-Nutzer-ID. Muss 5 bis 25 Ziffern haben

Header

HeaderErforderlichBeschreibung
x-api-keyJaDein API-Schlüssel
x-server-nameNeinEin 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

FeldTypBeschreibung
discordIdstringDie gesuchte Discord-ID
botConfiguredbooleanOb das Community-Datenbank-Backend erreichbar ist. Bei false ist botProfile immer null
botProfileobject | nullCommunity-Datenbankprofil: gesehene Server, Rollenverlauf, Nachrichtenaktivität und Status als bestätigter Cheater
networkLookupobject | nullProfil im externen Netzwerk: verknüpfte Kennungen, Spielzeit pro Server, Bann-Verlauf und Blacklist-Status
ocean.scannedUserobject | nullZusammenfassung des Ocean-Scans: Status, Erkennungen, Spiele, verwandte Konten und Scan-Verlauf
ocean.scanMatchesarrayEinzelne Scans, denen dieses Konto zugeordnet wurde, entweder per Discord-ID oder über gemeinsamen HWID

Fehler

StatusBedeutung
400Die Discord-ID fehlt oder hat nicht 5 bis 25 Ziffern
401Der API-Schlüssel fehlt, ist deaktiviert oder abgelaufen
403Dem Schlüssel fehlt die Berechtigung db:query, oder das Konto hat keinen Datenbankzugriff mehr
429Rate-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.