Быстрый старт
Skynet предоставляет WebSocket-интерфейс для автоматической конвертации Max-аккаунтов — извлечения токенов авторизации. Получите API-ключ на странице покупки и подключайтесь.
Минимальный пример (Node.js)
const WebSocket = require('ws');
const ws = new WebSocket('ws://api.citadel1488.info', {
headers: { 'X-API-Key': 'YOUR_API_KEY' }
});
ws.on('open', () => {
ws.send(JSON.stringify({
action: 'start',
phone: '+79991234567',
proxy: 'socks5://user:pass@1.2.3.4:1080',
}));
});
ws.on('message', raw => {
const e = JSON.parse(raw);
console.log(e);
if (e.status === 'pending_sms') {
ws.send(JSON.stringify({ action: 'code', id: e.id, code: '123456' }));
}
if (e.status === 'done') {
console.log('Token:', e.token, 'ViewerID:', e.viewerId);
ws.close();
}
});
Аутентификация
API-ключ передаётся при подключении одним из способов:
wss://api.citadel1488.info?key=YOUR_API_KEY
headers: { 'X-API-Key': 'YOUR_API_KEY' }
Если ключ недействителен или лимит исчерпан — соединение закрывается с кодом 4401 или 4429.
Лимиты
Каждый ключ имеет два типа ограничений:
- limit_day — максимальное количество конвертаций за 24 часа. Счётчик сбрасывается каждые 24 часа с момента первого запроса в сутках.
-1 = безлимит.
- limit_concurrent — максимальное количество одновременно активных сессий.
-1 = безлимит.
При превышении лимита сервер ответит событием error с причиной day_limit_exceeded или concurrent_limit_exceeded.
WebSocket — Подключение
WS
wss://api.citadel1488.info
После успешного подключения сервер ждёт первое действие. Тайм-аут сессии — 10 минут.
start — начать конвертацию
Запускает процесс авторизации для указанного номера телефона.
| Поле | Тип | Описание |
| action | string | "start" |
| phone | string * | Номер в формате +7XXXXXXXXXX |
| proxy | string ? | socks5://user:pass@host:port или http://... |
{ "action": "start", "phone": "+79991234567", "proxy": "socks5://user:pass@1.2.3.4:1080" }
Возможные ответы
{ "status": "cached", "token": "...", "phone": "+7...", "viewerId": 123456 }
{ "status": "pending_sms", "id": "uuid", "code_length": 6 }
{ "status": "error", "error": "day_limit_exceeded" }
code — отправить SMS-код
Отправляется после получения события pending_sms.
| Поле | Тип | Описание |
| action | string | "code" |
| id | string * | ID сессии из pending_sms |
| code | string * | SMS-код (обычно 6 цифр) |
{ "action": "code", "id": "uuid", "code": "123456" }
Возможные ответы после кода
{ "status": "done", "id": "uuid", "token": "Bearer eyJ...", "viewerId": 123456 }
{ "status": "pending_password", "id": "uuid" }
password — отправить пароль
Отправляется после получения события pending_password (двухэтапная проверка).
{ "action": "password", "id": "uuid", "password": "mypassword" }
lookup — проверить кэш
Проверяет, есть ли токен для номера в базе. Не тратит лимит конвертации.
{ "action": "lookup", "phone": "+79991234567" }
{ "status": "found", "phone": "+7...", "token": "Bearer eyJ...", "viewerId": 123456 }
{ "status": "not_found", "phone": "+7..." }
События сервера
| status | Описание |
| cached | Токен найден в базе, возвращён без конвертации |
| pending_sms | SMS отправлена, ожидается код |
| pending_password | Требуется пароль аккаунта |
| done | Конвертация завершена, токен получен |
| found | lookup: номер найден в кэше |
| not_found | lookup: номер не найден |
| log | Прогресс-лог: { status: "log", message: "..." } |
| error | Ошибка: { status: "error", error: "reason" } |
GET /health
Публичный эндпоинт. Возвращает статус сервера и статистику.
{ "ok": true, "accounts": 1042, "sessions": 3 }
Пример — Node.js (полный поток)
const WebSocket = require('ws');
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin });
const ask = q => new Promise(r => rl.question(q, r));
async function convert(phone) {
const ws = new WebSocket('ws://api.citadel1488.info', {
headers: { 'X-API-Key': 'YOUR_KEY' }
});
ws.on('open', () => ws.send(JSON.stringify({ action: 'start', phone })));
ws.on('message', async raw => {
const e = JSON.parse(raw);
if (e.status === 'log') { console.log('[log]', e.message); return; }
if (e.status === 'cached' || e.status === 'done') {
console.log('✓ Token:', e.token);
ws.close(); rl.close(); return;
}
if (e.status === 'pending_sms') {
const code = await ask(`SMS-код (${e.code_length} цифр): `);
ws.send(JSON.stringify({ action: 'code', id: e.id, code }));
}
if (e.status === 'pending_password') {
const pwd = await ask('Пароль аккаунта: ');
ws.send(JSON.stringify({ action: 'password', id: e.id, password: pwd }));
}
if (e.status === 'error') { console.error('Error:', e.error); ws.close(); }
});
}
convert('+79991234567');
Пример — Python
import asyncio, json, websockets
async def convert(phone: str, api_key: str):
uri = f"ws://api.citadel1488.info?key={api_key}"
async with websockets.connect(uri) as ws:
await ws.send(json.dumps({"action": "start", "phone": phone}))
async for msg in ws:
e = json.loads(msg)
if e["status"] == "log": continue
if e["status"] in ("done", "cached"):
print("Token:", e["token"]); break
if e["status"] == "pending_sms":
code = input(f"SMS-код ({e['code_length']} цифр): ")
await ws.send(json.dumps({"action":"code","id":e["id"],"code":code}))
if e["status"] == "error":
print("Error:", e["error"]); break
asyncio.run(convert("+79991234567", "YOUR_KEY"))
Пример — curl (health check)
curl https://api.citadel1488.info/health
Коды ошибок
| Код / причина | Описание |
| invalid_key | API-ключ не найден или деактивирован |
| day_limit_exceeded | Исчерпан дневной лимит конвертаций |
| concurrent_limit_exceeded | Превышено кол-во одновременных сессий |
| session_timeout | Сессия не завершена за 10 минут |
| wrong_code | Неверный SMS-код |
| wrong_password | Неверный пароль аккаунта |
| phone_flood | Слишком много попыток, флуд-ограничение |
| browser_error | Внутренняя ошибка браузерного этапа |
| unknown_action | Неизвестный тип action в запросе |