Перейти к основному содержимому

API базы читеров

GET /v1/db/query/:discordId

API базы читеров — это программная версия страницы Query User. Оно ищет в базе читеров по Discord ID и возвращает профиль сообщества, внешний сетевой поиск и все сканирования Ocean, в которых встречался аккаунт.

Требуется DB Access

API-ключ с разрешением db:query могут создавать только аккаунты с доступом к базе данных. DB Access даёт активный план DB Access, выданное вам место базы данных Enterprise или роль сотрудника. Пока у вас нет доступа, разрешение неактивно на вкладке «Ключи API».

Доступ перепроверяется при каждом запросе, а не только при создании ключа. Если план DB Access истёк, ключ продолжит работать для остальных разрешений, но этот эндпоинт начнёт отвечать 403.

Базовый URL
https://api.anticheat.ac/v1
Аутентификация
Требуется API-ключ с разрешением db:query
Требуется
Активная лицензия или членство в Enterprise, а также доступ к базе данных

Поиск в базе по Discord ID

Возвращает всё, что база хранит по Discord ID, из трёх независимых источников. Любой из них может вернуть null, если записей нет.

GET/v1/db/query/:discordId

Параметры

НазваниеТипОписание
discordIdstringDiscord ID пользователя для поиска. От 5 до 25 цифр

Заголовки

ЗаголовокОбязательноеОписание
x-api-keyДаВаш API-ключ
x-server-nameНетМетка сервера, который делает вызов. Записывается в журнал использования, чтобы вы могли отличать свои интеграции. См. Журнал использования

Ответ

{
  "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"
      }
    ]
  }
}

Поля ответа

ПолеТипОписание
discordIdstringDiscord ID, по которому выполнялся поиск
botConfiguredbooleanДоступен ли бэкенд базы данных сообщества. Если false, botProfile всегда равен null
botProfileobject | nullПрофиль в базе сообщества: серверы, где замечен, история ролей, активность в сообщениях и статус подтверждённого читера
networkLookupobject | nullПрофиль во внешней сети: связанные идентификаторы, время игры по серверам, история банов и статус в чёрном списке
ocean.scannedUserobject | nullСводка сканирований Ocean: статус, детекты, игры, связанные аккаунты и история сканирований
ocean.scanMatchesarrayОтдельные сканирования, которым соответствует этот аккаунт — по Discord ID или по общему HWID

Ошибки

СтатусЗначение
400Discord ID отсутствует или состоит не из 5–25 цифр
401API-ключ отсутствует, отключён или просрочен
403У ключа нет разрешения db:query, или у аккаунта больше нет доступа к базе данных
429Превышен лимит запросов для этого API-ключа

Пустые результаты

Если по Discord ID нет записей, возвращается корректный ответ с пустыми источниками, а не 404. Для Discord ID из белого списка возвращается такая же структура, поэтому аккаунт из белого списка неотличим от аккаунта без записей.

{
  "discordId": "123456789012345678",
  "botConfigured": true,
  "botProfile": null,
  "networkLookup": null,
  "ocean": {
    "scannedUser": null,
    "scanMatches": []
  }
}

Пример использования

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']}")

Добросовестное использование

Не выгружайте базу целиком

Этот эндпоинт нужен для проверки игроков, которых вы собираетесь пустить на сервер, а не для копирования базы. Каждый вызов записывается с указанием ключа, IP и необязательного названия сервера. Перебор данных и передача ключей — основания для отзыва доступа к базе.

Отправляйте x-server-name

Если вы обслуживаете несколько серверов одним ключом, отправляйте разный x-server-name с каждого. Так быстрее всего доказать, какой из ваших серверов сделал вызов, если использование поставят под сомнение.