開発者向けドキュメント

MiniPic は 2 つの API レイヤーを提供します:互換レイヤー(認証とレスポンス構造が主要な圧縮 API と互換 — エンドポイントとキーを差し替えるだけで組み込み)とネイティブレイヤー(/v1/*、同期圧縮と利用状況の照会)です。支払うのは成功した圧縮のみ、毎月最初の 500 回は無料、すべてのレスポンスに利用状況のヘッダーが付き、請求は 1 行ずつ照合できます。

安定性の約束:/shrink/v1 の破壊的変更は 90 日前に告知します。

クイックスタート

30 秒で最初の画像を圧縮:コンソールで API キーを作成し、リクエストを送信します。

# PNG を圧縮(Basic 認証、ユーザー名は api 固定) curl -s --user api:YOUR_API_KEY \ --data-binary @input.png \ -o output.png \ https://api.minipic.ai/v1/compress

結果は、キーの保有者であるあなただけがアクセスできる暗号化されたプライベートリンクで返されます — 画像は今回の圧縮にのみ使用し、全体を通じて暗号化され、外部に漏れることはなく、学習やその他のいかなる用途にも一切使用しません。

認証

  • HTTP Basic(主要な圧縮 API と互換):ユーザー名は api 固定、パスワードはご自身の API キー — Authorization: Basic base64("api:KEY")
  • Bearer(ネイティブレイヤーに推奨):Authorization: Bearer KEY

キーのプレフィックスは mp_live_(本番)と mp_test_(サンドボックス)です。サーバーはキーのハッシュのみを保存し、完全なキーは作成時に一度だけ表示されます。アカウントごとに最大 5 個まで保持できます。認証失敗は原因を区別せず常に 401 を返します(列挙を防ぐため)。

POST /shrink 画像を圧縮

リクエストボディは次の 2 つのいずれかです:生のバイナリ画像(PNG / JPEG / WebP / HEIC / GIF / BMP / TIFF / AVIF)、またはソース URL を指定する JSON(公開された http/https のアドレスのみ、取得タイムアウトは 10 秒)。出力形式を指定しない場合は元の形式が維持されます:PNG / JPEG / WebP / GIF / TIFF / AVIF は元の形式で出力(AVIF→AVIF、TIFF→TIFF)、HEIC は JPEG に変換、そのままでは圧縮できない BMP は PNG に変換されます。GIF はデフォルトで可逆最適化(GIF のまま)され、さらに節約するために WebP に変換することもできます。

# オプション 1:バイナリを直接アップロード curl -s --user api:YOUR_API_KEY \ --data-binary @input.png \ https://api.minipic.ai/shrink
# オプション 2:サーバーに URL を取得させる curl -s --user api:YOUR_API_KEY \ -H "Content-Type: application/json" \ -d '{"source": {"url": "https://example.com/input.png"}}' \ https://api.minipic.ai/shrink

成功すると 201 Created を返し、レスポンスヘッダーには Location(結果のアドレス)と Compression-Count(今月の課金対象枚数)が含まれます:

{ "input": { "size": 207565, "type": "image/png" }, "output": { "size": 63274, "type": "image/png", "width": 1280, "height": 720, "ratio": 0.3049, "url": "https://api.minipic.ai/output/{id}" } }

GET /output/{id} 結果をダウンロード

認証が必要で、圧縮結果のバイナリを返します。結果は暗号化されたプライベートリンクで配信され、リンクの有効期限が切れると 404 OutputExpired を返すので、再圧縮して再取得できます。同じ結果の再ダウンロードには課金されません。

POST /output/{id} 派生操作

圧縮結果に対して resize / convert / preserve を実行します。各派生出力は 1 枚としてカウントされます:

# 幅 800px に比率を保って縮小し、WebP に変換 curl -s --user api:YOUR_API_KEY \ -H "Content-Type: application/json" \ -d '{"resize": {"method": "scale", "width": 800}, "convert": {"type": "image/webp"}}' \ -o thumb.webp \ https://api.minipic.ai/output/{id}
  • resize.methodscale(片側を基準に比率保持)/ fit(全体を収める)/ cover(切り抜いて埋める、現在は中央切り抜き)
  • convert.typeimage/webpimage/pngimage/jpeg の間で変換
  • preservecopyright / creation / location のメタデータを保持
現在の制限(組み込み前にお読みください):thumb スマートサムネイルはまだ利用できません(501 NotImplemented を返します)。cover は中央切り抜きです(スマートな被写体検出は予定中)。AVIF 出力には対応していません。S3/GCS への直接 store アップロードには対応していません(オブジェクトストレージへの直接アップロードは予定中)。

POST /v1/compress 同期圧縮(ネイティブレイヤー)

1 回のリクエストで圧縮結果のバイナリを直接返し、往復を省きます — CI に便利です:

# 品質プリセットと出力形式はクエリパラメーターで設定 curl -s -H "Authorization: Bearer YOUR_API_KEY" \ --data-binary @input.jpg \ -o output.jpg \ "https://api.minipic.ai/v1/compress?quality=smart&format=keep"
  • qualitysmart(デフォルト)/ high / extreme / 1-100
  • formatkeep(元の形式を維持)/ webp
  • レスポンスヘッダー:X-Input-Size / X-Output-Size / X-Ratio / Compression-Count

GET /v1/usage 利用状況の照会

今月の枚数、残りの無料枠、残りのリソースパック残高を返します — コンソールと同一です:

{ "month": "2026-06", "compressed": 1234, "free_quota": { "total": 500, "used": 500 }, "bundles": [ { "id": "...", "total": 10000, "remaining": 5210 } ], "pay_as_you_go": { "count": 734, "estimated_amount_cny": "36.70" }, "rate_limit": { "rps": 10, "burst": 20 } }

枠とレート制限

  • レート:キーあたり 10 req/s、バースト 20(トークンバケット)。超過すると 429 + Retry-After を返します
  • 同時実行:キーあたりの処理中タスク <= 20
  • 毎月の無料枠:アカウントあたり 500 枚/月。使い切って支払い登録がない場合、429 AccountLimitReached を返します
  • ファイルあたり:無料は 5 MB、有料は 80 MB、Enterprise はカスタマイズ可
  • ピクセル:<= 1 億ピクセル。超過すると 422 ImageTooComplex を返します

すべての従量制エンドポイントのレスポンスヘッダー:Compression-CountX-RateLimit-LimitX-RateLimit-RemainingX-RateLimit-Reset

課金

  • POST /shrink 成功(201):1 枚としてカウント
  • POST /v1/compress 成功(200):1 枚としてカウント
  • GET /output/{id} 再ダウンロード:課金なし
  • POST /output/{id} 派生操作の成功:1 回ごとに 1 枚としてカウント
  • 4xx / 5xx、コンテンツ審査によるブロック、URL 取得失敗:課金なし。再試行が成功した場合は成功した呼び出しのみカウント

消費の順序:プランの月次枠 → リソースパック(購入が早いものから、有効期限なし)。前払い制で、従量制の月次請求はありません — 枠を使い切ると一時停止し、リソースパックを購入すると再開します。

AI / Skill 連携

MiniPic は公式の Agent Skillminipic-compress)を提供しています。インストールすれば、Anthropic Agent Skills オープン標準に対応した任意の AI エージェント(Claude Code / Cursor / Codex CLI / Copilot CLI など)に「このフォルダの画像を圧縮して」のように伝えるだけで、自動的に MiniPic API を呼び出して圧縮、WebP への変換、バッチ処理を行い、圧縮率を報告します — curl やリトライ処理を手書きする必要はありません。

インストール

次のいずれかを選んでください(3 つの方法):

# オプション 1:skills.sh 経由(npx、推奨) npx skills add minipic/minipic-skill
# オプション 2:gh skill 経由 gh skill install minipic/minipic-skill
# オプション 3:手動で skills ディレクトリに配置(Claude Code のユーザー / プロジェクトレベル) cp -r minipic-compress ~/.claude/skills/ # またはプロジェクトレベル:cp -r minipic-compress <your-project>/.claude/skills/

Agent Skills 標準に対応する他のエージェント(Cursor / Codex CLI / Copilot CLI など)では、各ドキュメントに従って minipic-compress/ ディレクトリを対応する skills のパスに配置してください。

API キーを設定

キューは環境変数からのみ読み取られ、ハードコードもエコーも一切されません。コンソールでキーを作成したら、環境に設定してください:

# 必須:あなたの API キー(アカウントあたり 500 枚/月の無料) export MINIPIC_API_KEY=mp_live_your_key # 任意:API のベース URL を上書き(デフォルト https://api.minipic.ai) # export MINIPIC_API_BASE=https://api.minipic.ai

範囲とトリガーの例

次のような意図を伝えると、Skill が自動的にトリガーされます:

  • 「この画像 / このフォルダの画像を圧縮して」
  • 「hero.png を WebP に変換して、できるだけ小さくして」
  • 「これらの画像は大きすぎる — パッケージ化の前にまとめて最適化して、どれだけ削減できたか教えて」

機能:単一ファイル / フォルダのバッチ / リモート URL の圧縮、PNG・JPEG・WebP・GIF 間の変換、品質プリセット(smart / high / extreme)の選択、削減率の自動計算と報告、429 レート制限時の自動バックオフ再試行。

VS Code 拡張機能

公式の MiniPic Image Compression 拡張機能を使えば、curl を手書きすることなく、エディター内でワークスペースの画像を直接圧縮できます。MiniPic の自社開発エンジン搭載です。PNG / JPEG / WebP / GIF / AVIF / TIFF に対応し、圧縮しながら形式を変換(WebP / AVIF などに変換してさらに節約)でき、VS Code、Cursor などの互換エディターで動作します。

インストール

次のいずれかを選んでください:

  • VS Code の拡張機能パネル(⇧⌘X)で MiniPic を検索してインストールをクリック。
  • またはコマンドパレットから ext install minipic.minipic-vscode を実行。
  • または Visual Studio Marketplace の拡張機能ページを開いてインストールをクリック。

API キーを設定

コンソールでキー(mp_live_ で始まる)を作成したら、コマンドパレット(⇧⌘P)から MiniPic: Set API Key を実行して貼り付けます。キーは VS Code の SecretStorage に安全に保存され、平文の設定に書き込まれることも settings.json で同期されることも一切ありません

使い方

  • 右クリックで圧縮:エクスプローラーで画像やフォルダを選び(単一、複数選択、またはディレクトリ全体を再帰的に)→ 右クリックして MiniPic: Compress Images で、現在の品質と形式の設定を使ってその場で圧縮します。
  • WebP に変換して参照を更新:右クリックして MiniPic: Convert to WebP and Update References で WebP に変換し、ワークスペース全体のその画像への参照を自動で更新します。
  • 自動圧縮:有効にすると、ワークスペースの新規 / 変更された画像を監視して自動で圧縮します(枠を消費するためデフォルトはオフ)。ステータスバーまたは MiniPic: Toggle Auto-Compress で切り替えます。
  • 利用状況を表示MiniPic: View Usage を実行すると、今月の圧縮枚数、無料残高、利用見積もりが見られます — コンソールと同一です。

主な設定

設定デフォルト説明
minipic.qualitysmart品質プリセット:smart / high / extreme / lossless
minipic.formatkeep出力形式:keep / png / jpeg / webp / gif / avif / tiff
minipic.skipIfLargertrue同じ形式での圧縮で逆に大きくなる場合は、スキップして元ファイルを上書きしない
minipic.keepOriginalOnConverttrue形式を変換するときに元ファイルを残す
minipic.maxFileSizeMB80このサイズより大きいファイルはスキップして 413 を回避
minipic.baseUrlhttps://api.minipic.aiAPI サービスのアドレス。セルフホスト時はご自身のゲートウェイに変更
この拡張機能は同じ画像圧縮 API に対して課金されます — 成功した圧縮 1 枚が 1 枚としてカウントされ、同じ毎月の無料枠が適用されます。利用状況はコンソールと同一です。ソースは GitHub にあります。

エラーコード

エラーボディは主要な圧縮 API の慣例に従います:{"error": "code", "message": "人間が読める説明"}。フィールドは追加のみで、削除されることはありません。

HTTPerror発生条件説明
400BadRequestEmpty body, invalid JSON, or out-of-range parametersSomething was off with this request, so the image was not compressed. Try again, and contact [email protected] if it keeps happening.
400InputMissingRequest body has no image contentThis file is empty, so there is nothing to compress. Check the file and upload it again.
401UnauthorizedMissing, invalid, or disabled keyThis API key is invalid or disabled. Double-check the key, or create a new one in the console.
403AccountSuspendedAccount banned or overdueThis account has been suspended. Contact [email protected] if you think this is a mistake.
404NotFoundWrong pathWe could not find what you requested. Check that the link is correct.
404OutputExpiredResult private link has expiredThis private result link has expired and can no longer be opened. Upload the image again to recompress it.
413PayloadTooLargeExceeds the plan's per-file size limitThis image is over the 5 MB per-file limit on the free plan. Upgrade to Pro to compress files up to 80 MB.
415UnsupportedMediaTypeInput is not a supported image formatThis format is not supported yet. We currently support PNG, JPEG, WebP, HEIC, GIF, BMP, TIFF and AVIF.
422DecodeErrorCorrupt file or spoofed extensionWe could not decode this image: the file may be corrupted or not a valid image. Check it and upload again.
422ImageTooComplexExceeds the 100-megapixel limitThis image is over the 100-megapixel processing limit. Resize it smaller and try again.
422ContentBlockedBlocked by content safety screening (not billed)This image did not pass our content safety check. It was blocked and permanently deleted, and was not counted against your usage. If you believe this is a mistake, contact [email protected].
429TooManyRequestsRate or concurrency limit exceeded (with Retry-After)Too many requests right now, so this image could not be queued. Wait a moment and try again.
429AccountLimitReachedFree quota used up and no payment on file (with upgrade_url)You have used up today's free quota. Sign in to remove the daily limit (1,000 images per month); Pro raises the per-file limit to 80 MB.
500InternalServerErrorService error (with request_id)Something went wrong on our side and this image was not compressed. Please try again shortly.
501NotImplementedCapability not yet available (such as resize thumb)This feature is not available yet. Watch the developer docs for updates.
503ServiceUnavailableOverloaded or under maintenance (with Retry-After)The service is busy and this image was not compressed. Please try again shortly.