🔐 Аутентификация
Все запросы (кроме GET /) требуют API ключ в заголовке X-API-Key.
Формат ключа:
Пример:
XXXX-XXXX-XXXX-XXXXПример:
A3B7-C9D2-E4F1-8G5H
curl -H "X-API-Key: YOUR_KEY" https://api.cfg.ceo/stats
📡 Эндпоинты
GET
/
Проверка работы API (без аутентификации)
Ответ:
{
"status": "ok",
"service": "cfgcloud-api",
"version": "2.0.0",
"timestamp": "2026-01-20T20:00:00"
}
GET
/stats
Получить статистику по всем аккаунтам
Ответ:
{
"success": true,
"stats": {
"free": 150,
"busy": 25,
"reserved": 5,
"total": 180
}
}
GET
/accounts/free
Проверить наличие свободных аккаунтов
Ответ:
{
"success": true,
"available": true,
"count": 150
}
POST
/accounts/issue
Взять аккаунт для себя (используя токен)
Ограничения: Проверяется наличие в БД, бан, наличие локов (если не в whitelist).
Важно: Тело запроса НЕ требуется! Пользователь определяется автоматически по API ключу в заголовке
X-API-Key.
# Правильный запрос (без тела)
curl -X POST \
-H "X-API-Key: YOUR_KEY" \
https://api.cfg.ceo/accounts/issue
# НЕПРАВИЛЬНО (не передавайте тело запроса):
curl -X POST \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"user_id": 123, "username": "test"}' \
https://api.cfg.ceo/accounts/issue
Ответ (успех):
{
"success": true,
"error": null,
"tag": "TAG123",
"account": {
"email": "[email protected]",
"password": "password123",
"time": "2026-01-20 20:00:00",
"lifetime_minutes": 60
}
}
Возможные ошибки:
• "Ваш ID не найден в базе данных."
• "Вы заблокированы в системе."
• "Для получения доступа необходимо сделать хотя бы 1 лок..."
• "У вас уже есть активный аккаунт: {tag}"
• "Нет доступных аккаунтов. Попробуйте позже."
• "Ваш ID не найден в базе данных."
• "Вы заблокированы в системе."
• "Для получения доступа необходимо сделать хотя бы 1 лок..."
• "У вас уже есть активный аккаунт: {tag}"
• "Нет доступных аккаунтов. Попробуйте позже."
POST
/accounts/cancel
Отменить аккаунт (освободить с проверкой владельца)
Примечание: Отменить можно только свой аккаунт
Тело запроса:
| Поле | Тип | Описание |
|---|---|---|
| tag | string | Тег аккаунта обязательно |
| nickname | string | Никнейм пользователя обязательно |
Ответ:
{
"success": true,
"error": null,
"tag": "TAG123"
}
GET
/accounts/{tag}/time
Получить оставшееся время аккаунта в минутах
Параметры пути:
| Параметр | Тип | Описание |
|---|---|---|
| tag | string | Тег аккаунта обязательно |
Ответ:
{
"success": true,
"error": null,
"minutes_left": 45
}
GET
/me
Получить информацию о владельце API ключа
Ответ:
{
"success": true,
"user": {
"user_id": 5770559689,
"username": "cfg"
}
}
GET
/accounts/{tag}/locks
Проверить был ли успешный лок для аккаунта
Доступ: Только для текущего холдера
Параметры пути:
| Параметр | Тип | Описание |
|---|---|---|
| tag | string | Тег аккаунта обязательно |
Ответ:
{
"success": true,
"tag": "TAG123",
"has_lock": true
}
Примечание:
has_lock = true означает, что для аккаунта был совершен успешный лок
Ошибки:
• 403: "Доступ запрещен. Вы должны быть текущим холдером или находиться в истории холдеров."
• 404: "Аккаунт не найден"
• 403: "Доступ запрещен. Вы должны быть текущим холдером или находиться в истории холдеров."
• 404: "Аккаунт не найден"
GET
/services/imei
Получить все последние IMEI
Доступ: Только для сервисов (требуется API ключ сервиса)
Ответ:
{
"success": true,
"count": 1234,
"imei": [
"123456789012345",
"234567890123456",
"345678901234567",
...
]
}
Ошибки:
• 401: "API ключ не предоставлен"
• 403: "Доступ запрещен. Требуется валидный API ключ сервиса."
• 401: "API ключ не предоставлен"
• 403: "Доступ запрещен. Требуется валидный API ключ сервиса."
GET
/monitor/logs
Получить логи монитора из кольцевого буфера (500 записей). Поддерживает инкрементальный поллинг через after_id.
Query-параметры:
| Параметр | Тип | Описание |
|---|---|---|
| after_id | int | Вернуть только записи с id > after_id по умолчанию 0 |
| limit | int | Максимум записей (1-500) по умолчанию 100 |
Ответ:
{
"logs": [
{
"id": 41,
"ts": "2026-01-20 20:00:00",
"tag": "#CL123",
"message": "CL123 БАМ повержен связан",
"level": "SUCCESS"
},
{
"id": 42,
"ts": "2026-01-20 20:01:00",
"tag": "#CL124",
"message": "CL124 started work",
"level": "INFO"
}
],
"last_id": 42
}
Поллинг: Для инкрементального поллинга сохраняйте
last_id из ответа и передавайте как after_id в следующем запросе. Буфер хранит последние 500 записей в памяти.
💻 Примеры использования
Python (aiohttp)
import aiohttp
API_URL = "https://api.cfg.ceo"
API_KEY = "YOUR_API_KEY"
async def get_stats():
async with aiohttp.ClientSession() as session:
headers = {"X-API-Key": API_KEY}
async with session.get(f"{API_URL}/stats", headers=headers) as resp:
return await resp.json()
async def issue_account():
"""Взять аккаунт для себя (пользователь определяется по API ключу)"""
async with aiohttp.ClientSession() as session:
headers = {
"X-API-Key": API_KEY,
"Content-Type": "application/json"
}
async with session.post(
f"{API_URL}/accounts/issue",
headers=headers
) as resp:
return await resp.json()
JavaScript (fetch)
const API_URL = "https://api.cfg.ceo";
const API_KEY = "YOUR_API_KEY";
// Получить статистику
async function getStats() {
const response = await fetch(`${API_URL}/stats`, {
headers: {
"X-API-Key": API_KEY
}
});
return await response.json();
}
// Взять аккаунт для себя
async function issueAccount() {
const response = await fetch(`${API_URL}/accounts/issue`, {
method: "POST",
headers: {
"X-API-Key": API_KEY,
"Content-Type": "application/json"
}
});
return await response.json();
}
cURL
# Получить статистику
curl -H "X-API-Key: YOUR_KEY" \
https://api.cfg.ceo/stats
# Взять аккаунт для себя
curl -X POST \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
https://api.cfg.ceo/accounts/issue
# Отменить свой аккаунт
curl -X POST \
-H "X-API-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"tag":"TAG123","nickname":"cfg"}' \
https://api.cfg.ceo/accounts/cancel
# Получить оставшееся время аккаунта
curl -H "X-API-Key: YOUR_KEY" \
https://api.cfg.ceo/accounts/TAG123/time
# Проверить был ли успешный лок
curl -H "X-API-Key: YOUR_KEY" \
https://api.cfg.ceo/accounts/TAG123/locks
# Получить все IMEI (только для сервисов)
curl -H "X-API-Key: SERVICE_API_KEY" \
https://api.cfg.ceo/services/imei
# Поллинг логов монитора
curl -H "X-API-Key: YOUR_KEY" \
https://api.cfg.ceo/monitor/logs?after_id=0&limit=50
⚠️ Ограничения
Rate Limiting: 60 запросов в минуту на один API ключ
При превышении возвращается ошибка
При превышении возвращается ошибка
429 Too Many Requests
🔒 Безопасность
- Храните API ключи в безопасности - не передавайте их третьим лицам
- Используйте HTTPS - все запросы должны идти через защищенное соединение
- Регулярно проверяйте логи - следите за использованием вашего API ключа
- Перевыпускайте ключи - если ключ скомпрометирован, перевыпустите его через бота cfgcloud