リファレンス

REST API

HTTPでファイルをアップロードし、コレクションを作成し、共有を管理します。すべてのレスポンスはJSONです。匿名アップロードにはAPIキーは不要です。

ベースURLhttps://storage.to/api
33 件のエンドポイント · JSON

アップロードの仕組み

storage.to の API が、CLI、デスクトップアプリ、Web アップローダー、そしてあなたが作りたい任意のサードパーティークライアントを支えています。 アップロードの流れは3ステップです:

01 · POST /upload/init
初期化
アップロードしたいファイルを伝えてください。当社のストレージエッジを指す、1つ以上の署名済みURLを返します。
02 · PUT {upload_url}
アップロード
PUT は、バイトを直接プリサインドURL(複数可)へ送ります。バイトは当社のサーバーを経由しません。
03 · POST /upload/confirm
確認
アップロードが完了したことを伝えてください。File のレコードを作成し、共有可能なURLをお渡しします。

以下のエンドポイントはすべて、このベースに対する相対です。例:POST /upload/init は POST https://storage.to/api/upload/init を意味します。

認証

匿名アップロードは認証なしで利用できますが、厳しい制限があります。 キーなしの呼び出しは、デバイスまたはIPごとに直近24時間あたり50ファイルまでに制限され、さらに以下の帯域幅クォータが適用されます。ファイルは3日後に期限切れになります。

無料アカウントで認証すると、次の機能が使えます:

  • 1日のファイル数上限なし
  • アップロード帯域の制限なし
  • アカウントに紐づくアップロード(/dashboard で表示)
  • プレミアム機能(永続ファイル、より大きなストレージ)
  • 訪問者トークンの一致が不要な、所有権ベースの変更(削除、パスワード設定、有効期限の変更)

制限の一覧

トークンなし(匿名)
無料アカウントのトークン
有料アカウントのトークン
1日あたりのファイル数
50 / 24 時間
無制限
無制限
アップロード帯域
100 GB / 24 時間 (500 GB IPごと)
無制限
無制限
最大ファイルサイズ
25 GB
25 GB
100 GB
ファイルの有効期限
デフォルトは3日、expiry_days で最大7日
デフォルトは3日、expiry_days で最大7日
なし(ファイルは永久保存)
ストレージ容量
なし(ファイルは期限切れになります)
なし(ファイルは期限切れになります)
プランに応じて 100 GB - 1 TB を永久保存
プランを見る →

月間の割り当てはありません。すべての制限は24時間のローリングウィンドウか毎分のレート制限です。 無料プランには固定のストレージ容量はありません。各ファイルは自動的に期限切れになるため、割り当てに対して何も蓄積されません。

認証するには、アカウントから個人用APIトークンを生成し、すべてのリクエストでベアラートークンとして送信してください: サインインが必要です。トークンの全文は作成時に1回だけ表示されるので、安全な場所にコピーしてください。同じページからいつでもトークンを無効化できます。 APIトークンを生成 →
Authorization: Bearer <token>

所有権の証明

オーナートークンおすすめ
リソース作成系エンドポイント(/upload/init multipart、/upload/confirm、/file/reserve、/collection)は、それぞれレスポンスに owner_token を返します。このトークンは、その特定のリソースに紐づいた署名付きの所有権証明であり、IPや訪問者トークンとは独立しています。 トークンはリソースが存在する限り有効で、保存しても安全で、単独で期限切れになることはありません。トークンを紛失すると、そのリソース(ファイル/コレクション/アップロード)の管理権限を失うことになります。ローカルのパスワードのように扱ってください。
Authorization: Owner <token>
# または、Bearer セッションと併用
X-Owner-Token: <token>
ビジタートークン
匿名クライアントには、アカウントなしで自分のアップロードを所有していることを証明する方法が必要です。そこで 訪問者トークン を使います。これはクライアントが一度だけ生成して再利用するランダムな文字列です。毎回のリクエストに添えて送ってください: Web では、トークンは visitor_token クッキーに自動的に保存されます。CLI では ~/.config/storageto/token に保存します(CLIドキュメント を参照)。
X-Visitor-Token: <random-string>

