AnonShot

API REST v1

Dùng ảnh AnonShot trong ứng dụng của bạn

Tải ảnh lên từ máy chủ của bạn, nhận lại mã ảnh và dùng URL trực tiếp trong LLM, thẻ ảnh hoặc bất kỳ ứng dụng HTTP nào. Mọi tệp đều được chỉnh lại hướng, xóa siêu dữ liệu EXIF và phục vụ dưới dạng WebP.

Cách hoạt động trong 30 giây

  1. Tạo một token trong cài đặt tài khoản.
  2. Gửi tệp đến POST /api/v1/photos kèm token đó.
  3. Lưu shortUrl, hoặc đơn giản là các URL có sẵn trong phản hồi.
  4. Đưa publicImageUrl cho LLM nếu ảnh công khai, hoặc tải fileUrl kèm token nếu ảnh cần giữ riêng tư.

1. Tạo và bảo vệ token

Token đầy đủ chỉ hiển thị một lần. Hãy lưu nó trong biến môi trường ở backend, không bao giờ để trong Git, URL, JavaScript gửi xuống trình duyệt hay ứng dụng di động phát hành ra ngoài.

ANONSHOT_TOKEN=anon_live_…
Authorization: Bearer $ANONSHOT_TOKEN
  • photos:write cho phép tải lên, chỉnh sửa và xóa.
  • photos:read cho phép liệt kê, xem chi tiết và tải xuống có xác thực.
  • Hạn mức mặc định là 60 yêu cầu mỗi phút và 10.000 yêu cầu mỗi tháng.
  • Token có thể bị thu hồi và có thể có ngày hết hạn.

2. Tải ảnh lên

Gửi một biểu mẫu multipart/form-data. Trường files có thể lặp lại: chấp nhận JPEG, PNG, WebP và GIF, tối đa 50 MB mỗi tệp và 20 tệp mỗi yêu cầu.

Ví dụ curl

curl -X POST https://anonshot.com/api/v1/photos \
  -H "Authorization: Bearer $ANONSHOT_TOKEN" \
  -F "files=@photo.jpg"

Tùy chọn: thêm -F "password=mot-bi-mat-rieng" để bảo vệ trang, hoặc -F "burnAfterRead=true" cho ảnh xem một lần. Đừng dùng các tùy chọn này nếu một dịch vụ bên ngoài cần đọc URL công khai một cách tự do.

Ví dụ JavaScript phía máy chủ

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 ?? "Tải lên thất bại")

const photo = payload.data[0]
console.log(photo.shortUrl, photo.publicImageUrl)

Đừng tự đặt header Content-Type: FormData tự động thêm boundary multipart chính xác.

3. Phản hồi và ba 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
  }]
}
Giá trịDùng đểTruy cập
shareUrlMở trang AnonShot kèm giao diệnCông khai
publicImageUrlLLM, <img>, tải trực tiếpCông khai, không HTML
fileUrlTải cùng ảnh đó mà không công khaiBearer + photos:read

Địa chỉ trực tiếp luôn là /p/{code}/image. Địa chỉ này trả về dữ liệu ảnh WebP ở kích thước đã xử lý, không phải trang HTML. Ảnh tạo bằng token tài khoản không hết hạn, trừ khi bị xóa hoặc đã được mở một lần ở chế độ xem một lần. Ảnh có mật khẩu sẽ không dùng được với LLM không có cookie mở khóa.

4. Đưa ảnh cho LLM

Nếu nhà cung cấp chấp nhận URL ảnh, hãy đưa thẳng photo.publicImageUrl. Nếu ảnh không được công khai, hãy lấy dữ liệu từ fileUrl trên máy chủ của bạn, rồi gửi dữ liệu đó cho nhà cung cấp theo API của họ.

const imageResponse = await fetch(photo.fileUrl, {
  headers: { Authorization: `Bearer ${process.env.ANONSHOT_TOKEN}` },
})

if (!imageResponse.ok) throw new Error("Không truy cập được ảnh")
const imageBytes = await imageResponse.arrayBuffer()
// Sau đó đưa imageBytes vào SDK của LLM.

Không bao giờ đưa token AnonShot cho LLM và không bao giờ thêm nó làm tham số truy vấn. Token chỉ dùng giữa backend của bạn và anonshot.com.

5. Đọc, liệt kê và xóa

# Liệt kê ảnh của bạn
curl https://anonshot.com/api/v1/photos \
  -H "Authorization: Bearer $ANONSHOT_TOKEN"

# Xem chi tiết một ảnh
curl https://anonshot.com/api/v1/photos/Ab3dE7xK \
  -H "Authorization: Bearer $ANONSHOT_TOKEN"

# Tải WebP đã làm sạch
curl https://anonshot.com/api/v1/photos/Ab3dE7xK/file \
  -H "Authorization: Bearer $ANONSHOT_TOKEN" \
  --output Ab3dE7xK.webp

# Xóa vĩnh viễn lượt chia sẻ
curl -X DELETE https://anonshot.com/api/v1/photos/Ab3dE7xK \
  -H "Authorization: Bearer $ANONSHOT_TOKEN"

Chỉ xóa siêu dữ liệu EXIF

Route này nhận một ảnh và trả về trực tiếp WebP đã làm sạch, không tạo liên kết chia sẻ.

curl -X POST https://anonshot.com/api/v1/exif/clean \
  -H "Authorization: Bearer $ANONSHOT_TOKEN" \
  -F "files=@photo.jpg" \
  --output anh-khong-sieu-du-lieu.webp

Header X-AnonShot-Photo-Id chứa ID của thao tác. Route này chấp nhận JPEG, PNG và WebP.

Tất cả route

RouteMục đích
GET /api/v1Khám phá API, không cần xác thực
GET · POST /api/v1/photosLiệt kê ảnh hoặc tải lên tối đa 20 ảnh
GET · PATCH · DELETE /api/v1/photos/{code}Đọc, chỉnh sửa hoặc xóa lượt chia sẻ
GET /api/v1/photos/{code}/fileLấy WebP đã làm sạch bằng token
GET /p/{code}/imagePhục vụ trực tiếp ảnh công khai, không có trang HTML
POST /api/v1/exif/cleanLàm sạch ảnh và nhận lại WebP
POST /api/v1/uploads/presignChuẩn bị tải trực tiếp lên kho lưu trữ
GET · POST /api/v1/albumsLiệt kê hoặc tạo album
GET · PATCH · DELETE /api/v1/albums/{code}Đọc, chỉnh sửa hoặc xóa album
POST · DELETE /api/v1/albums/{code}/photosThêm hoặc xóa ảnh

Phản hồi, lỗi và hạn mức

Phản hồi JSON thành công dùng {"data": …}. Lỗi dùng {"error":{"code":"…","message":"…"}}. Đặc biệt cần xử lý 400 (yêu cầu hoặc ảnh), 401 (token), 403 (phạm vi) và 429 (hạn mức). Header X-RateLimit-Remaining và X-Monthly-Remaining cho biết hạn mức còn lại.

Tạo hoặc thu hồi token API