PhotoRestore

概要

このアプリは、同一オリジンの小さなジョブAPIを提供しています。画像をアップロードし、復元またはアップスケールのジョブを送信して、結果をポーリングします。まだAPIキーはなく、すべてのリクエストはブラウザのゲストセッションCookieの範囲に限定されます。

ベースURL
/api以下のすべてのパスはこの同一オリジンのベースからの相対パスです — 設定が必要な別のAPIホストはありません。
認証
ゲストとして続行した際に発行されるhttpOnly Cookieによってセッション単位で制御されます。APIキーはまだ存在しません(下記の「計画中」を参照)。

契約上の保証: ジョブのresult_urlは常に有効なimage_urlです — これを/api/restoreまたは/api/upscaleにそのまま送信して別の操作に連結できます(復元後の「この画像をアップスケール」は、まさにこの仕組みで動作しています)。

POST/api/uploads

画像をアップロード

画像ファイルを1つアップロードし、RestoreやUpscaleにimage_urlとして渡せる同一オリジンのアセットURLを返します。

リクエストボディ

名前必須範囲説明
filebinary (multipart/form-data)はいmultipart/form-dataとして送信される画像ファイルです。

レスポンスボディ

名前必須範囲説明
image_urlstringはい以前のアップロードで返された同一オリジンのアセットURLです — 受け付けられる唯一のimage_urlの形式です。
bytesnumberはい0–9007199254740991保存されたファイルサイズ(バイト単位)です。
mimestringはい保存されたファイルから検出されたMIMEタイプです(信頼できる値であり、クライアントが申告した値ではありません)。

201 レスポンス例

{
  "image_url": "/api/mock-assets/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  "bytes": 2458112,
  "mime": "image/jpeg"
}

コードサンプル

curl -X POST 'https://your-app.example.com/api/uploads' \
  -F "file=@photo.jpg"
POST/api/restore

復元ジョブを作成

事前にアップロードした画像に対して非同期の復元ジョブを開始します。pending状態のジョブ参照をすぐに返します — 進捗はGET /api/jobs/{job_id}でポーリングしてください。

リクエストボディ

名前必須範囲説明
image_urlstringはい/api/mock-assets/<uuid>以前のアップロードで返された同一オリジンのアセットURLです — 受け付けられる唯一のimage_urlの形式です。
user_hintstringいいえmax 300 chars写真を説明する任意の自由入力メモで、模擬解析ステップの誘導に使われます。
params.colorizebooleanはいスキーマ互換性のために必須です。値は受け付けられますが処理モードの選択には使われず、どの値でも復元パイプラインは同一です。
params.resolutionunknownはい
params.variantunknownはい

レスポンスボディ

名前必須範囲説明
job_idstringはいjob_<uuid>このジョブの一意な識別子です。
statuspending | processing | succeeded | failed | cancelledはいジョブの現在のライフサイクル状態です。

202 レスポンス例

{
  "job_id": "job_3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "pending"
}

コードサンプル

curl -X POST 'https://your-app.example.com/api/restore' \
  -H 'Content-Type: application/json' \
  -d '{  "image_url": "/api/mock-assets/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",  "user_hint": "the sky was blue",  "params": {    "colorize": true  }}'
POST/api/upscale

アップスケールジョブを作成

事前にアップロードした画像に対して、指定したモードと目標解像度で非同期のアップスケールジョブを開始します。pending状態のジョブ参照をすぐに返します。

リクエストボディ

名前必須範囲説明
image_urlstringはい/api/mock-assets/<uuid>以前のアップロードで返された同一オリジンのアセットURLです — 受け付けられる唯一のimage_urlの形式です。
user_hintstringいいえmax 300 chars写真を説明する任意の自由入力メモで、模擬解析ステップの誘導に使われます。
params.modefast | balanced | highはいアップスケールの品質と速度のトレードオフです。
params.target_megapixelsnumberはい1–64希望する出力解像度(メガピクセル)です。

レスポンスボディ

名前必須範囲説明
job_idstringはいjob_<uuid>このジョブの一意な識別子です。
statuspending | processing | succeeded | failed | cancelledはいジョブの現在のライフサイクル状態です。

202 レスポンス例

{
  "job_id": "job_3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "pending"
}

コードサンプル

curl -X POST 'https://your-app.example.com/api/upscale' \
  -H 'Content-Type: application/json' \
  -d '{  "image_url": "/api/mock-assets/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",  "params": {    "mode": "fast",    "target_megapixels": 12  }}'
GET/api/jobs/{job_id}

ジョブのステータスを取得

ジョブの現在の状態(status、progress)を返し、succeededになると、ダウンロードするか新しいimage_urlとして再送信できるresult_urlを返します。

