Zum Hauptinhalt springen

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

NameTypBeschreibung
pinCodestringDer 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

FeldTypBeschreibung
pinstringDer 8-stellige PIN-Code
pinNamestring | nullDer der PIN zugewiesene benutzerdefinierte Name
typestringScan-Typ (Java, Bedrock, FiveM usw.)
statusstringAktueller Status: pending, scanning, finished, expired oder error
progressnumberScan-Fortschritt von 0 bis 100
statusMessagestring | nullMenschenlesbare Meldung zum aktuellen Scan-Schritt
resultstring | nullScan-Urteil: legit, cheating, suspicious oder null, wenn nicht abgeschlossen
usedbooleanOb die PIN verwendet wurde (Scan gestartet)
lastStatusUpdatestring | nullISO-8601-Zeitstempel der letzten Statusaktualisierung
createdAtstringISO-8601-Zeitstempel der Erstellung der PIN
isFinishedbooleanKomfort-Flag: true, wenn der Status "finished" ist
isScanningbooleanKomfort-Flag: true, wenn der Status "scanning" ist
isPendingbooleanKomfort-Flag: true, wenn der Status "pending" ist

Datenfelder (nur bei Abschluss)

FeldTypBeschreibung
cheatingstring | nullGesamturteil zum Cheating
vpnstring | nullVPN-Erkennungsstatus
countrystring | nullLand des gescannten Nutzers
scantimestring | nullWie lange der Scan gedauert hat
windowsstring | nullInformationen zur Windows-Version
detectionsCountnumberAnzahl bestätigter Cheat-Erkennungen
warningsCountnumberAnzahl der Warn-Flags
suspiciousCountnumberAnzahl verdächtiger Funde
discordarrayErkannte Discord-Konten. Jeder Eintrag hat id und username

Fehlerantworten

StatusCodeBeschreibung
400Ungültige AnfragePIN-Code ist leer oder ungültig
403VerbotenDie PIN gehört nicht zu deinem Konto
404Nicht gefundenPIN-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:

StrategieIntervallAnwendungsfall
Fortschrittsbalken3–5 SekundenEchtzeit-Fortschrittsanzeige in einer UI oder einem Discord-Embed
Hintergrundprüfung10–15 SekundenBot, der auf Ergebnisse wartet, um eine Benachrichtigung zu senden
Stapelüberwachung30–60 SekundenGleichzeitige Ü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);
}