A API de status do PIN permite acompanhar o progresso de um scan em tempo real. Obtenha o status atual, a porcentagem de progresso, a mensagem de status e os resultados resumidos assim que o scan terminar. Ideal para criar barras de progresso, painéis ao vivo e integrações com bots do Discord.
URL base: https://api.anticheat.ac/v1
Autenticação: Requer chave de API com a permissão pins:status
Obtenha o status atual do scan de um PIN específico, incluindo a porcentagem de progresso e a mensagem de status. Você só pode acessar o status de PINs que são seus (criados pela sua conta). Quando o scan termina, a resposta também inclui um resumo dos resultados com as contagens de detecções.
/v1/pins/:pinCode/status| Nome | Tipo | Descrição |
|---|---|---|
| pinCode | string | O código do PIN de 8 caracteres (por exemplo, A7K3M2P9) |
x-api-key: your_api_key_here{
"pin": "A7K3M2P9",
"pinName": "Tournament Match #42",
"type": "Java",
"status": "pending",
"progress": 0,
"statusMessage": null,
"result": null,
"used": false,
"lastStatusUpdate": null,
"createdAt": "2026-02-11T15:25:00.000Z",
"isFinished": false,
"isScanning": false,
"isPending": true
}{
"pin": "A7K3M2P9",
"pinName": "Tournament Match #42",
"type": "Java",
"status": "scanning",
"progress": 45,
"statusMessage": "Scanning system files... (45%)",
"result": null,
"used": true,
"lastStatusUpdate": "2026-02-11T15:30:00.000Z",
"createdAt": "2026-02-11T15:25:00.000Z",
"isFinished": false,
"isScanning": true,
"isPending": false
}Quando o scan é concluído, a resposta inclui um objeto data com um resumo das contagens de detecções. Para ver os detalhes completos das detecções, use o endpoint de resultados do PIN.
{
"pin": "A7K3M2P9",
"pinName": "Tournament Match #42",
"type": "Java",
"status": "finished",
"progress": 100,
"statusMessage": "Scan completed",
"result": "cheating",
"used": true,
"lastStatusUpdate": "2026-02-11T15:35:00.000Z",
"createdAt": "2026-02-11T15:25:00.000Z",
"isFinished": true,
"isScanning": false,
"isPending": false,
"data": {
"cheating": "cheating",
"vpn": "No",
"country": "US",
"scantime": "45 seconds",
"windows": "Windows 11 Pro 23H2",
"detectionsCount": 3,
"warningsCount": 1,
"suspiciousCount": 2,
"discord": [
{ "id": "123456789012345678", "username": "player123" }
]
}
}| Campo | Tipo | Descrição |
|---|---|---|
| pin | string | O código do PIN de 8 caracteres |
| pinName | string | null | Nome personalizado atribuído ao PIN |
| type | string | Tipo de scan (Java, Bedrock, FiveM, etc.) |
| status | string | Status atual: pending, scanning, finished, expired ou error |
| progress | number | Progresso do scan de 0 a 100 |
| statusMessage | string | null | Mensagem legível que descreve a etapa atual do scan |
| result | string | null | Veredito do scan: legit, cheating, suspicious ou null se ainda não terminou |
| used | boolean | Indica se o PIN já foi usado (o scan começou) |
| lastStatusUpdate | string | null | Timestamp ISO 8601 da última atualização de status |
| createdAt | string | Timestamp ISO 8601 de quando o PIN foi criado |
| isFinished | boolean | Atalho: true quando o status é "finished" |
| isScanning | boolean | Atalho: true quando o status é "scanning" |
| isPending | boolean | Atalho: true quando o status é "pending" |
| Campo | Tipo | Descrição |
|---|---|---|
| cheating | string | null | Veredito geral de uso de cheats |
| vpn | string | null | Status da detecção de VPN |
| country | string | null | País do usuário escaneado |
| scantime | string | null | Quanto tempo o scan levou |
| windows | string | null | Informações da versão do Windows |
| detectionsCount | number | Número de detecções de cheats confirmadas |
| warningsCount | number | Número de sinalizações de aviso |
| suspiciousCount | number | Número de achados suspeitos |
| discord | array | Contas do Discord detectadas. Cada entrada tem id e username |
| Status | Código | Descrição |
|---|---|---|
400 | Requisição inválida | O código do PIN está vazio ou é inválido |
403 | Proibido | O PIN não pertence à sua conta |
404 | Não encontrado | O código do PIN não existe |
Você só pode consultar o status de PINs criados pela sua própria conta. Tentar acessar o PIN de outro usuário retorna um erro 403 Forbidden.
Este endpoint é otimizado para consulta periódica durante um scan. Ele retorna os dados de progresso e um resumo leve quando termina. Para ver os detalhes completos das detecções (detecções individuais, itens suspeitos, avisos, verificações de integridade), use o endpoint de resultados do PIN depois que o scan for concluído.
Como os scans levam tempo para terminar, você deve consultar este endpoint periodicamente para acompanhar o progresso. Estas são algumas estratégias recomendadas:
| Estratégia | Intervalo | Caso de uso |
|---|---|---|
| Barra de progresso | 3 a 5 segundos | Exibição do progresso em tempo real em uma interface ou em um embed do Discord |
| Verificação em segundo plano | 10 a 15 segundos | Bot aguardando os resultados para enviar uma notificação |
| Monitoramento em lote | 30 a 60 segundos | Monitoramento de muitos PINs ao mesmo tempo |
A API permite 1.000 requisições por hora por chave de API. Se você consultar a cada 3 segundos, o scan de um único PIN usa cerca de 20 requisições por minuto. Planeje o intervalo de consulta de acordo com quantos PINs você monitora ao mesmo tempo.
curl -X GET "https://api.anticheat.ac/v1/pins/A7K3M2P9/status" \ -H "x-api-key: your_api_key_here"
const response = await fetch('https://api.anticheat.ac/v1/pins/A7K3M2P9/status', {
headers: { 'x-api-key': 'your_api_key_here' }
});
const data = await response.json();
console.log('Status:', data.status);
console.log('Progress:', data.progress + '%');
console.log('Message:', data.statusMessage);
if (data.isFinished) {
console.log('Result:', data.result);
console.log('Detections:', data.data.detectionsCount);
}import requests
response = requests.get(
'https://api.anticheat.ac/v1/pins/A7K3M2P9/status',
headers={'x-api-key': 'your_api_key_here'}
)
data = response.json()
print(f"Status: {data['status']}")
print(f"Progress: {data['progress']}%")
print(f"Message: {data.get('statusMessage', 'N/A')}")
if data['isFinished']:
print(f"Result: {data['result']}")
print(f"Detections: {data['data']['detectionsCount']}")async function pollPinStatus(pinCode, apiKey, onProgress) {
const url = 'https://api.anticheat.ac/v1/pins/' + pinCode + '/status';
const headers = { 'x-api-key': apiKey };
while (true) {
const res = await fetch(url, { headers });
const data = await res.json();
onProgress({
status: data.status,
progress: data.progress,
message: data.statusMessage,
});
if (data.isFinished) return data;
if (data.status === 'expired' || data.status === 'error') {
throw new Error('Scan ' + data.status);
}
await new Promise(r => setTimeout(r, 3000));
}
}
const result = await pollPinStatus('A7K3M2P9', 'your_api_key_here', (info) => {
console.log('[' + info.progress + '%] ' + info.message);
});
console.log('Final result:', result.result);
console.log('Detections:', result.data.detectionsCount);const { EmbedBuilder } = require('discord.js');
async function trackScan(channel, pinCode, apiKey) {
const url = 'https://api.anticheat.ac/v1/pins/' + pinCode + '/status';
const headers = { 'x-api-key': apiKey };
const embed = new EmbedBuilder()
.setTitle('Scan: ' + pinCode)
.setDescription('Starting scan...')
.setColor(0x3498db);
const msg = await channel.send({ embeds: [embed] });
const interval = setInterval(async () => {
try {
const res = await fetch(url, { headers });
const data = await res.json();
const bar = '\u2588'.repeat(Math.floor(data.progress / 5))
+ '\u2591'.repeat(20 - Math.floor(data.progress / 5));
embed.setDescription(
bar + ' ' + data.progress + '%\n'
+ (data.statusMessage || 'Waiting...')
);
if (data.isFinished) {
clearInterval(interval);
embed.setColor(data.result === 'legit' ? 0x2ecc71 : 0xe74c3c);
embed.addFields(
{ name: 'Result', value: data.result, inline: true },
{ name: 'Detections', value: String(data.data.detectionsCount), inline: true },
{ name: 'Warnings', value: String(data.data.warningsCount), inline: true },
);
}
await msg.edit({ embeds: [embed] });
} catch (err) {
clearInterval(interval);
embed.setDescription('Error: ' + err.message).setColor(0xe74c3c);
await msg.edit({ embeds: [embed] });
}
}, 5000);
}