レスポンスボディ

名前必須範囲説明
job_idstringはいjob_<uuid>このジョブの一意な識別子です。
typerestore | upscaleはいこのジョブを作成したツールです。
statuspending | processing | succeeded | failed | cancelledはいジョブの現在のライフサイクル状態です。
progressnumberはい0–100完了率(0〜100)です。
result_urlstringいいえジョブが成功すると存在します — 新しいimage_urlとしても送信できる同一オリジンのアセットURLです。
result_urls.lightstringはい
result_urls.strongstringいいえ
before_urlstringいいえ
error.codeINVALID_REQUEST | UNSUPPORTED_FORMAT | FILE_TOO_LARGE | JOB_NOT_FOUND | VLM_FAILED | WORKFLOW_FAILED | TIMEOUT | CANCELLED | INTERNAL | INSUFFICIENT_CREDITS | STORAGE_QUOTA_EXCEEDEDはい機械可読な失敗理由です。
error.messagestringはい人が読める失敗メッセージです。statusがfailedのときのみ存在します。
created_atstringはいジョブが作成された日時(ISO 8601形式)です。
updated_atstringはいジョブが最後に更新された日時(ISO 8601形式)です。

200 レスポンス例

{
  "job_id": "job_3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "type": "restore",
  "status": "succeeded",
  "progress": 100,
  "result_url": "/api/mock-assets/6c1d3a2e-4f5b-4a1e-9c2d-1a2b3c4d5e6f",
  "created_at": "2026-08-03T10:15:00.000Z",
  "updated_at": "2026-08-03T10:15:42.000Z"
}

コードサンプル

curl -X GET 'https://your-app.example.com/api/jobs/job_3fa85f64-5717-4562-b3fc-2c963f66afa6'
POST/api/jobs/{job_id}/cancel

ジョブをキャンセル

ジョブのキャンセルをリクエストします。すでに終了状態のジョブをキャンセルしても何も起こらず、現在の状態がそのまま返されます。

レスポンスボディ

名前必須範囲説明
job_idstringはいjob_<uuid>このジョブの一意な識別子です。
statuspending | processing | succeeded | failed | cancelledはいジョブの現在のライフサイクル状態です。

202 レスポンス例

{
  "job_id": "job_3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "cancelled"
}

コードサンプル

curl -X POST 'https://your-app.example.com/api/jobs/job_3fa85f64-5717-4562-b3fc-2c963f66afa6/cancel'

ジョブステータスのライフサイクル

すべてのジョブはこの状態遷移を経ます。pendingとprocessingは非終了状態で、succeeded、failed、cancelledは終了状態で二度と変化しません。

pendingprocessingsucceededfailedcancelled

クライアントのポーリング期限内にジョブが終了状態に達しない場合、TIMEOUTによる失敗として扱われます。

エラーコード

すべてのエラーはこの固定されたコードセットを使用します。INVALID_REQUEST、UNSUPPORTED_FORMAT、FILE_TOO_LARGE、JOB_NOT_FOUNDはHTTPエラーレスポンスとして返され、それ以外はジョブがfailedまたはcancelledの終了状態に達したときに、ジョブオブジェクト内のerror.codeとして現れます。

コード現れる場所意味
INVALID_REQUESTHTTP 400 エラーレスポンスこのリクエストは無効です。入力内容を確認してもう一度お試しください。
UNSUPPORTED_FORMATHTTP 415 エラーレスポンスこのファイル形式はサポートされていません。JPEG、PNG、WebP、HEIC、HEIFのいずれかをご使用ください。
FILE_TOO_LARGEHTTP 413 エラーレスポンスこのファイルは大きすぎます。より小さい画像を使用してください。
JOB_NOT_FOUNDHTTP 404 エラーレスポンスこのジョブが見つかりませんでした。期限切れの可能性があります。
VLM_FAILED終了状態のジョブのerrorフィールド内この画像を解析できませんでした。もう一度お試しください。
WORKFLOW_FAILED終了状態のジョブのerrorフィールド内処理に失敗しました。もう一度お試しください。
TIMEOUT終了状態のジョブのerrorフィールド内予想より時間がかかっています。もう一度お試しください。
CANCELLED終了状態のジョブのerrorフィールド内このジョブはキャンセルされました。
INTERNALHTTP 500 エラーレスポンスこちら側で問題が発生しました。もう一度お試しください。
INSUFFICIENT_CREDITSHTTP 402 エラーレスポンスこのジョブに必要なクレジットが不足しています。追加購入して続けてください。
STORAGE_QUOTA_EXCEEDEDHTTP 413 エラーレスポンスアルバムが上限に達しています。写真を削除するかアップグレードしてください。