⚠️ Внимание
- API находится в активной разработке
- Некоторые функции могут быть недоступны
- Документация может быть неактуальной
- Используйте на свой страх и риск
📖 Введение
MiCloud API предоставляет полный доступ к облачному хранилищу через HTTP REST интерфейс.
https://api.micloud.websiteВерсия: v1
Сайты:
https://micloud.website/sites
🔐 Аутентификация
Все запросы к API требуют API ключ в заголовке.
Получение API ключа
- Запустите команду
/api_keyв Telegram боте -
Бот выдаст уникальный ключ формата:
user_id:token - Сохраните ключ в безопасном месте
Варианты передачи ключа
Вариант 1: Заголовок X-API-Key (рекомендуется)
Вариант 2: Authorization заголовок
🌐 CORS & Rate Limiting
CORS (Cross-Origin Resource Sharing)
По умолчанию сервер возвращает заголовок
Access-Control-Allow-Origin: * (разрешены все
источники). Для безопасности в продакшне рекомендуется ограничивать
origin на уровне прокси/NGINX.
- Часто используемые origin: https://micloud.website, https://www.micloud.website
- Локальное тестирование: http://127.0.0.1:8080
Rate Limiting
Превышение лимита: HTTP 429 (Too Many Requests) — пример тела:
{"error":"Rate limit exceeded"}.Брутфорс-протекция: за многократные неудачные попытки IP может быть временно заблокирован.
Рекомендуется:
- Группировать запросы где возможно
- Реализовать exponential backoff в клиенте
- Использовать Redis для синхронизации лимитов (для масштабирования)
⚠️ Обработка ошибок
API возвращает JSON с полем error и соответствующий
HTTP статус код.
| Статус | Описание | Пример |
|---|---|---|
| 400 | Bad Request (ошибка в параметрах) | {"error":"name required"} |
| 401 | Unauthorized (неверный/отсутствует API ключ) | {"error":"Unauthorized"} |
| 403 | Forbidden (нет доступа) | {"error":"Forbidden"} |
| 404 | Not Found (ресурс не найден) | {"error":"Not found"} |
| 413 | Payload Too Large (размер файла превышает лимит) |
{"error":"File size exceeds limit (500.0MB)"}
|
| 429 | Too Many Requests (превышен лимит) | {"error":"Rate limit exceeded"} |
| 500 | Internal Server Error | {"error":"..."} |
Проверка сервера
Описание: Получить ответ от сервера для проверки
✓ Ответ (200)
📁 Дерево файлов и папок
Описание: Получить полное дерево папок и файлов пользователя
✓ Параметры
Отсутствуют (аутентификация через API ключ)
✓ Ответ (200)
📂 Содержимое папки
Описание: Получить содержимое конкретной папки (или корня, если folder_id=root)
✓ Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
| folder_id | integer | string "root" | ID папки или "root" для корня |
📤 Загрузка файла
Описание: Загрузить файл в облако (multipart/form-data)
✓ Query параметры (опционально)
| Параметр | Тип | Описание |
|---|---|---|
| folder_id | integer | ID папки для загрузки (если не передан — в корень) |
✓ Body (multipart/form-data)
| Поле | Тип | Описание |
|---|---|---|
| file | file (binary) | Бинарные данные файла |
✓ Ограничения и возможные ошибки
-
Максимальный размер файла: 500 MB — при
превышении возвращается
413 Payload Too Large(пример:{"error":"File size exceeds limit (500.0MB)"}). - Чанк: сервер читает по 10 MB за итерацию (защитная настройка).
-
Запрещённые расширения: исполняемые/серверные
файлы (php, py, sh, exe, dll, jar и т.п.) — при попытке
загрузки возвращается
403. -
Лимит загрузок: 5 загрузок / 60 сек. на
пользователя — при превышении
429. -
Пустой файл —
400, обнаружение исполняемого кода внутри файла —403.
📥 Скачивание файла
Описание: Скачать файл по прямому URL (с заголовком Content-Disposition)
✓ Параметры пути
| Параметр | Описание |
|---|---|
| file_id | ID файла (из /tree или /folder) |
✏️ Переименование файла
Описание: Переименовать файл (скачивается, переи переупло жается в Telegram)
✓ Body (JSON)
🗑️ Удаление файла
Описание: Удалить файл
📁 Управление папками
Создание папки
Описание: Создать новую папку
✓ Body (JSON)
Переименование папки
✓ Body (JSON)
🔗 Ссылки шаринга
Создание шаринг-ссылки
Описание: Создать публичную ссылку на файл
✓ Body (JSON)
Получение информации о шаринг-ссылке
?pwd=PASSWORD (проверяется bcrypt).
Прямой доступ (по share_id)
Описание: Возвращает сам файл (attachment). Этот
endpoint отдаёт прямой download по share_id — на
текущий момент не требует передачи пароля в запросе.
Content-Disposition: attachment.
Обновление шаринг-ссылки
Описание: Изменить пароль или флаг анонимности
✓ Body (JSON)
Удаление шаринг-ссылки
📚 Репозитории
Список репозиториев
Описание: Получить все репозитории (созданные и где вы участник)
Поиск репозиториев
Описание: Поиск репозиториев по названию или ID. Возвращает публичные репозитории и ваши приватные.
🔧 Query параметры:
- q - поисковый запрос (название или ID репозитория)
- limit - лимит результатов (максимум 50, по умолчанию 10)
Создание репозитория
✓ Body (JSON)
Получение информации о репозитории
👥 Управление владельцем и членами репозитория
Описание: Настройки владельца репозитория (доступны только владельцу).
Описание: Список членов репозитория (только owner или участник).
Описание: Добавить нового участника в репозиторий (только owner)
✓ Body (JSON)
Доступные роли
- owner - полный доступ (не может быть добавлена через API)
- writer - может добавлять/удалять файлы
- reader - только просмотр
Описание: Обновить права участника (owner только).
✓ Body (JSON)
Описание: Удалить участника из репозитория (owner только).
Получает список всех файлов, привязанных к указанному репозиторию.
Обновление репозитория
✓ Body (JSON)
Удаление репозитория
Описание: Удалить репозиторий и все его файлы (только создатель)
📢 Подписки на события репозитория (Webhook)
Описание: Управление уведомлениями о новых коммитах в репозиториях. Позволяет подписать чат или группу на события добавления/удаления файлов.
Описание: Получить список подписок на события репозитория
Описание: Добавить подписку на события репозитория. При добавлении/удалении файлов будут отправляться уведомления в указанный чат.
✓ Body (JSON)
Описание: Удалить подписку на события репозитория
📄 Файлы в репозитории
Добавить файл в репозиторий
✓ Body (JSON)
Удалить файл из репозитория
📦 Коммиты и версионирование
Система коммитов позволяет отслеживать историю изменений файлов в репозитории. При добавлении или удалении файла автоматически создаётся коммит.
Список коммитов репозитория
Описание: Получить историю всех изменений в репозитории (макс. 100 последних коммитов)
Информация о конкретном коммите
Описание: Получить детальную информацию о коммите
Скачать файл из версии (коммита)
Описание: Получить file_id файла из конкретной версии для скачивания
🚀 Публикация сайтов
Получить статус публикации
Опубликовать/снять с публикации
✓ Body (JSON)
👤 Текущий пользователь
Описание: Получить информацию о текущем пользователе (по API ключу)
Описание: Получить детальную статистику по использованию хранилища и подписке
📊 Поля ответа
- files_count - общее количество файлов
- repos_count - количество репозиториев пользователя
- used_storage_mb - использовано МБ
- total_storage_limit_mb - лимит в МБ (в зависимости от подписки)
- usage_percent - процент использования от лимита
- is_premium - активна ли Premium подписка
- subscription_end_date - дата окончания подписки (null если нет)
🔑 API ключ
Описание: Создать новый API ключ (текущий будет переписан)
🔐 Telegram аутентификация
Описание: Аутентификация через Telegram Mini App с получением API ключа
✓ Body (JSON)
📧 Почтовые ящики
Получить список ящиков
Описание: Получить все почтовые ящики пользователя
✓ Ответ (200)
Создать почтовый ящик
Описание: Создать новый почтовый ящик (максимум 5 на пользователя)
✓ Body (JSON)
Ограничения
- Минимум 3 символа в имени
- Только латинские буквы, цифры, _ и -
- Максимум 5 ящиков на пользователя
- Формат адреса:
имя//:minmail
✓ Ответ (201)
Удалить почтовый ящик
Описание: Удалить ящик и все письма в нём
✓ Ответ (200)
✉️ Письма
Получить письма в ящике
Описание: Получить список писем
✓ Query параметры
| Параметр | Значения | По умолчанию |
|---|---|---|
| status | inbox, sent, spam | inbox |
✓ Ответ (200)
Получить конкретное письмо
Описание: Получить письмо по ID (автоматически помечает как прочитанное)
✓ Ответ (200)
Отправить письмо
Описание: Отправить письмо. Если получатель внутри системы minmail - доставляется мгновенно.
✓ Body (JSON)
✓ Ответ (200)
Удалить письмо
Описание: Удалить письмо
✓ Ответ (200)
Пометить как спам
Описание: Переместить письмо в спам
✓ Ответ (200)
🎮 Эвент и Магазин
Статус ивента (базовый)
Описание: Получить базовый статус ивента и баланс пользователя
✓ Ответ (200)
Описание: Получить подробную статистику пользователя, включая стрик, билеты и шанс на победу.
✓ Ответ (200)
📊 Поля ответа
- balance - текущий баланс валюты ивента
- total_earned - всего заработано за все время
- tickets - количество лотерейных билетов
- streak_days - текущая серия дней активности
- win_chance_percent - вероятность выигрыша в лотерее (%)
Таблица лидеров
Описание: Получить топ-10 пользователей по заработку и текущему балансу.
✓ Ответ (200)
Участие в лотерее
Описание: Записаться на участие в розыгрыше главного приза.
Магазин: Купить билет
Описание: Покупает 1 лотерейный билет за 1 монету.
Магазин: Купить Premium
Описание: Покупает 2 дня Premium-подписки за 5 монет.
📦 Лутбоксы
Список ящиков
Описание: Получить все ящики пользователя
✓ Ответ (200)
Купить ящик
Описание: Купить лутбокс за валюту ивента
Требования
- Ивент должен быть активен
- На балансе должно быть достаточно валюты (box_price)
✓ Ответ (201)
Удар по ящику (вскрытие)
Описание: Ударить по ящику. После 4 ударов - открывается.
Механика
- При каждом ударе есть 25% шанс повышения редкости
- Rarity: common → rare → epic → legendary
- Когда taps_left = 0, ящик открывается и выдаёт награду
✓ Ответ (200) - Удар
✓ Ответ (200) - Открытие
Reward type может быть: coins (с полем amount) или
premium (с полем days)
💻 Примеры использования
curl примеры
Python примеры
📋 Дополнительные рекомендации
Безопасность
- Всегда используйте HTTPS в продакшене
- Храните API ключи в переменных окружения, не в коде
- Регулярно переиздавайте ключи (POST /api_key/regenerate)
- Используйте разные ключи для разных приложений
- Логируйте и мониторьте использование API
Лучшие практики
- Группируйте запросы где возможно для снижения нагрузки
- Реализуйте exponential backoff для обработки 429 ошибок
- Кэшируйте данные на клиенте (особенно /tree)
- Используйте webhook вместо полинга где возможно
- Тестируйте с локальным IP (http://127.0.0.1:8080) перед продакшеном