The Create Pins API allows Enterprise owners to create scan pins programmatically. Ideal for automating screenshare workflows, Discord bot integrations, and tournament management systems.
Base URL: https://api.anticheat.ac/v1
Authentication: API Key required with pins:create permission
This endpoint is exclusively available to Enterprise owners. Regular users with paid licenses or Enterprise members cannot use this feature. You must own an active Enterprise to create API keys with the pins:create permission.
Create a new scan pin for a specific game type. The pin will be valid for approximately 3 hours. You can optionally set the pin as private (only accessible by you) or public (visible in your organization).
/v1/pins/createx-api-key: your_api_key_hereContent-Type: application/json| Field | Type | Required | Description |
|---|---|---|---|
| type | string | Yes | Game type for the scan |
| pinName | string | No | Custom name for the pin (max 50 characters) |
| ramDump | boolean | No | Enable RAM dump analysis (default: false) |
| private | boolean | No | Set the pin as private (default: false). Private pins are only visible to you. |
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"
}| Field | Type | Description |
|---|---|---|
| pin | string | The generated 8-character pin code |
| type | string | The game type |
| status | string | Initial status (always "pending") |
| pinName | string | null | Custom name assigned to the pin |
| ramDump | boolean | Whether RAM dump is enabled |
| private | boolean | Whether the pin is private |
| expiresAt | string | ISO 8601 timestamp when the pin expires (~3 hours) |
| createdAt | string | ISO 8601 timestamp when the pin was created |
| enterprise | string | Name of the Enterprise the pin belongs to |
| Status | Code | Description |
|---|---|---|
400 | Bad Request | Invalid game type, or too many active pins (max 3) |
403 | Forbidden | Account is banned, or user is not an Enterprise owner |
404 | Not Found | User associated with API key not found |
When private is set to true, the pin and its results will only be visible to you. When set to false (default), other members of your Enterprise may see the pin in the organization dashboard.
After creating a pin, use the Pin Status API to monitor scan progress, and the Pin Results API to retrieve full detection details once the scan completes.
| Limit | Value |
|---|---|
| Active pins at a time | 3 (pending + scanning) |
| Pin expiration | ~3 hours after creation |
| Pin name length | 50 characters maximum |
| API rate limit | 1,000 requests per hour (shared with all 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);