変更系エンドポイント(削除、パスワード設定、有効期限変更)では、どちらか 訪問者トークンが一致する または リクエストがファイルを作成したのと同じIPから来ている場合に所有権が確認されます。どちらも失われる可能性があります(Cookie削除、ネットワーク変更)。今後は オーナートークン を最も確実な証明として使うのがおすすめです。

エラー

エラーは次のような形式で返されます: { "success": false, "error": "…" }

200OK。
201作成しました。
400不正なリクエストです(例:コレクションのサイズ上限を超過)。
401パスワードが必要、またはパスワードが正しくありません。
403認証されていません(リソースの所有者ではありません)。
404リソースが見つからないか、有効期限が切れています。
422バリデーションに失敗したか、プラン/クォータの制限があります。
429レート制限に達したか、アップロードクォータに到達しました。
500サーバーエラーです。ステータス を確認してください。

レート制限

レート制限はすべてIP単位です。429 のレスポンスには、標準の Retry-After、X-RateLimit-Limit、X-RateLimit-Remaining ヘッダーが含まれます。

アップロード初期化 / 確認 / 中止60 / 分
マルチパート完了500 / 分
マルチパートのパートURL120 / 分
一括初期化 / 確認500 / 分
ステータスのポーリング(ファイル & コレクション)120 / 分
設定(パスワード、有効期限、最大ダウンロード数)30 / 分
パスワードの確認10 / 分
コレクション作成30 / 分
管理(準備完了、削除)60 / 分
サムネイルのアップロード120 / 分
ShareXアップロード20 / 日
アプリの分析 / エラー1分あたり120回と60回

アップロードクォータ: 匿名クライアントには、並行して動作する 2 つの上限があります - 1 訪問者トークン あたり 100 GB / 24時間 と IPあたり 500 GB / 24時間(IP の上限はトークンなしの通信や共有ネットワークを検知します)。どちらかが超過すると、詳細付きの 429 が返ります。これは アップロード のクォータのみです - ダウンロードは無制限で、制限(スロットリング)もありません。

アップロード

8 件のエンドポイント

5GB超のファイルを含む、あらゆるファイルのための3ステップのアップロード手順(自動的にマルチパート)。スクリーンショットのような手軽なアップロードだけ必要なら、代わりに ShareX を見てください。

POST/upload/init60/min

アップロードを開始します。50MBを超えるファイルの場合、レスポンスはマルチパートアップロードになります(type: "multipart" フィールド)。それ以外は、単一のプリサインドPUTです。

リクエストボディ

項目種類説明
filenamestring · required元のファイル名。最大255文字。
content_typestring · requiredMIMEタイプ。
sizeinteger · requiredバイト単位のファイルサイズ。最小1。
Request
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
  }'
Response · single upload
{
  "success": true,
  "type": "single",
  "upload_url": "https://r2.cloudflarestorage.com/...signed...",
  "headers": { "Host": ["..."] },
  "r2_key": "uuid-abc123"
}
Response · multipart
{
  "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_..."
}
POST/upload/parts所有者のみ120/min

進行中のマルチパートアップロードに対して、追加のパートURLをリクエストします。/init が返したURLが、用意しているパート数より少ない(または期限切れになった)場合に使用します。

リクエストボディ

項目種類説明
upload_idstring · required/init からの upload_id。
part_numbersarray<int> · requiredURLを取得するパート番号。
Request
curl -X POST https://storage.to/api/upload/parts \
  -H "Content-Type: application/json" \
  -d '{
    "upload_id": "01HXYZ...",
    "part_numbers": [3, 4]
  }'
Response
{
  "success": true,
  "part_urls": [
    { "partNumber": 3, "url": "https://..." },
    { "partNumber": 4, "url": "https://..." }
  ]
}
POST/upload/complete-multipart所有者のみ500/min

すべてのパートがアップロードされたら、マルチパートアップロードを完了します。

リクエストボディ

項目種類説明
upload_idstring · required/init からの upload_id。
partsarray · required各エントリ:パートアップロードのレスポンスからの { partNumber, etag }。
Request
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...\"" }
    ]
  }'
Response
{ "success": true }
POST/upload/abort所有者のみ60/min

