Przejdź do głównej treści

API statusu PIN-u

GET /v1/pins/:pinCode/status

API statusu PIN-u pozwala śledzić postęp skanowania w czasie rzeczywistym. Pobierzesz aktualny status, procent postępu, komunikat statusu i podsumowanie wyników po zakończeniu skanowania. Idealne do pasków postępu, dashboardów na żywo i integracji z botami Discord.

Bazowy URL
https://api.anticheat.ac/v1
Uwierzytelnianie
Wymagany klucz API z uprawnieniem pins:status

Pobierz status PIN-u

Pobierz aktualny status skanowania konkretnego PIN-u, w tym procent postępu i komunikat statusu. Masz dostęp tylko do statusu PIN-ów, których jesteś właścicielem (utworzonych przez Twoje konto). Po zakończeniu skanowania odpowiedź zawiera też podsumowanie wyników z liczbą wykryć.

GET/v1/pins/:pinCode/status

Parametry

NazwaTypOpis
pinCodestring8-znakowy kod PIN (np. A7K3M2P9)

Nagłówki

x-api-key: your_api_key_here

Odpowiedź (oczekujące)

{
  "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
}

Odpowiedź (skanowanie w toku)

{
  "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
}

Odpowiedź (zakończone)

Po zakończeniu skanowania odpowiedź zawiera obiekt data z podsumowaniem liczby wykryć. Pełne szczegóły wykryć znajdziesz w endpoincie wyników PIN-u.

{
  "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" }
    ]
  }
}

Pola odpowiedzi

PoleTypOpis
pinstring8-znakowy kod PIN
pinNamestring | nullWłasna nazwa przypisana do PIN-u
typestringTyp skanowania (Java, Bedrock, FiveM itd.)
statusstringAktualny status: pending, scanning, finished, expired lub error
progressnumberPostęp skanowania od 0 do 100
statusMessagestring | nullCzytelny komunikat opisujący bieżący krok skanowania
resultstring | nullWerdykt skanowania: legit, cheating, suspicious lub null, jeśli nie zakończono
usedbooleanCzy PIN został użyty (skanowanie się rozpoczęło)
lastStatusUpdatestring | nullZnacznik czasu ISO 8601 ostatniej aktualizacji statusu
createdAtstringZnacznik czasu ISO 8601 utworzenia PIN-u
isFinishedbooleanFlaga pomocnicza: true, gdy status to "finished"
isScanningbooleanFlaga pomocnicza: true, gdy status to "scanning"
isPendingbooleanFlaga pomocnicza: true, gdy status to "pending"

Pola data (tylko po zakończeniu)

PoleTypOpis
cheatingstring | nullOgólny werdykt dotyczący oszukiwania
vpnstring | nullStatus wykrycia VPN
countrystring | nullKraj przeskanowanego użytkownika
scantimestring | nullJak długo trwało skanowanie
windowsstring | nullInformacje o wersji Windows
detectionsCountnumberLiczba potwierdzonych wykryć cheatów
warningsCountnumberLiczba flag ostrzeżeń
suspiciousCountnumberLiczba podejrzanych znalezisk
discordarrayWykryte konta Discord. Każdy wpis zawiera id i username

Odpowiedzi z błędem

StatusKodOpis
400Nieprawidłowe żądanieKod PIN jest pusty lub nieprawidłowy
403ZabronionePIN nie należy do Twojego konta
404Nie znalezionoKod PIN nie istnieje

Wymagane bycie właścicielem

Możesz pobierać status tylko dla PIN-ów utworzonych przez własne konto. Próba dostępu do PIN-u innego użytkownika zwróci błąd 403 Forbidden.

Różnica względem wyników PIN-u

Ten endpoint jest zoptymalizowany do odpytywania w trakcie skanowania. Zwraca dane o postępie i lekkie podsumowanie po zakończeniu. Aby uzyskać pełne szczegóły wykryć (pojedyncze wykrycia, podejrzane elementy, ostrzeżenia, kontrole integralności), użyj endpoincie wyników PIN-u po zakończeniu skanowania.

Strategia odpytywania

Ponieważ skanowanie trwa, powinieneś odpytywać ten endpoint cyklicznie, aby śledzić postęp. Zalecane strategie:

StrategiaInterwałZastosowanie
Pasek postępu3-5 sekundWyświetlanie postępu w czasie rzeczywistym w interfejsie lub embedzie Discord
Sprawdzanie w tle10-15 sekundBot czekający na wyniki, by wysłać powiadomienie
Monitorowanie wsadowe30-60 sekundMonitorowanie wielu PIN-ów jednocześnie

Pamiętaj o limicie żądań

API dopuszcza 1000 żądań na godzinę na klucz API. Jeśli odpytujesz co 3 sekundy, skanowanie jednego PIN-u zużywa ok. 20 żądań na minutę. Zaplanuj interwał odpytywania w zależności od tego, ile PIN-ów monitorujesz jednocześnie.

Przykład użycia

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']}")

Odpytywanie z paskiem postępu (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);

Przykład bota Discord (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);
}