API REST v1
AnonShot の画像をアプリに組み込む
サーバーから画像をアップロードしてコードを受け取り、LLM・画像タグ・任意の HTTP クライアントで直リンクを使えます。すべてのファイルは向きを補正し、EXIF メタデータを削除したうえで WebP で配信されます。
30 秒でわかる仕組み
- アカウント設定でトークンを作成します。
- そのトークンを付けて
POST /api/v1/photosにファイルを送ります。 shortUrl、またはもっと手軽にレスポンス内の完成済み URL を保存します。- 画像が公開なら
publicImageUrlを LLM に渡し、非公開にしておくならトークン付きでfileUrlをダウンロードします。
1. トークンの作成と保護
トークン全体は一度しか表示されません。バックエンドの環境変数に保存し、Git、URL、ブラウザに送る JavaScript、配布するモバイルアプリには絶対に含めないでください。
ANONSHOT_TOKEN=anon_live_…Authorization: Bearer $ANONSHOT_TOKENphotos:writeはアップロード・変更・削除を許可します。photos:readは一覧・詳細・認証付きダウンロードを許可します。- デフォルトの上限は 1 分あたり 60 リクエスト、1 か月あたり 10,000 リクエストです。
- トークンは無効化でき、有効期限を設定することもできます。
2. 写真をアップロードする
multipart/form-data のフォームを送信します。files フィールドは複数指定でき、JPEG・PNG・WebP・GIF に対応、1 ファイル 50MB・1 リクエスト 20 ファイルまでです。
curl の例
curl -X POST https://anonshot.com/api/v1/photos \
-H "Authorization: Bearer $ANONSHOT_TOKEN" \
-F "files=@photo.jpg"オプション:ページを保護するには -F "password=別のシークレット"、1 回限りの画像にするには -F "burnAfterRead=true" を追加します。外部サービスが公開 URL を自由に読む必要がある場合は使わないでください。
サーバー側 JavaScript の例
import { readFile } from "node:fs/promises"
const bytes = await readFile("photo.jpg")
const form = new FormData()
form.append("files", new Blob([bytes], { type: "image/jpeg" }), "photo.jpg")
const response = await fetch("https://anonshot.com/api/v1/photos", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.ANONSHOT_TOKEN}`,
},
body: form,
})
const payload = await response.json()
if (!response.ok) throw new Error(payload.error?.message ?? "アップロードに失敗しました")
const photo = payload.data[0]
console.log(photo.shortUrl, photo.publicImageUrl)Content-Type ヘッダーは自分で設定しないでください。FormData が正しい multipart の boundary を自動で付けます。
3. レスポンスと 3 つの URL
{
"data": [{
"id": "…",
"shortUrl": "Ab3dE7xK",
"shareUrl": "https://anonshot.com/p/Ab3dE7xK",
"publicImageUrl": "https://anonshot.com/p/Ab3dE7xK/image",
"fileUrl": "https://anonshot.com/api/v1/photos/Ab3dE7xK/file",
"mime": "image/webp",
"size": 183421,
"width": 2048,
"height": 1365,
"burnAfterRead": false,
"passwordProtected": false
}]
}| 値 | 用途 | アクセス |
|---|---|---|
| shareUrl | インターフェース付きの AnonShot ページを開く | 公開 |
| publicImageUrl | LLM、<img>、直接ダウンロード | 公開・HTML なし |
| fileUrl | 同じ画像を公開せずにダウンロード | Bearer + photos:read |
直リンクは常に /p/{code}/image です。HTML ページではなく、処理済みサイズの WebP 画像データを返します。アカウントのトークンで作成した写真は、削除するか 1 回限りの共有として開かれない限り期限切れになりません。パスワード保護された写真は、ロック解除用 Cookie を持たない LLM には使えません。
4. 画像を LLM に渡す
プロバイダーが画像 URL を受け付けるなら photo.publicImageUrl をそのまま渡します。画像を公開したくない場合は、サーバー側で fileUrl からバイトを取得し、プロバイダーの API に従って送信します。
const imageResponse = await fetch(photo.fileUrl, {
headers: { Authorization: `Bearer ${process.env.ANONSHOT_TOKEN}` },
})
if (!imageResponse.ok) throw new Error("画像を取得できません")
const imageBytes = await imageResponse.arrayBuffer()
// その後 imageBytes を LLM の SDK に渡します。AnonShot のトークンは LLM に渡さず、クエリパラメーターにも付けないでください。トークンはバックエンドと anonshot.com の間でのみ使います。
5. 取得・一覧・削除
# 写真の一覧を取得
curl https://anonshot.com/api/v1/photos \
-H "Authorization: Bearer $ANONSHOT_TOKEN"
# 写真の詳細を取得
curl https://anonshot.com/api/v1/photos/Ab3dE7xK \
-H "Authorization: Bearer $ANONSHOT_TOKEN"
# クリーンな WebP をダウンロード
curl https://anonshot.com/api/v1/photos/Ab3dE7xK/file \
-H "Authorization: Bearer $ANONSHOT_TOKEN" \
--output Ab3dE7xK.webp
# 共有を完全に削除
curl -X DELETE https://anonshot.com/api/v1/photos/Ab3dE7xK \
-H "Authorization: Bearer $ANONSHOT_TOKEN"EXIF メタデータだけを削除する
このルートは画像を受け取り、共有リンクを作らずにクリーンな WebP を直接返します。
curl -X POST https://anonshot.com/api/v1/exif/clean \
-H "Authorization: Bearer $ANONSHOT_TOKEN" \
-F "files=@photo.jpg" \
--output photo-no-metadata.webpX-AnonShot-Photo-Id ヘッダーに処理の ID が入ります。このルートでは JPEG・PNG・WebP に対応しています。
すべてのルート
| ルート | 機能 |
|---|---|
| GET /api/v1 | API の概要(認証不要) |
| GET · POST /api/v1/photos | 写真の一覧、または最大 20 枚のアップロード |
| GET · PATCH · DELETE /api/v1/photos/{code} | 共有の取得・変更・削除 |
| GET /api/v1/photos/{code}/file | トークン付きでクリーンな WebP を取得 |
| GET /p/{code}/image | 公開画像を HTML ページなしで直接表示 |
| POST /api/v1/exif/clean | 画像をクリーンにして WebP を取得 |
| POST /api/v1/uploads/presign | ストレージへの直接アップロードを準備 |
| GET · POST /api/v1/albums | アルバムの一覧・作成 |
| GET · PATCH · DELETE /api/v1/albums/{code} | アルバムの取得・変更・削除 |
| POST · DELETE /api/v1/albums/{code}/photos | 写真の追加・削除 |
レスポンス・エラー・利用上限
成功時の JSON は {"data": …}、エラーは {"error":{"code":"…","message":"…"}} の形式です。特に 400(リクエストまたは画像)、401(トークン)、403(scope)、429(上限)を処理してください。X-RateLimit-Remaining と X-Monthly-Remaining ヘッダーで残りの上限がわかります。