マルチパートアップロードをキャンセルし、途中データをクリーンアップします。

リクエストボディ

項目種類説明
upload_idstring · required中止するアップロード。
Request
curl -X POST https://storage.to/api/upload/abort \
  -H "Content-Type: application/json" \
  -d '{ "upload_id": "01HXYZ..." }'
POST/upload/confirm60/min

アップロードが完了したことを確認します。ここで File レコードを作成し、共有可能なURLを返します。

リクエストボディ

項目種類説明
filenamestring · required元のファイル名。
sizeinteger · requiredバイト単位のファイルサイズ。
content_typestring · requiredMIMEタイプ。
r2_keystring · required/init からの r2_key。
collection_idstring · optionalコレクションに追加します。
crc32integer · optional整合性確認のためのCRC32チェックサム。
file_idstring(9) · optional以前の 予約済み ファイルIDを満たします。
Request
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"
  }'
Response
{
  "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_..."
}
POST/file/reserve60/min

バイトが準備できる 前 の時点で、ファイルIDと共有可能なURLを予約します。先にリンクを渡してから、後でアップロードを完了させたいときに便利です。所有権は「訪問者トークン + IP」に紐づきます。アップロードは後で /upload/init + /upload/confirm で完了し、確認時に file_id を渡してください。

リクエストボディ

項目種類説明
filenamestring · optionalプレースホルダーのファイル名。デフォルトは "Pending" です。
content_typestring · optionalプレースホルダーのMIMEタイプ。
Request
curl -X POST https://storage.to/api/file/reserve \
  -H "X-Visitor-Token: abc123"
