A API do banco de dados de cheaters é a versão programática da página Query User. Ela pesquisa o banco de dados de cheaters por ID do Discord e retorna o perfil da comunidade, a consulta na rede externa e todos os scans do Ocean em que a conta já apareceu.
Somente contas com acesso ao banco de dados podem criar uma chave de API com a permissão db:query. O DB Access vem de um plano DB Access ativo, de uma vaga de banco de dados de um Enterprise atribuída a você ou de um cargo da equipe. A permissão fica desabilitada na aba Chaves de API até que você tenha o acesso.
O acesso é verificado novamente a cada requisição, e não apenas quando a chave é criada. Se o plano DB Access expirar, a chave continua funcionando para as outras permissões, mas este endpoint passa a responder 403.
URL base: https://api.anticheat.ac/v1
Autenticação: Requer chave de API com a permissão db:query
Requer: Licença ativa ou participação em um Enterprise, além de acesso ao banco de dados
Retorna tudo o que o banco de dados tem sobre um ID do Discord em três fontes independentes. Qualquer uma delas pode voltar como null quando não há nenhum registro.
/v1/db/query/:discordId| Nome | Tipo | Descrição |
|---|---|---|
| discordId | string | O ID de usuário do Discord a ser pesquisado. Deve ter de 5 a 25 dígitos |
| Cabeçalho | Obrigatório | Descrição |
|---|---|---|
| x-api-key | Sim | Sua chave de API |
| x-server-name | Não | Um rótulo para o servidor que faz a chamada. Fica registrado no log de uso para que você possa distinguir suas próprias integrações. Veja Registro de uso |
{
"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"
}
]
}
}| Campo | Tipo | Descrição |
|---|---|---|
| discordId | string | O ID do Discord que foi pesquisado |
| botConfigured | boolean | Indica se o backend do banco de dados da comunidade está acessível. Quando false, botProfile é sempre null |
| botProfile | object | null | Perfil do banco de dados da comunidade: servidores em que apareceu, histórico de cargos, atividade de mensagens e status de cheater confirmado |
| networkLookup | object | null | Perfil da rede externa: identificadores vinculados, tempo de jogo por servidor, histórico de bans e status de lista negra |
| ocean.scannedUser | object | null | Resumo de scans do Ocean: status, detecções, jogos, contas relacionadas e histórico de scans |
| ocean.scanMatches | array | Scans individuais em que esta conta foi encontrada, seja por ID do Discord ou por HWID compartilhado |
| Status | Significado |
|---|---|
| 400 | O ID do Discord está ausente ou não tem de 5 a 25 dígitos |
| 401 | A chave de API está ausente, desativada ou expirada |
| 403 | A chave não tem a permissão db:query, ou a conta não tem mais acesso ao banco de dados |
| 429 | Limite de requisições excedido para esta chave de API |
Um ID do Discord sem nenhum registro retorna uma resposta bem formada com fontes vazias, em vez de um 404. IDs do Discord na lista de permissões retornam o mesmo formato, de modo que uma conta na lista de permissões é indistinguível de uma conta sem registros.
{
"discordId": "123456789012345678",
"botConfigured": true,
"botProfile": null,
"networkLookup": null,
"ocean": {
"scannedUser": null,
"scanMatches": []
}
}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"
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);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']}")Este endpoint serve para verificar jogadores que você está prestes a deixar entrar no seu servidor, não para espelhar o banco de dados. Toda chamada é registrada com a chave usada, o IP e o nome de servidor opcional. Padrões de enumeração e compartilhamento de chaves são motivos para revogar o acesso ao banco de dados.
Se você roda vários servidores com uma única chave, envie um x-server-name diferente de cada um. É a forma mais rápida de provar qual dos seus servidores fez uma chamada caso o uso seja questionado.