REST API
Загружайте файлы, создавайте коллекции и управляйте доступами по HTTP. Все ответы — в формате JSON; для анонимных загрузок ключ API не требуется.
Как работают загрузки
API storage.to работает для нашего CLI, приложение для рабочего стола, веб-загрузчик и любых сторонних клиентов, которые вы захотите создать. Процесс загрузки состоит из трёх шагов:
PUT ваши байты напрямую на presigned URL(ы). Байты не проходят через наши серверы.File и дадим вам URL-адрес для общего доступа.Все конечные точки ниже указаны относительно этого базового адреса. Пример: POST /upload/init означает POST https://storage.to/api/upload/init.
Аутентификация
Анонимные загрузки работают без аутентификации, но с жесткими ограничениями. Вызовы без ключа ограничены 50 файлами за скользящие 24 часа на устройство или IP, плюс квоты трафика ниже, а файлы истекают через 3 дня.
Аутентификация с бесплатным аккаунтом открывает:
- Без дневного лимита файлов
- Без квоты на объём загрузки
- Загрузки, привязанные к вашей учётной записи (видны в /dashboard)
- Премиум-функции (постоянные файлы, больше места)
- Изменения на основе владения (удаление, установка пароля, изменение срока действия) без необходимости совпадения visitor-token
Лимиты вкратце
expiry_daysexpiry_daysМесячных квот нет: все лимиты - скользящие 24-часовые окна или ограничения в минуту. На бесплатном тарифе нет фиксированного хранилища: каждый файл удаляется по своему сроку, поэтому квота не накапливается.
Подтверждение владения
/upload/init multipart, /upload/confirm, /file/reserve, /collection), возвращает в ответе owner_token. Токен — это подписанное доказательство владения, привязанное к конкретному ресурсу, и не зависит от вашего IP или токена посетителя. Токены живут столько же, сколько существует ресурс, безопасны для хранения и не истекают независимо. Потеря токена означает потерю контроля над этим ресурсом (файл/коллекция/загрузка) — относитесь к ним как к локальным паролям.# или вместе с сессией Bearer
X-Owner-Token: <token>
visitor_token. В CLI он хранится по адресу ~/.config/storageto/token (см. Документация для CLI).Для мутационных endpoint’ов (удаление, установка пароля, изменение срока действия) владение подтверждается, если либо токен посетителя совпадает или запрос приходит с того же IP, с которого был создан файл. Оба варианта могут быть потеряны (очищенные cookies, смена сети). В дальнейшем предпочтительным доказательством является owner token.
Ошибки
Ошибки имеют единый формат: { "success": false, "error": "…" }
Ограничения по частоте запросов
Все лимиты частоты считаются по IP. В ответе 429 присутствуют стандартные заголовки Retry-After, X-RateLimit-Limit и X-RateLimit-Remaining.
Квота на загрузки: У анонимных клиентов параллельно работают два лимита - 100 ГБ / 24 ч на visitor token и 500 ГБ / 24 ч на IP (лимит по IP ловит трафик без токена и общие сети). Если превысить любой из них, вы получите 429 с подробностями. Это только лимит по загрузка - скачивания неограничены и без ограничений по скорости.
Загрузить
8 эндпоинтовТрёхшаговый процесс загрузки для любых файлов, включая файлы больше 5 ГБ (автоматически multipart). Если вам нужна только быстрая загрузка в стиле скриншота — вместо этого смотрите ShareX.
Инициируйте загрузку. Для файлов >50 МБ ответ будет multipart-загрузкой (поле type: "multipart"); иначе — один presigned PUT.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
filename | string · required | Оригинальное имя файла. Макс. 255 символов. |
content_type | string · required | MIME-тип. |
size | integer · required | Размер файла в байтах. Мин. 1. |
curl -X POST https://storage.to/api/upload/init \ -H "Content-Type: application/json" \ -H "X-Visitor-Token: abc123" \ -d '{ "filename": "report.pdf", "content_type": "application/pdf", "size": 2202009 }'
{ "success": true, "type": "single", "upload_url": "https://r2.cloudflarestorage.com/...signed...", "headers": { "Host": ["..."] }, "r2_key": "uuid-abc123" }
{ "success": true, "type": "multipart", "upload_id": "01HXYZ...", "r2_key": "uuid-abc123", "part_size": 33554432, "total_parts": 4, "initial_urls": { "1": "https://...", "2": "https://..." }, "owner_token": "owner_v1_..." }
Запросить дополнительные URL-адреса частей для выполняющейся multipart-загрузки. Используется, когда /init вернул меньше URL, чем у вас частей (или они истекли).
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
upload_id | string · required | Значение upload_id из /init. |
part_numbers | array<int> · required | Номера частей, для которых нужно получить URL. |
curl -X POST https://storage.to/api/upload/parts \ -H "Content-Type: application/json" \ -d '{ "upload_id": "01HXYZ...", "part_numbers": [3, 4] }'
{ "success": true, "part_urls": [ { "partNumber": 3, "url": "https://..." }, { "partNumber": 4, "url": "https://..." } ] }
Завершить multipart-загрузку после загрузки всех частей.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
upload_id | string · required | Значение upload_id из /init. |
parts | array · required | Каждая запись: { partNumber, etag } из ответа на загрузку части. |
curl -X POST https://storage.to/api/upload/complete-multipart \ -H "Content-Type: application/json" \ -d '{ "upload_id": "01HXYZ...", "parts": [ { "partNumber": 1, "etag": "\"abc...\"" }, { "partNumber": 2, "etag": "\"def...\"" } ] }'
{ "success": true }
Отменить multipart-загрузку и очистить любые частичные данные.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
upload_id | string · required | Загрузка, которую нужно прервать. |
curl -X POST https://storage.to/api/upload/abort \ -H "Content-Type: application/json" \ -d '{ "upload_id": "01HXYZ..." }'
Подтвердить, что загрузка завершена. Именно тогда мы создаём запись 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. |
curl -X POST https://storage.to/api/upload/confirm \ -H "Content-Type: application/json" \ -H "X-Visitor-Token: abc123" \ -d '{ "filename": "report.pdf", "size": 2202009, "content_type": "application/pdf", "r2_key": "uuid-abc123" }'
{ "success": true, "file": { "id": "FQxyz1234", "url": "https://storage.to/FQxyz1234", "filename": "report.pdf", "size": 2202009, "human_size": "2.1 MB", "expires_at": "2026-04-15T12:00:00Z" }, "owner_token": "owner_v1_..." }
Зарезервируйте file ID и общий URL до того, как будут готовы байты. Удобно, когда нужно сначала выдать ссылку, а затем выполнить загрузку. Владение привязано к вашему visitor token + IP. Завершите загрузку позже с /upload/init + /upload/confirm, передав file_id для подтверждения.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
filename | string · optional | Имя файла-заглушка. По умолчанию: "Pending". |
content_type | string · optional | MIME-тип-заглушка. |
curl -X POST https://storage.to/api/file/reserve \ -H "X-Visitor-Token: abc123"
{ "success": true, "file": { "id": "FQxyz1234", "url": "https://storage.to/FQxyz1234", "expires_at": "2026-04-12T18:00:00Z" }, "owner_token": "owner_v1_..." }
Пакетный аналог /upload/init, оптимизированный для веб-загрузчика. Запускает до 250 файлов за один обмен.
Используется внутри веб-загрузчиком. Большинству клиентов лучше использовать одиночный /upload/init.
Пакетный аналог /upload/confirm. Подтверждает много файлов за один обмен.
Коллекции
9 эндпоинтовКоллекция объединяет несколько файлов под одним общим URL (/c/{id}). До 10 000 файлов и 25 ГБ суммарно.
Создать новую коллекцию. Затем добавьте файлы, передав collection_id на /upload/confirm.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
expected_file_count | integer · optional | Подсказка для автоматической отметки коллекции как готовой, когда подтвердятся все ожидаемые файлы. |
curl -X POST https://storage.to/api/collection \ -H "Content-Type: application/json" \ -H "X-Visitor-Token: abc123" \ -d '{ "expected_file_count": 3 }'
{ "success": true, "collection": { "id": "ABC123xyz", "url": "https://storage.to/c/ABC123xyz", "expires_at": "2026-04-15T12:00:00Z" }, "owner_token": "owner_v1_..." }
Проверять состояние коллекции. Также автоматически помечает коллекцию как готовую, если подтвердятся все ожидаемые файлы.
curl https://storage.to/api/collection/ABC123xyz/status
{ "success": true, "files": [ /* file objects: id, url, filename, size, ... */ ], "is_uploading": false, "file_count": 3, "expected_file_count": 3, "total_size": 6291456, "human_total_size": "6 MB" }
Отметьте коллекцию как готовую к скачиванию. Обычно это не нужно — коллекции автоматически становятся готовыми, как только достигнут expected_file_count.
Удалить коллекцию и все её файлы.
Установить пароль для коллекции. Требуется 4–100 символов.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
password | string · required | 4–100 символов. |
curl -X POST https://storage.to/api/collection/ABC123xyz/password \ -H "X-Visitor-Token: abc123" \ -d '{ "password": "hunter22" }'
Удалить пароль из коллекции.
Проверить пароль. Возвращает 200 при успехе и 401 при неверном пароле.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
password | string · required |
Изменить срок действия коллекции.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
days | integer · optional | Через 1–7 дней, но не позже 7 дней после загрузки (или текущего срока хранения, если он позже). Не указывайте или передайте null для бессрочного хранения (только премиум). |
Установить лимит скачиваний (burn-after-N-downloads). Коллекция автоматически удалится, когда лимит будет достигнут.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
max_downloads | integer · optional | 1–1000. Должно быть больше текущего количества скачиваний. null — чтобы убрать лимит. |
Файлы
8 эндпоинтовВсе настройки на уровне файла (пароль, срок действия, max-downloads) повторяют параметры коллекции. Только владелец.
Проверить, ожидает ли файл завершения загрузки.
{ "pending": false }
Немедленно удалить файл.
Загрузить миниатюру для видео или изображения (используется на странице скачивания). Макс. 2 МБ.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
thumbnail | image · required | Multipart-загрузка. Макс. 2 МБ. |
{ "success": true, "thumbnail_url": "https://..." }
Установить пароль для файла. Требуется 4–100 символов.
Убрать пароль у файла.
Проверить пароль файла.
Изменить срок действия файла.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
days | integer · optional | Через 1–7 дней, но не позже 7 дней после загрузки (или текущего срока хранения, если он позже). Не указывайте или передайте null для бессрочного хранения (только премиум). |
Ограничить общее число скачиваний файла. Автоматически удаляется, когда лимит достигнут.
Аутентификация для десктопа
2 эндпоинтаДля клиентов с выполненным входом, например десктопного приложения, у которых есть токен Bearer.
Верните аутентифицированного пользователя.
curl https://storage.to/api/user \ -H "Authorization: Bearer <token>"
{ "id": 42, "name": "Ada", "email": "ada@example.com", "is_premium": true }
Отзовите текущий access token.
Разное
5 эндпоинтовСостояние, квоты и телеметрия клиентов.
Проверка доступности. Возвращает 200 с { "status": "ok" }, когда воркер API обслуживает запросы.
{ "status": "ok" }
Живой поток активности для «глобуса» на главной странице. Кэшируется на edge.
Текущее использование лимита загрузок для вызывающего — используется CLI и десктоп-приложением, чтобы показать оставшуюся ёмкость. Формат ответа отличается для авторизованных пользователей. Несмотря на название URL, учитываются только байты загрузка; скачивания не считаются.
{ "success": true, "authenticated": false, "has_token": true, "limit_bytes": 107374182400, "limit_gb": 100, "used_bytes": 12345678, "used_gb": 0.01, "remaining_bytes": 107361836722, "remaining_gb": 99.99, "window_hours": 24 }
{ "success": true, "authenticated": true, "plan": "premium" }
Отправьте событие использования из CLI или desktop-приложения.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
app | string · required | desktop, cli или web. |
version | string · optional | Версия клиента. |
event | string · required | Имя события, например upload_complete. |
context | object · optional | Дополнительные метаданные. |
Отправляйте отчёт об ошибке из 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 | Диагностические метаданные. |