La API de creación de PIN permite a los propietarios de Enterprise crear PIN de escaneo de forma programática. Ideal para automatizar flujos de screenshare, bots de Discord y sistemas de torneos.
URL base: https://api.anticheat.ac/v1
Autenticación: Se requiere una clave de API con el permiso pins:create
Este endpoint está disponible solo para propietarios de Enterprise. Los usuarios con licencia de pago o los miembros de un Enterprise no pueden usarlo. Debes ser dueño de un Enterprise activo para crear claves de API con el permiso pins:create.
Crea un PIN de escaneo nuevo para un tipo de juego. El PIN es válido durante unas 3 horas. Puedes marcarlo como privado (solo tú) o público (visible en tu organización).
/v1/pins/createx-api-key: your_api_key_hereContent-Type: application/json| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| type | string | Sí | Tipo de juego del escaneo |
| pinName | string | No | Nombre personalizado del PIN (máximo 50 caracteres) |
| ramDump | boolean | No | Activa el análisis de volcado de RAM (predeterminado: false) |
| private | boolean | No | Marca el PIN como privado (predeterminado: false). Los PIN privados solo son visibles para ti. |
JavaBedrockFiveMRedMRageMPAltVRobloxSanAndreasCodRust{
"type": "Java",
"pinName": "Tournament Match #42",
"ramDump": false,
"private": true
}{
"pin": "A7K3M2P9",
"type": "Java",
"status": "pending",
"pinName": "Tournament Match #42",
"ramDump": false,
"private": true,
"expiresAt": "2026-02-11T18:35:00.000Z",
"createdAt": "2026-02-11T15:25:00.000Z",
"enterprise": "My Organization"
}| Campo | Tipo | Descripción |
|---|---|---|
| pin | string | El código PIN de 8 caracteres generado |
| type | string | El tipo de juego |
| status | string | Estado inicial (siempre "pending") |
| pinName | string | null | Nombre personalizado asignado al PIN |
| ramDump | boolean | Si el volcado de RAM está activado |
| private | boolean | Si el PIN es privado |
| expiresAt | string | Marca de tiempo ISO 8601 de caducidad del PIN (~3 horas) |
| createdAt | string | Marca de tiempo ISO 8601 de creación del PIN |
| enterprise | string | Nombre del Enterprise al que pertenece el PIN |
| Estado | Código | Descripción |
|---|---|---|
400 | Solicitud incorrecta | Tipo de juego no válido |
403 | Prohibido | La cuenta está baneada o el usuario no es propietario de un Enterprise |
404 | No encontrado | No se encontró el usuario asociado a la clave de API |
Si private es true, el PIN y sus resultados solo son visibles para ti. Si es false (predeterminado), otros miembros de tu Enterprise pueden ver el PIN en el panel de la organización.
Después de crear un PIN, usa la API de estado de PIN para seguir el progreso y la API de resultados de PIN para obtener el detalle completo cuando termine el escaneo. Estado de PIN · PIN
| Límite | Valor |
|---|---|
| PIN activos a la vez | 3 (pending + scanning) |
| Caducidad del PIN | ~3 horas después de crearlo |
| Longitud del nombre | 50 caracteres como máximo |
| Límite de la API | 1.000 peticiones por hora (compartidas con todos los endpoints) |
curl -X POST "https://api.anticheat.ac/v1/pins/create" \
-H "x-api-key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"type": "Java", "pinName": "Match #42", "private": true}'const response = await fetch('https://api.anticheat.ac/v1/pins/create', {
method: 'POST',
headers: {
'x-api-key': 'your_api_key_here',
'Content-Type': 'application/json',
},
body: JSON.stringify({
type: 'Java',
pinName: 'Match #42',
private: true,
}),
});
const data = await response.json();
console.log('Pin created:', data.pin);
console.log('Expires at:', data.expiresAt);import requests
response = requests.post(
'https://api.anticheat.ac/v1/pins/create',
headers={
'x-api-key': 'your_api_key_here',
'Content-Type': 'application/json',
},
json={
'type': 'Java',
'pinName': 'Match #42',
'private': True,
}
)
data = response.json()
print(f"Pin created: {data['pin']}")
print(f"Expires at: {data['expiresAt']}")const API_KEY = 'your_api_key_here';
const headers = {
'x-api-key': API_KEY,
'Content-Type': 'application/json',
};
async function createAndTrackPin(gameType, pinName, isPrivate = false) {
const createRes = await fetch('https://api.anticheat.ac/v1/pins/create', {
method: 'POST',
headers,
body: JSON.stringify({
type: gameType,
pinName,
private: isPrivate,
}),
});
const pin = await createRes.json();
console.log('Pin created:', pin.pin, '- Share this code with the player');
while (true) {
const statusRes = await fetch(
'https://api.anticheat.ac/v1/pins/' + pin.pin + '/status',
{ headers }
);
const status = await statusRes.json();
console.log('[' + status.progress + '%] ' + (status.statusMessage || 'Waiting...'));
if (status.isFinished) {
const resultsRes = await fetch(
'https://api.anticheat.ac/v1/pins/' + pin.pin + '/results',
{ headers }
);
return await resultsRes.json();
}
if (status.status === 'expired' || status.status === 'error') {
throw new Error('Scan ' + status.status);
}
await new Promise(r => setTimeout(r, 5000));
}
}
const results = await createAndTrackPin('Java', 'Tournament Finals', true);
console.log('Verdict:', results.result);
console.log('Detections:', results.data.detections);