Pin-Status-API
GET /v1/pins/:pinCode/status
Mit der Pin-Status-API kannst du den Fortschritt eines Scans in Echtzeit überwachen. Du erhältst den aktuellen Status, den Fortschritt in Prozent, die Statusmeldung und nach Abschluss des Scans die Ergebniszusammenfassung. Ideal für Fortschrittsbalken, Live-Dashboards und Discord-Bot-Integrationen.
- Basis-URL
https://api.anticheat.ac/v1- Authentifizierung
- API-Schlüssel erforderlich mit
pins:status
PIN-Status abrufen
Rufe den aktuellen Scan-Status einer bestimmten PIN ab, einschließlich Fortschritt in Prozent und Statusmeldung. Du kannst nur auf den Status von PINs zugreifen, die dir gehören (mit deinem Konto erstellt). Wenn der Scan abgeschlossen ist, enthält die Antwort zusätzlich eine Zusammenfassung der Ergebnisse mit der Anzahl der Erkennungen.
GET/v1/pins/:pinCode/status
Parameter
| Name | Typ | Beschreibung |
|---|---|---|
| pinCode | string | Der 8-stellige PIN-Code (z. B. A7K3M2P9) |
Header
x-api-key: your_api_key_here
Antwort (ausstehend)
{
"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
}Antwort (Scan läuft)
{
"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
}Antwort (abgeschlossen)
Wenn der Scan abgeschlossen ist, enthält die Antwort ein data -Objekt mit einer Zusammenfassung der Erkennungsanzahl. Für die vollständigen Erkennungsdetails nutze den Pin-Results-Endpunkt.
{
"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" }
]
}
}Antwortfelder
| Feld | Typ | Beschreibung |
|---|---|---|
| pin | string | Der 8-stellige PIN-Code |
| pinName | string | null | Der der PIN zugewiesene benutzerdefinierte Name |
| type | string | Scan-Typ (Java, Bedrock, FiveM usw.) |
| status | string | Aktueller Status: pending, scanning, finished, expired oder error |
| progress | number | Scan-Fortschritt von 0 bis 100 |
| statusMessage | string | null | Menschenlesbare Meldung zum aktuellen Scan-Schritt |
| result | string | null | Scan-Urteil: legit, cheating, suspicious oder null, wenn nicht abgeschlossen |
| used | boolean | Ob die PIN verwendet wurde (Scan gestartet) |
| lastStatusUpdate | string | null | ISO-8601-Zeitstempel der letzten Statusaktualisierung |
| createdAt | string | ISO-8601-Zeitstempel der Erstellung der PIN |
| isFinished | boolean | Komfort-Flag: true, wenn der Status "finished" ist |
| isScanning | boolean | Komfort-Flag: true, wenn der Status "scanning" ist |
| isPending | boolean | Komfort-Flag: true, wenn der Status "pending" ist |
Datenfelder (nur bei Abschluss)
| Feld | Typ | Beschreibung |
|---|---|---|
| cheating | string | null | Gesamturteil zum Cheating |
| vpn | string | null | VPN-Erkennungsstatus |
| country | string | null | Land des gescannten Nutzers |
| scantime | string | null | Wie lange der Scan gedauert hat |
| windows | string | null | Informationen zur Windows-Version |
| detectionsCount | number | Anzahl bestätigter Cheat-Erkennungen |
| warningsCount | number | Anzahl der Warn-Flags |
| suspiciousCount | number | Anzahl verdächtiger Funde |
| discord | array | Erkannte Discord-Konten. Jeder Eintrag hat id und username |
Fehlerantworten
| Status | Code | Beschreibung |
|---|---|---|
400 | Ungültige Anfrage | PIN-Code ist leer oder ungültig |
403 | Verboten | Die PIN gehört nicht zu deinem Konto |
404 | Nicht gefunden | PIN-Code existiert nicht |
Eigentümerschaft erforderlich
Du kannst nur den Status von PINs abrufen, die mit deinem eigenen Konto erstellt wurden. Der Zugriff auf die PIN eines anderen Nutzers liefert einen Fehler 403 Forbidden.
Unterschied zu Pin Results
Dieser Endpunkt ist für das Polling während eines Scans optimiert. Er liefert Fortschrittsdaten und nach Abschluss eine schlanke Zusammenfassung. Für die vollständigen Erkennungsdetails (einzelne Erkennungen, verdächtige Elemente, Warnungen, Integritätsprüfungen) nutze den Pin-Results-Endpunkt nach Abschluss des Scans.
Polling-Strategie
Da Scans Zeit brauchen, solltest du diesen Endpunkt regelmäßig abfragen, um den Fortschritt zu verfolgen. Hier einige empfohlene Strategien:
| Strategie | Intervall | Anwendungsfall |
|---|---|---|
| Fortschrittsbalken | 3–5 Sekunden | Echtzeit-Fortschrittsanzeige in einer UI oder einem Discord-Embed |
| Hintergrundprüfung | 10–15 Sekunden | Bot, der auf Ergebnisse wartet, um eine Benachrichtigung zu senden |
| Stapelüberwachung | 30–60 Sekunden | Gleichzeitige Überwachung vieler PINs |
Rate-Limit beachten
Die API erlaubt 1.000 Anfragen pro Stunde und API-Schlüssel. Wenn du alle 3 Sekunden abfragst, verbraucht ein einzelner PIN-Scan etwa 20 Anfragen pro Minute. Plane dein Polling-Intervall danach, wie viele PINs du gleichzeitig überwachst.
Anwendungsbeispiel
cURL
curl -X GET "https://api.anticheat.ac/v1/pins/A7K3M2P9/status" \ -H "x-api-key: your_api_key_here"
JavaScript / Node.js
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);
}Python
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']}")Polling mit Fortschrittsbalken (JavaScript)
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);Discord-Bot-Beispiel (discord.js)
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);
}