La API de estado de PIN permite seguir el progreso de un escaneo en tiempo real: estado, porcentaje, mensaje y un resumen cuando termina. Ideal para barras de progreso, paneles en vivo y bots de Discord.
URL base: https://api.anticheat.ac/v1
Autenticación: Se requiere una clave de API con el permiso pins:status
Obtén el estado actual de un PIN, con el porcentaje de progreso y el mensaje. Solo puedes consultar PIN de tu cuenta. Cuando el escaneo termina, la respuesta incluye un resumen con la cantidad de detecciones.
/v1/pins/:pinCode/status| Nombre | Tipo | Descripción |
|---|---|---|
| pinCode | string | El código PIN de 8 caracteres (por ejemplo 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
}Cuando el escaneo termina, la respuesta incluye un objeto data con un resumen de las cantidades de detección. Para el detalle completo, usa el endpoint de resultados de 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 | Descripción |
|---|---|---|
| pin | string | El código PIN de 8 caracteres |
| pinName | string | null | Nombre personalizado asignado al PIN |
| type | string | Tipo de escaneo (Java, Bedrock, FiveM, etc.) |
| status | string | Estado actual: pending, scanning, finished, expired o error |
| progress | number | Progreso del escaneo, de 0 a 100 |
| statusMessage | string | null | Mensaje legible que describe el paso actual del escaneo |
| result | string | null | Veredicto: legit, cheating, suspicious, o null si todavía no terminó |
| used | boolean | Si el PIN ya se usó (el escaneo empezó) |
| lastStatusUpdate | string | null | Marca de tiempo ISO 8601 de la última actualización de estado |
| createdAt | string | Marca de tiempo ISO 8601 de creación del PIN |
| isFinished | boolean | Atajo: true cuando el estado es "finished" |
| isScanning | boolean | Atajo: true cuando el estado es "scanning" |
| isPending | boolean | Atajo: true cuando el estado es "pending" |
| Campo | Tipo | Descripción |
|---|---|---|
| cheating | string | null | Veredicto general de trampas |
| vpn | string | null | Estado de detección de VPN |
| country | string | null | País del usuario escaneado |
| scantime | string | null | Cuánto duró el escaneo |
| windows | string | null | Información de la versión de Windows |
| detectionsCount | number | Cantidad de detecciones de cheat confirmadas |
| warningsCount | number | Cantidad de avisos |
| suspiciousCount | number | Cantidad de hallazgos sospechosos |
| discord | array | Cuentas de Discord detectadas. Cada entrada tiene id y username |
| Estado | Código | Descripción |
|---|---|---|
400 | Solicitud incorrecta | El código PIN está vacío o no es válido |
403 | Prohibido | El PIN no pertenece a tu cuenta |
404 | No encontrado | El código PIN no existe |
Solo puedes consultar el estado de PIN creados por tu cuenta. Si intentas acceder al PIN de otro usuario, la API responde 403 Forbidden.
Este endpoint está pensado para consultar mientras el escaneo sigue. Devuelve el progreso y, al terminar, un resumen liviano. Para el detalle completo (detecciones, sospechosos, avisos, integridad), usa el endpoint de resultados de PIN cuando el escaneo termine.
Los escaneos tardan. Consulta este endpoint cada cierto tiempo para seguir el progreso. Estas son estrategias recomendadas:
| Estrategia | Intervalo | Uso |
|---|---|---|
| Barra de progreso | 3-5 segundos | Progreso en tiempo real en una interfaz o un embed de Discord |
| Comprobación en segundo plano | 10-15 segundos | Un bot que espera el resultado para avisar |
| Monitoreo por lotes | 30-60 segundos | Vigilar muchos PIN a la vez |
La API permite 1.000 peticiones por hora y por clave. Si consultas cada 3 segundos, un solo PIN usa unas 20 peticiones por minuto. Elige el intervalo según cuántos PIN vigiles a la vez.
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);
}