Response
{
  "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まで。

POST/collection30/min

新しいコレクションを作成します。後から /upload/confirm の collection_id を渡してファイルを追加します。

リクエストボディ

項目種類説明
expected_file_countinteger · optional想定しているすべてのファイルが確認されたら、コレクションを自動的に「準備完了」にするためのヒント。
Request
curl -X POST https://storage.to/api/collection \
  -H "Content-Type: application/json" \
  -H "X-Visitor-Token: abc123" \
  -d '{ "expected_file_count": 3 }'
Response
{
  "success": true,
  "collection": {
    "id": "ABC123xyz",
    "url": "https://storage.to/c/ABC123xyz",
    "expires_at": "2026-04-15T12:00:00Z"
  },
  "owner_token": "owner_v1_..."
}

コレクションの状態をポーリングします。あわせて、想定しているすべてのファイルが確認されたらコレクションを自動的に「準備完了」にします。

Request
curl https://storage.to/api/collection/ABC123xyz/status
Response
{
  "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"
}
POST/collection/{id}/ready所有者のみ60/min

コレクションをダウンロード可能としてマークします。通常は不要です - expected_file_count に到達するとコレクションは自動でダウンロード準備完了になります。

DELETE/collection/{id}所有者のみ60/min

コレクションとそのすべてのファイルを削除します。

POST/collection/{id}/password所有者のみ30/min

コレクションにパスワードを設定します。4〜100文字が必要です。

リクエストボディ

項目種類説明
passwordstring · required4〜100文字。
Request
curl -X POST https://storage.to/api/collection/ABC123xyz/password \
  -H "X-Visitor-Token: abc123" \
  -d '{ "password": "hunter22" }'
DELETE/collection/{id}/password所有者のみ30/min

コレクションからパスワードを削除します。

パスワードを確認します。成功時は 200、不正なパスワードの場合は 401 を返します。

リクエストボディ

項目種類説明
passwordstring · required
POST/collection/{id}/expiry所有者のみ永久保存: 有料30/min

コレクションの有効期限を変更します。

リクエストボディ

項目種類説明
daysinteger · optional今から1〜7日後。ただしアップロードから7日後(現在の有効期限の方が遅い場合はその日時)より後にはなりません。省略または null で無期限(プレミアムのみ)。
POST/collection/{id}/max-downloads所有者のみ30/min

ダウンロード上限を設定します(burn-after-N-downloads)。上限に達するとコレクションは自動削除されます。

リクエストボディ

項目種類説明
max_downloadsinteger · optional1〜1000。現在のダウンロード数を上回る必要があります。上限を外すには null。

ファイル

8 件のエンドポイント

ファイル単位のすべての設定(パスワード、有効期限、最大ダウンロード数)は、コレクションのエンドポイントと同じです。所有者のみ。

ファイルのアップロードがまだ完了していないか確認します。

Response
{ "pending": false }
DELETE/file/{id}所有者のみ60/min

ファイルをすぐに削除します。

POST/file/{id}/thumbnail所有者のみ120/min

動画または画像ファイルのサムネイル画像をアップロードします(ダウンロードページで使用)。最大2MB。

リクエストボディ

項目種類説明
thumbnailimage · requiredマルチパートアップロード。最大2MB。
Response
{
  "success": true,
  "thumbnail_url": "https://..."
}
POST/file/{id}/password所有者のみ30/min

ファイルにパスワードを設定します。4〜100文字が必要です。

DELETE/file/{id}/password所有者のみ30/min

ファイルのパスワードを削除します。

ファイルのパスワードを確認します。

POST/file/{id}/expiry所有者のみ永久保存: 有料30/min

ファイルの有効期限を変更します。

リクエストボディ

項目種類説明
daysinteger · optional今から1〜7日後。ただしアップロードから7日後(現在の有効期限の方が遅い場合はその日時)より後にはなりません。省略または null で無期限(プレミアムのみ)。
POST/file/{id}/max-downloads所有者のみ30/min

ファイルの総ダウンロード数に上限を設定します。上限に達すると自動削除されます。

ShareXアップロード

1 件のエンドポイント

ワンショットのアップロードエンドポイント - multipart ファイルを送ると、共有できる URL が返ってきます。初期化/確認の手順は不要です。スクリーンショットツールに最適です。完全なセットアップガイドは /docs/sharex。

POST/sharex/upload20/day

画像またはファイルを直接アップロードします(multipart form、file フィールド)。最大25MB。

Request
curl -X POST https://storage.to/api/sharex/upload \
  -F "file=@screenshot.png"
Response
{
  "success": true,
  "url": "https://storage.to/FQxyz1234",
  "filename": "screenshot.png",
  "expires_at": "2026-04-15T12:00:00Z"
}

デスクトップ認証

2 件のエンドポイント

デスクトップアプリなど、Bearer トークンを持つサインイン済みクライアント向け。

GET/userBearer トークン

認証済みユーザーを返します。

Request
curl https://storage.to/api/user \
  -H "Authorization: Bearer <token>"
Response
{
  "id": 42,
  "name": "Ada",
  "email": "ada@example.com",
  "is_premium": true
}
POST/auth/logoutBearer トークン

現在のアクセストークンを無効化します。

その他

5 件のエンドポイント

ヘルス、クォータ、クライアントのテレメトリ。

稼働確認。API ワーカーが稼働中であれば 200 と { "status": "ok" } を返します。

Response
{ "status": "ok" }

ホームページのグローブ用のライブアクティビティストリーム。エッジでキャッシュされます。

呼び出し元の現在のアップロードクォータ使用量 - CLI とデスクトップアプリが残り容量を表示するために使います。認証済みユーザーではレスポンス形式が異なります。URL 名に反して、これは アップロード のバイト数のみを計測します。ダウンロードはカウントされません。

Response · anonymous
{
  "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
}
Response · authenticated
{
  "success": true,
  "authenticated": true,
  "plan": "premium"
}
POST/app-analytics120/min

CLIまたはデスクトップアプリから利用イベントを送信します。

リクエストボディ

項目種類説明
appstring · requireddesktop、cli、または web。
versionstring · optionalクライアントのバージョン。
eventstring · requiredイベント名(例: upload_complete)。
contextobject · optional追加メタデータ。
POST/app-errors60/min

CLI またはデスクトップアプリからエラーレポートを送信してください。サーバー側で重複を除外します - 同じエラーは 1 時間あたり最大 10 件までです。

リクエストボディ

項目種類説明
appstring · requireddesktop、cli、または web。
typestring · requiredエラーのクラス/タイプ。
messagestring · requiredエラーメッセージ。
stackstring · optionalスタックトレース。
version, os, os_version, arch, contextvarious · optional診断用メタデータ。