CFGCLOUD API v2.0.0

REST API для работы с аккаунтами

Базовый URL: https://api.cfg.ceo

🔐 Аутентификация

Все запросы (кроме 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}"
• "Нет доступных аккаунтов. Попробуйте позже."
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: "Аккаунт не найден"
GET /services/imei

Получить все последние IMEI

Доступ: Только для сервисов (требуется API ключ сервиса)
Ответ:
{
  "success": true,
  "count": 1234,
  "imei": [
    "123456789012345",
    "234567890123456",
    "345678901234567",
    ...
  ]
}
Ошибки:
• 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