REST API
Загружайте файлы, создавайте коллекции и управляйте шарингом через HTTP. Все ответы в формате JSON; для анонимных загрузок API-ключ не требуется.
Введение
API storage.to работает в CLI, десктопное приложение, веб-загрузчик и любом стороннем клиенте, который вы захотите создать.
Процесс загрузки состоит из трёх шагов:
- Инициализация — сообщите, что хотите загрузить файл. Мы вернём один или несколько предварительно подписанных URL, указывающих на Cloudflare R2.
- Загрузка в R2 —
PUTваши байты напрямую на предварительно подписанный URL(ы). Байты не проходят через наши серверы. - Подтверждение — сообщите, что загрузка завершена. Мы создадим запись
Fileи выдадим вам ссылку для шаринга.
Базовый URL
https://storage.to/api
Все нижеперечисленные эндпоинты относительно этого базового URL. Пример: POST /upload/init означает POST https://storage.to/api/upload/init.
Аутентификация
Большинство эндпоинтов не требуют аутентификации. Анонимные загрузки — ключевая функция.
Аутентификация необязательна и открывает:
- Загрузки, привязанные к вашему аккаунту (видны в /dashboard)
- Премиум-функции (постоянные файлы, больше места)
- Изменения, основанные на владении (удаление, установка пароля, изменение срока действия) без необходимости совпадения visitor-token
Мы используем Laravel Sanctum bearer токены. Получите токен через OAuth в десктопном приложении или веб-входе, затем отправляйте его как:
Authorization: Bearer <token>
Visitor token
Анонимным клиентам нужен способ доказать владение своими загрузками без аккаунта. Мы используем visitor token — случайную строку, которую клиент генерирует один раз и повторно использует. Отправляйте её с каждым запросом:
X-Visitor-Token: <random-string>
В вебе токен автоматически хранится в cookie visitor_token. CLI сохраняет его в ~/.config/storageto/token (см. Документация CLI).
Для мутационных эндпоинтов (удаление, установка пароля, изменение срока) владение подтверждается, если либо visitor token совпадает или запрос приходит с того же IP, что создал файл.
Ошибки
Ошибки имеют единый формат:
{
"success": false,
"error": "Human-readable message"
}
Распространённые HTTP-коды статуса:
| Код | Значение |
|---|---|
200 | OK. |
201 | Создано. |
400 | Неверный запрос (например, превышен лимит размера коллекции). |
401 | Требуется пароль или он неверен. |
403 | Нет доступа (вы не владелец ресурса). |
404 | Ресурс не найден или срок действия истёк. |
422 | Ошибка валидации или ограничение плана/квоты. |
429 | Превышен лимит запросов или квота загрузок. |
500 | Ошибка сервера. Проверьте статус. |
Ограничения скорости
Все ограничения скорости применяются на IP. Ответ с кодом 429 включает стандартные заголовки Retry-After, X-RateLimit-Limit и X-RateLimit-Remaining.
| Область | Лимит |
|---|---|
| Инициация / подтверждение / отмена загрузки | 60 / минута |
| Завершение многокомпонентной загрузки | 500 / минута |
| URL частей многокомпонентной загрузки | 120 / минута |
| Инициация / подтверждение пакетной загрузки | 500 / минута |
| Опрос статуса (файл и коллекция) | 120 / минута |
| Настройки (пароль, срок действия, макс. загрузок) | 30 / минута |
| Проверка пароля | 10 / минута |
| Создание коллекции | 30 / минута |
| Управление (готово, удалить) | 60 / минута |
| Загрузка миниатюры | 120 / минута |
| Загрузка через ShareX | 20 / день |
| Аналитика приложения / ошибки | 120 и 60 / в минуту |
Квота загрузки: Анонимные клиенты имеют два параллельных лимита — 100 ГБ / 24 ч на visitor token и 500 ГБ / 24 ч на IP (лимит по IP ловит трафик без токена и общие сети). При превышении любого из них вы получите 429 с деталями. Это только квота на загрузка — скачивания не ограничены и не замедляются (подаются напрямую с подписанных URL R2).
Загрузить
Трёхэтапный процесс загрузки для любых файлов, включая файлы больше 5 ГБ (автоматически многокомпонентная загрузка). Если нужна быстрая загрузка в стиле скриншота, используйте ShareX.
/upload/init
60/min
Инициализируйте загрузку. Для файлов >50 МБ в ответе есть part_urls для многокомпонентной загрузки; иначе один url.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
filename | string · required | Оригинальное имя файла. Максимум 255 символов. |
content_type | string · required | MIME-тип. |
size | integer · required | Размер файла в байтах. Минимум 1. |
/upload/parts
120/min
Запрос дополнительных URL частей для текущей многокомпонентной загрузки. Используется, если /init вернул меньше URL, чем частей у вас есть (или они истекли).
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
upload_id | string · required | upload_id из /init. |
part_numbers | array<int> · required | Номера частей для получения URL. |
/upload/complete-multipart
500/min
Завершите многокомпонентную загрузку на R2 после загрузки всех частей.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
upload_id | string · required | upload_id из /init. |
parts | array · required | Каждая запись: { partNumber, etag } из ответа R2. |
/upload/abort
60/min
Отмените многокомпонентную загрузку и удалите частичные данные на R2.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
upload_id | string · required | Загрузка для отмены. |
/upload/confirm
60/min
Подтвердите завершение загрузки. В этот момент создаётся запись File и возвращается ссылка для обмена.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
filename | string · required | Оригинальное имя файла. |
size | integer · required | Размер файла в байтах. |
content_type | string · required | MIME-тип. |
r2_key | string · required | r2_key из /init. |
collection_id | string · optional | Прикрепить к коллекции. |
crc32 | integer · optional | Контрольная сумма CRC32 для проверки целостности. |
file_id | string(9) · optional | Выполнить ранее зарезервировано ID файла. |
/file/reserve
60/min
Зарезервируйте ID файла и ссылку для обмена до пока данные не готовы. Полезно, если нужно сначала выдать ссылку, а загрузку завершить позже. Право собственности привязано к вашему токену посетителя + IP. Завершите загрузку позже с помощью /upload/init + /upload/confirm, передав file_id для подтверждения.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
filename | string · optional | Имя файла-заполнителя. По умолчанию "Pending". |
content_type | string · optional | MIME-тип-заполнитель. |
/upload/init-batch
500/min
Пакетный эквивалент /upload/init, оптимизированный для веб-загрузчика. Инициирует до 250 файлов за один запрос.
Используется внутри веб-загрузчика. Большинству клиентов лучше использовать одиночный /upload/init.
/upload/confirm-batch
500/min
Пакетный эквивалент /upload/confirm. Подтверждает множество файлов за один запрос.
Коллекции
Коллекция объединяет несколько файлов под одной ссылкой для общего доступа (/c/{id}). До 10 000 файлов и 25 ГБ всего.
/collection
30/min
Создайте новую коллекцию. Добавляйте файлы позже, передавая collection_id на /upload/confirm.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
expected_file_count | integer · optional | Подсказка для автоматической отметки коллекции как готовой, когда все ожидаемые файлы подтверждены. |
/collection/{id}/status
120/min
Опрашивает состояние коллекции. Также автоматически отмечает коллекцию как готовую, если все ожидаемые файлы подтверждены.
/collection/{id}/ready
Owner only
60/min
Отметить коллекцию как готовую для скачивания. Обычно не требуется — коллекции автоматически становятся готовыми при достижении expected_file_count.
/collection/{id}
Owner only
60/min
Удалить коллекцию и все её файлы.
/collection/{id}/password
Owner only
30/min
Установить пароль на коллекцию. Требуется от 4 до 100 символов.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
password | string · required | От 4 до 100 символов. |
/collection/{id}/password
Owner only
30/min
Удалить пароль с коллекции.
/collection/{id}/verify-password
10/min
Проверить пароль. Возвращает 200 при успехе, 401 при неправильном пароле.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
password | string · required |
/collection/{id}/expiry
Owner only
30/min
Изменить срок действия коллекции.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
days | integer · optional | От 1 до 7 дней с текущего момента. Пропустите или укажите null для постоянного срока (только для премиум). |
/collection/{id}/max-downloads
Owner only
30/min
Установить ограничение на количество скачиваний (удаление после N скачиваний). Коллекция удаляется автоматически при достижении лимита.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
max_downloads | integer · optional | От 1 до 1000. Должно превышать текущее количество скачиваний. null для снятия ограничения. |
Файлы
Все настройки на уровне файла (пароль, срок действия, макс. скачиваний) дублируют настройки коллекции. Только для владельца.
/file/{id}/status
120/min
Проверить, ожидает ли файл загрузки.
/file/{id}
Owner only
60/min
Удалить файл немедленно.
/file/{id}/thumbnail
Owner only
120/min
Загрузить миниатюру для видео или изображения (используется на странице скачивания). Максимум 2 МБ.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
thumbnail | image · required | Многочастная загрузка. Максимум 2 МБ. |
/file/{id}/password
Owner only
30/min
Установить пароль на файл. Требуется от 4 до 100 символов.
/file/{id}/password
Owner only
30/min
Удалить пароль с файла.
/file/{id}/verify-password
10/min
Проверить пароль файла.
/file/{id}/expiry
Owner only
30/min
Изменить срок действия файла.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
days | integer · optional | От 1 до 7 дней с текущего момента. Пропустите или укажите null для постоянного срока (только для премиум). |
/file/{id}/max-downloads
Owner only
30/min
Ограничить общее количество скачиваний файла. Автоматическое удаление при достижении лимита.
Загрузка через ShareX
Одноразовый эндпоинт загрузки — отправьте многочастный файл и получите ссылку для общего доступа. Без этапов init/confirm. Идеально для инструментов скриншотов. Полное руководство по настройке на /ru/docs/sharex.
Авторизация на рабочем столе
Для аутентифицированных клиентов (например, настольного приложения) с токеном Sanctum.
/user
Bearer token
Вернуть аутентифицированного пользователя.
/auth/logout
Bearer token
Отозвать текущий токен доступа.
Разное
/health
Проверка состояния. Пингует базу данных, хранилище R2 и кеш Redis. Возвращает 200, если всё в порядке, иначе 503.
/activity
Поток живой активности для глобуса на главной странице. Кэшируется на edge Cloudflare.
/bandwidth/status
60/min
Текущий расход квоты загрузки для вызывающего — используется CLI и настольным приложением для отображения оставшейся емкости. Форма ответа отличается для аутентифицированных пользователей. Несмотря на название URL, учитываются только загрузка байты; скачивания не считаются.
/app-analytics
120/min
Отправить событие использования из CLI или настольного приложения.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
app | string · required | desktop, cli или web. |
version | string · optional | Версия клиента. |
event | string · required | Название события, например upload_complete. |
context | object · optional | Дополнительные метаданные. |
/app-errors
60/min
Отправить отчёт об ошибке из CLI или настольного приложения. Удаление дубликатов на сервере — максимум 10 одинаковых ошибок в час.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
app | string · required | desktop, cli или web. |
type | string · required | Класс/тип ошибки. |
message | string · required | Сообщение об ошибке. |
stack | string · optional | Стек вызовов. |
version, os, os_version, arch, context | various · optional | Диагностические метаданные. |