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.
Wprowadzenie
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:
- Inicjuj — powiedz nam, że chcesz wysłać plik. Zwracamy jeden lub więcej presigned URLi wskazujących na Cloudflare R2.
- Wyślij do R2 — :wgraj swoje bajty bezpośrednio na presigned URL(e). Bajty nie przechodzą przez nasze serwery.
- Potwierdź — daj nam znać, że wysyłka się zakończyła. Tworzymy rekord
Filei przekazujemy Ci URL do udostępnienia.
Adres bazowy (Base URL)
https://storage.to/api
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
Większość endpointów nie wymaga uwierzytelniania. Anonimowe wysyłki to kluczowa funkcja.
Uwierzytelnianie jest opcjonalne i odblokowuje:
- 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
Używamy tokenów typu Laravel Sanctum bearer. Wygeneruj token przez przekazanie OAuth w aplikacji desktopowej lub logowanie w przeglądarce, a następnie wyślij go jako:
Authorization: Bearer <token>
Token gościa
Anonimowi klienci muszą mieć sposób, aby udowodnić, że są właścicielem własnych wysyłek, bez konta. Używamy visitor token — losowego ciągu, który klient generuje raz i ponownie wykorzystuje. Wyślij go wraz z każdą prośbą:
X-Visitor-Token: <random-string>
W wersji web token jest automatycznie zapisywany w ciasteczku 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.
Token właściciela
Każdy endpoint tworzący zasób (/upload/init multipart, /upload/confirm, /upload/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.
Zapisz token razem z ID zasobu i wysyłaj go przy każdej modyfikacji jako:
Authorization: Owner <token>
Albo, jeśli już używasz Authorization: Bearer do uwierzytelnionej sesji, wyślij go jako:
X-Owner-Token: <token>
Serwer akceptuje token właściciela jako ważny dowód własności obok starszego mechanizmu awaryjnego visitor token + IP — klienci, którzy mają token, nadal będą działać po przełączeniu sieci lub wyczyszczeniu ciasteczek, a klienci, którzy go nie mają, będą działać dokładnie jak wcześniej.
Tokeny działają tak długo, jak działa zasób, są bezpieczne do przechowywania i nie wygasają niezależnie. Utracony token oznacza utratę kontroli nad tym zasobem (plik/kolekcja/upload) — traktuj je jak lokalne hasła.
Błędy
Błędy mają spójny format:
{
"success": false,
"error": "Human-readable message"
}
Najczęstsze kody statusu HTTP:
| Kod | Znaczenie |
|---|---|
200 | OK. |
201 | Utworzono. |
400 | Nieprawidłowe żądanie (np. przekroczono limit rozmiaru kolekcji). |
401 | Wymagane hasło lub hasło jest nieprawidłowe. |
403 | Brak uprawnień (nie jesteś właścicielem zasobu). |
404 | Nie znaleziono zasobu lub wygasł. |
422 | Walidacja nie powiodła się lub obowiązuje ograniczenie planu/limitu. |
429 | Przekroczono limit szybkości lub limit uploadu. |
500 | Błąd serwera. Sprawdź status. |
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.
| Zakres | Limit |
|---|---|
| Inicjowanie / potwierdzanie / anulowanie uploadu | 60 / minuta |
| Zakończenie multipart | 500 / minuta |
| Adresy URL części multipart | 120 / minuta |
| Inicjowanie / potwierdzanie wsadowe | 500 / minuta |
| Pobieranie statusu (plik i kolekcja) | 120 / minuta |
| Ustawienia (hasło, wygaśnięcie, maks. liczba pobrań) | 30 / minuta |
| Weryfikacja hasła | 10 / minuta |
| Tworzenie kolekcji | 30 / minuta |
| Zarządzanie (ready, delete) | 60 / minuta |
| Upload miniatury | 120 / minuta |
| Upload ShareX | 20 / dzień |
| Analityka aplikacji / błędy | 120 i 60 / minuta |
Limit uploadu: anonimowi klienci mają dwa limity działające równolegle — 100 GB / 24 h na visitor token i 500 GB / 24 h na IP (limit IP łapie ruch bez tokena oraz sieci współdzielone). Gdy którykolwiek zostanie przekroczony, dostaniesz 429 z szczegółami. To jest wyłącznie limit upload — pobieranie jest nielimitowane i bez ograniczeń (obsługiwane bezpośrednio z podpisanych URL-i R2).
Upload
Trzystopniowy 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.
/upload/init
60/min
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. |
/upload/parts
Owner only
120/min
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. |
/upload/complete-multipart
Owner only
500/min
Zakończ przesyłanie multipart na R2, 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 R2. |
/upload/abort
Owner only
60/min
Anuluj przesyłanie multipart i posprzątaj wszelkie częściowe dane na R2.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
upload_id | string · required | Przesyłanie do przerwania. |
/upload/confirm
60/min
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. |
/file/reserve
60/min
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. |
/upload/init-batch
500/min
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.
/upload/confirm-batch
500/min
Odpowiednik wsadowy /upload/confirm. Potwierdza wiele plików w jednej rundzie żądań.
Kolekcje
Kolekcja grupuje wiele plików pod jednym udostępnianym adresem URL (/c/{id}). Do 10 000 plików i łącznie 25 GB.
/collection
30/min
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. |
/collection/{id}/status
120/min
Sprawdzaj stan kolekcji. Dodatkowo automatycznie oznacza kolekcję jako gotową, jeśli wszystkie oczekiwane pliki zostały potwierdzone.
/collection/{id}/ready
Owner only
60/min
Oznacz kolekcję jako gotową do pobrania. Zwykle nie jest to potrzebne — kolekcje same stają się gotowe po osiągnięciu expected_file_count.
/collection/{id}
Owner only
60/min
Usuń kolekcję i wszystkie jej pliki.
/collection/{id}/password
Owner only
30/min
Ustaw hasło dla kolekcji. Wymaga 4–100 znaków.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
password | string · required | 4–100 znaków. |
/collection/{id}/password
Owner only
30/min
Usuń hasło z kolekcji.
/collection/{id}/verify-password
10/min
Sprawdź hasło. Zwraca 200 w razie powodzenia, 401 w przypadku niepoprawnego hasła.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
password | string · required |
/collection/{id}/expiry
Owner only
30/min
Zmień datę ważności kolekcji.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
days | integer · optional | Od teraz 1–7 dni. Pomij lub null dla trwałego (tylko premium). |
/collection/{id}/max-downloads
Owner only
30/min
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
Wszystkie ustawienia na poziomie pliku (hasło, wygaśnięcie, max-downloads) odzwierciedlają endpointy kolekcji. Tylko właściciel.
/file/{id}/status
120/min
Sprawdź, czy plik nadal oczekuje na przesłanie.
/file/{id}
Owner only
60/min
Natychmiast usuń plik.
/file/{id}/thumbnail
Owner only
120/min
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. |
/file/{id}/password
Owner only
30/min
Ustaw hasło dla pliku. Wymaga 4–100 znaków.
/file/{id}/password
Owner only
30/min
Usuń hasło pliku.
/file/{id}/verify-password
10/min
Zweryfikuj hasło pliku.
/file/{id}/expiry
Owner only
30/min
Zmień datę ważności pliku.
Treść żądania
| Pole | Typ | Opis |
|---|---|---|
days | integer · optional | Od teraz 1–7 dni. Pomij lub null dla trwałego (tylko premium). |
/file/{id}/max-downloads
Owner only
30/min
Ogranicz łączną liczbę pobrań pliku. Usuwa się automatycznie po osiągnięciu limitu.
Upload ShareX
Endpoint do jednorazowego przesyłania — wyślij plik multipart, a w odpowiedzi dostaniesz udostępniany adres URL. Bez zabawy w init/confirm. Idealne dla narzędzi do zrzutów ekranu. Pełna instrukcja konfiguracji na /pl/docs/sharex.
Uwierzytelnianie na komputerze
Dla uwierzytelnionych klientów (np. aplikacji desktopowej) posiadających token Sanctum.
/user
Bearer token
Zwróć uwierzytelnionego użytkownika.
/auth/logout
Bearer token
Unieważnij bieżący token dostępu.
Różne
/health
Test kondycji. Wysyła ping do bazy danych, magazynu R2 i cache Redis. Zwraca 200, jeśli wszystko działa (zielone), w przeciwnym razie 503.
/activity
Na żywo: strumień aktywności dla globu na stronie głównej. Buforowane na krawędzi Cloudflare.
/bandwidth/status
60/min
Bieżące wykorzystanie limitu uploadu dla wywołującego — używane przez CLI i aplikację desktopową do pokazania pozostałej pojemności. Format odpowiedzi różni się dla użytkowników uwierzytelnionych. Mimo nazwy URL, to śledzi tylko upload bajty; pobrania nie są liczone.
/app-analytics
120/min
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. |
/app-errors
60/min
Wyślij raport błędu z poziomu CLI lub aplikacji desktopowej. Usuwanie duplikatów 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. |