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