REST API
Wysyłaj pliki, twórz kolekcje i zarządzaj udostępnieniami przez HTTP. Wszystkie odpowiedzi są w formacie JSON; do anonimowych wysyłek nie jest wymagany klucz API.
Jak działa wysyłanie plików
API storage.to napędza nasze CLI, aplikacja desktopowa, aplikacja do wysyłania w przeglądarce oraz każdy klient zewnętrzny, który chcesz zbudować. Proces wysyłania składa się z trzech kroków:
PUT swoje bajty bezpośrednio na presigned URL(e). Bajty nie przechodzą przez nasze serwery.File i przekazujemy Ci URL do udostępnienia.Wszystkie endpointy poniżej są względne względem tej bazy. Przykład: POST /upload/init oznacza POST https://storage.to/api/upload/init.
Uwierzytelnianie
Anonimowe przesyłanie działa bez uwierzytelniania, ale z rygorystycznymi limitami. Wywołania bez klucza są ograniczone do 50 plików na kroczące 24 godziny na urządzenie lub IP, plus poniższe limity przepustowości, a pliki wygasają po 3 dniach.
Uwierzytelnienie darmowym kontem odblokowuje:
- Bez dziennego limitu plików
- Brak limitu przepustowości wysyłania
- Wysyłki przypisane do Twojego konta (widoczne w /dashboard)
- Funkcje premium (pliki na stałe, większa przestrzeń)
- Zmiany oparte na własności (usuń, ustaw hasło, zmień datę ważności) bez konieczności dopasowania visitor-token
Limity w skrócie
expiry_daysexpiry_daysNie ma miesięcznych limitów - wszystkie limity to kroczące okna 24-godzinne lub limity na minutę. Darmowy plan nie ma stałej przestrzeni dyskowej: każdy plik wygasa sam, więc nic nie kumuluje się w ramach limitu.
Potwierdzanie własności
/upload/init multipart, /upload/confirm, /file/reserve, /collection) zwraca w odpowiedzi owner_token. Token jest podpisanym dowodem własności przypisanym do konkretnego zasobu, niezależnym od Twojego IP ani tokenu odwiedzającego. Tokeny działają tak długo, jak istnieje zasób, są bezpieczne do przechowywania i nie wygasają niezależnie. Utracony token oznacza utratę kontroli nad tym zasobem (plik/zestaw/przesyłka) — traktuj je jak lokalne hasła.# lub razem z sesją Bearer
X-Owner-Token: <token>
visitor_token. CLI zapisuje go w ~/.config/storageto/token (zobacz Dokumentacja CLI).Dla endpointów modyfikacji (delete, set password, change expiry) własność jest potwierdzana, jeśli albo token odwiedzającego pasuje do lub żądanie pochodzi z tego samego adresu IP, który utworzył plik. Oba mogą zostać utracone (wyczyszczone ciasteczka, zmiany sieci). W przyszłości preferowanym dowodem jest token właściciela.
Błędy
Błędy mają spójny format: { "success": false, "error": "…" }
Limity zapytań
Wszystkie limity szybkości są liczone na podstawie IP. Odpowiedź 429 zawiera standardowe nagłówki Retry-After, X-RateLimit-Limit i X-RateLimit-Remaining.
Limit uploadu: anonimowi klienci mają dwa równoległe limity - 100 GB / 24 h na visitor token i 500 GB / 24 h na IP (limit IP łapie ruch bez tokena i w sieciach współdzielonych). Gdy którykolwiek zostanie przekroczony, dostaniesz 429 z szczegółami. To jest limit wyłącznie na upload - pobieranie jest nieograniczone i bez ograniczeń.
Upload
8 endpointówTrzystopniowy proces uploadu dla każdego pliku, w tym plików większych niż 5 GB (automatycznie multipart). Jeśli potrzebujesz tylko szybkiego uploadu w stylu zrzutu ekranu, zamiast tego zobacz ShareX.
Rozpocznij upload. Dla plików >50 MB odpowiedź to upload multipart (pole type: "multipart"); w przeciwnym razie pojedynczy presigned PUT.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
filename | string · required | Oryginalna nazwa pliku. Maks. 255 znaków. |
content_type | string · required | Typ MIME. |
size | integer · required | Rozmiar pliku w bajtach. Min. 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_..." }
Zażądaj dodatkowych adresów URL części dla trwającego przesyłania multipart. Używane, gdy /init zwróciło mniej adresów URL niż masz części (albo wygasły).
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
upload_id | string · required | Identyfikator upload_id z /init. |
part_numbers | array<int> · required | Numery części, dla których pobrać adresy 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://..." } ] }
Zakończ przesyłanie multipart, gdy wszystkie części zostaną przesłane.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
upload_id | string · required | Identyfikator upload_id z /init. |
parts | array · required | Każdy wpis: { partNumber, etag } z odpowiedzi na przesłanie części. |
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 }
Anuluj przesyłanie multipart i posprzątaj wszelkie częściowe dane.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
upload_id | string · required | Przesyłanie do przerwania. |
curl -X POST https://storage.to/api/upload/abort \ -H "Content-Type: application/json" \ -d '{ "upload_id": "01HXYZ..." }'
Potwierdź, że przesyłanie jest ukończone. W tym momencie tworzymy rekord File i zwracamy udostępniany adres URL.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
filename | string · required | Oryginalna nazwa pliku. |
size | integer · required | Rozmiar pliku w bajtach. |
content_type | string · required | Typ MIME. |
r2_key | string · required | Identyfikator r2_key z /init. |
collection_id | string · optional | Dodaj do kolekcji. |
crc32 | integer · optional | Suma kontrolna CRC32 do weryfikacji integralności. |
file_id | string(9) · optional | Zrealizuj wcześniej utworzony identyfikator pliku zarezerwowane. |
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_..." }
Zarezerwuj identyfikator pliku i udostępniany adres URL przed, gdy bajty będą gotowe. Przydatne, gdy musisz najpierw udostępnić link, a dopiero potem dokończyć przesyłanie. Własność jest powiązana z tokenem odwiedzającego + IP. Dokończ przesyłanie później za pomocą /upload/init + /upload/confirm, przekazując file_id do potwierdzenia.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
filename | string · optional | Nazwa pliku zastępcza. Domyślnie "Pending". |
content_type | string · optional | Zastępczy typ 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_..." }
Odpowiednik wsadowy /upload/init, zoptymalizowany pod przeglądarkowy uploader. Inicjuje do 250 plików w jednej rundzie żądań.
Używane wewnętrznie przez przeglądarkowy uploader. Większość klientów powinna preferować pojedynczy /upload/init dla pliku.
Odpowiednik wsadowy /upload/confirm. Potwierdza wiele plików w jednej rundzie żądań.
Kolekcje
9 endpointówKolekcja grupuje wiele plików pod jednym udostępnianym adresem URL (/c/{id}). Do 10 000 plików i łącznie 25 GB.
Utwórz nową kolekcję. Dodaj pliki później, przekazując collection_id na /upload/confirm.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
expected_file_count | integer · optional | Wskazówka do automatycznego oznaczania kolekcji jako gotowej, gdy wszystkie oczekiwane pliki zostaną potwierdzone. |
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_..." }
Sprawdzaj stan kolekcji. Dodatkowo automatycznie oznacza kolekcję jako gotową, jeśli wszystkie oczekiwane pliki zostały potwierdzone.
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" }
Oznacz zestaw jako gotowy do pobrania. Zwykle nie jest to potrzebne — zestawy same stają się gotowe, gdy osiągną expected_file_count.
Usuń kolekcję i wszystkie jej pliki.
Ustaw hasło dla kolekcji. Wymaga 4–100 znaków.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
password | string · required | 4–100 znaków. |
curl -X POST https://storage.to/api/collection/ABC123xyz/password \ -H "X-Visitor-Token: abc123" \ -d '{ "password": "hunter22" }'
Usuń hasło z kolekcji.
Sprawdź hasło. Zwraca 200 w razie powodzenia, 401 w przypadku niepoprawnego hasła.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
password | string · required |
Zmień datę ważności kolekcji.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
days | integer · optional | Za 1–7 dni, ale nie później niż 7 dni od przesłania (lub obecna data wygaśnięcia, jeśli jest późniejsza). Pomiń lub null, aby plik był stały (tylko premium). |
Ustaw limit pobrań (burn-after-N-downloads). Kolekcja usuwa się automatycznie po osiągnięciu limitu.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
max_downloads | integer · optional | 1–1000. Musi przekraczać bieżącą liczbę pobrań. null, aby usunąć limit. |
Pliki
8 endpointówWszystkie ustawienia na poziomie pliku (hasło, wygaśnięcie, max-downloads) odzwierciedlają endpointy kolekcji. Tylko właściciel.
Sprawdź, czy plik nadal oczekuje na przesłanie.
{ "pending": false }
Natychmiast usuń plik.
Prześlij miniaturę dla pliku wideo lub obrazu (używane na stronie pobierania). Maks. 2 MB.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
thumbnail | image · required | Przesyłanie multipart. Maks. 2 MB. |
{ "success": true, "thumbnail_url": "https://..." }
Ustaw hasło dla pliku. Wymaga 4–100 znaków.
Usuń hasło pliku.
Zweryfikuj hasło pliku.
Zmień datę ważności pliku.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
days | integer · optional | Za 1–7 dni, ale nie później niż 7 dni od przesłania (lub obecna data wygaśnięcia, jeśli jest późniejsza). Pomiń lub null, aby plik był stały (tylko premium). |
Ogranicz łączną liczbę pobrań pliku. Usuwa się automatycznie po osiągnięciu limitu.
Uwierzytelnianie na komputerze
2 endpointyDla zalogowanych klientów, takich jak aplikacja desktopowa, którzy mają token Bearer.
Zwróć uwierzytelnionego użytkownika.
curl https://storage.to/api/user \ -H "Authorization: Bearer <token>"
{ "id": 42, "name": "Ada", "email": "ada@example.com", "is_premium": true }
Unieważnij bieżący token dostępu.
Różne
5 endpointówStan, limity i telemetria klientów.
Sprawdzenie dostępności. Zwraca 200 z { "status": "ok" }, gdy worker API działa.
{ "status": "ok" }
Na żywo: strumień aktywności dla globu na stronie głównej. Buforowane na krawędzi.
Aktualne wykorzystanie limitu przesyłania dla wywołującego — używane przez CLI i aplikację desktopową, by pokazać pozostałą pojemność. Format odpowiedzi różni się dla użytkowników uwierzytelnionych. Mimo nazwy URL śledzi to tylko bajty upload; pobrania nie są liczone.
{ "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" }
Wyślij zdarzenie użycia z poziomu CLI lub aplikacji desktopowej.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
app | string · required | desktop, cli lub web. |
version | string · optional | Wersja klienta. |
event | string · required | Nazwa zdarzenia, np. upload_complete. |
context | object · optional | Dodatkowe metadane. |
Wyślij raport błędu z CLI lub aplikacji desktopowej. Dedupikacja po stronie serwera — maks. 10 takich samych błędów na godzinę.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
app | string · required | desktop, cli lub web. |
type | string · required | Klasa/typ błędu. |
message | string · required | Komunikat błędu. |
stack | string · optional | Ślad stosu (stack trace). |
version, os, os_version, arch, context | various · optional | Metadane diagnostyczne. |