REST API
HTTPでファイルをアップロードし、コレクションを作成し、共有を管理します。すべてのレスポンスはJSONです。匿名アップロードにはAPIキーは不要です。
アップロードの仕組み
storage.to の API が、CLI、デスクトップアプリ、Web アップローダー、そしてあなたが作りたい任意のサードパーティークライアントを支えています。 アップロードの流れは3ステップです:
PUT は、バイトを直接プリサインドURL(複数可)へ送ります。バイトは当社のサーバーを経由しません。File のレコードを作成し、共有可能なURLをお渡しします。以下のエンドポイントはすべて、このベースに対する相対です。例:POST /upload/init は POST https://storage.to/api/upload/init を意味します。
認証
匿名アップロードは認証なしで利用できますが、厳しい制限があります。 キーなしの呼び出しは、デバイスまたはIPごとに直近24時間あたり50ファイルまでに制限され、さらに以下の帯域幅クォータが適用されます。ファイルは3日後に期限切れになります。
無料アカウントで認証すると、次の機能が使えます:
- 1日のファイル数上限なし
- アップロード帯域の制限なし
- アカウントに紐づくアップロード(/dashboard で表示)
- プレミアム機能(永続ファイル、より大きなストレージ)
- 訪問者トークンの一致が不要な、所有権ベースの変更(削除、パスワード設定、有効期限の変更)
制限の一覧
expiry_days で最大7日expiry_days で最大7日月間の割り当てはありません。すべての制限は24時間のローリングウィンドウか毎分のレート制限です。 無料プランには固定のストレージ容量はありません。各ファイルは自動的に期限切れになるため、割り当てに対して何も蓄積されません。
所有権の証明
/upload/init multipart、/upload/confirm、/file/reserve、/collection)は、それぞれレスポンスに owner_token を返します。このトークンは、その特定のリソースに紐づいた署名付きの所有権証明であり、IPや訪問者トークンとは独立しています。 トークンはリソースが存在する限り有効で、保存しても安全で、単独で期限切れになることはありません。トークンを紛失すると、そのリソース(ファイル/コレクション/アップロード)の管理権限を失うことになります。ローカルのパスワードのように扱ってください。# または、Bearer セッションと併用
X-Owner-Token: <token>
visitor_token クッキーに自動的に保存されます。CLI では ~/.config/storageto/token に保存します(CLIドキュメント を参照)。変更系エンドポイント(削除、パスワード設定、有効期限変更)では、どちらか 訪問者トークンが一致する または リクエストがファイルを作成したのと同じIPから来ている場合に所有権が確認されます。どちらも失われる可能性があります(Cookie削除、ネットワーク変更)。今後は オーナートークン を最も確実な証明として使うのがおすすめです。
エラー
エラーは次のような形式で返されます: { "success": false, "error": "…" }
レート制限
レート制限はすべてIP単位です。429 のレスポンスには、標準の Retry-After、X-RateLimit-Limit、X-RateLimit-Remaining ヘッダーが含まれます。
アップロードクォータ: 匿名クライアントには、並行して動作する 2 つの上限があります - 1 訪問者トークン あたり 100 GB / 24時間 と IPあたり 500 GB / 24時間(IP の上限はトークンなしの通信や共有ネットワークを検知します)。どちらかが超過すると、詳細付きの 429 が返ります。これは アップロード のクォータのみです - ダウンロードは無制限で、制限(スロットリング)もありません。
アップロード
8 件のエンドポイント5GB超のファイルを含む、あらゆるファイルのための3ステップのアップロード手順(自動的にマルチパート)。スクリーンショットのような手軽なアップロードだけ必要なら、代わりに ShareX を見てください。
アップロードを開始します。50MBを超えるファイルの場合、レスポンスはマルチパートアップロードになります(type: "multipart" フィールド)。それ以外は、単一のプリサインド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をリクエストします。/init が返したURLが、用意しているパート数より少ない(または期限切れになった)場合に使用します。
リクエストボディ
| 項目 | 種類 | 説明 |
|---|---|---|
upload_id | string · required | /init からの upload_id。 |
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://..." } ] }
すべてのパートがアップロードされたら、マルチパートアップロードを完了します。
リクエストボディ
| 項目 | 種類 | 説明 |
|---|---|---|
upload_id | string · required | /init からの upload_id。 |
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 }
マルチパートアップロードをキャンセルし、途中データをクリーンアップします。
リクエストボディ
| 項目 | 種類 | 説明 |
|---|---|---|
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 | /init からの r2_key。 |
collection_id | string · optional | コレクションに追加します。 |
crc32 | integer · optional | 整合性確認のためのCRC32チェックサム。 |
file_id | string(9) · optional | 以前の 予約済み ファイル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_..." }
バイトが準備できる 前 の時点で、ファイルIDと共有可能なURLを予約します。先にリンクを渡してから、後でアップロードを完了させたいときに便利です。所有権は「訪問者トークン + 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 のバッチ相当で、Webアップローダー向けに最適化されています。1回の往復で最大250ファイルを開始します。
Webアップローダー内部で使用します。ほとんどのクライアントは、単一ファイルの /upload/init を優先してください。
/upload/confirm のバッチ相当です。1回の往復で多数のファイルを確認します。
コレクション
9 件のエンドポイントコレクションは、単一の共有URL(/c/{id})配下に複数のファイルをまとめます。最大10,000ファイル、合計25GBまで。
新しいコレクションを作成します。後から /upload/confirm の collection_id を渡してファイルを追加します。
リクエストボディ
| 項目 | 種類 | 説明 |
|---|---|---|
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 件のエンドポイントファイル単位のすべての設定(パスワード、有効期限、最大ダウンロード数)は、コレクションのエンドポイントと同じです。所有者のみ。
ファイルのアップロードがまだ完了していないか確認します。
{ "pending": false }
ファイルをすぐに削除します。
動画または画像ファイルのサムネイル画像をアップロードします(ダウンロードページで使用)。最大2MB。
リクエストボディ
| 項目 | 種類 | 説明 |
|---|---|---|
thumbnail | image · required | マルチパートアップロード。最大2MB。 |
{ "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 }
現在のアクセストークンを無効化します。
その他
5 件のエンドポイントヘルス、クォータ、クライアントのテレメトリ。
稼働確認。API ワーカーが稼働中であれば 200 と { "status": "ok" } を返します。
{ "status": "ok" }
ホームページのグローブ用のライブアクティビティストリーム。エッジでキャッシュされます。
呼び出し元の現在のアップロードクォータ使用量 - 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またはデスクトップアプリから利用イベントを送信します。
リクエストボディ
| 項目 | 種類 | 説明 |
|---|---|---|
app | string · required | desktop、cli、または web。 |
version | string · optional | クライアントのバージョン。 |
event | string · required | イベント名(例: upload_complete)。 |
context | object · optional | 追加メタデータ。 |
CLI またはデスクトップアプリからエラーレポートを送信してください。サーバー側で重複を除外します - 同じエラーは 1 時間あたり最大 10 件までです。
リクエストボディ
| 項目 | 種類 | 説明 |
|---|---|---|
app | string · required | desktop、cli、または web。 |
type | string · required | エラーのクラス/タイプ。 |
message | string · required | エラーメッセージ。 |
stack | string · optional | スタックトレース。 |
version, os, os_version, arch, context | various · optional | 診断用メタデータ。 |