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
- Tạo một token trong cài đặt tài khoản.
- Gửi tệp đến
POST /api/v1/photoskèm token đó. - Lưu
shortUrl, hoặc đơn giản là các URL có sẵn trong phản hồi. - Đưa
publicImageUrlcho LLM nếu ảnh công khai, hoặc tảifileUrlkè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_TOKENphotos:writecho phép tải lên, chỉnh sửa và xóa.photos:readcho 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 |
|---|---|---|
| shareUrl | Mở trang AnonShot kèm giao diện | Công khai |
| publicImageUrl | LLM, <img>, tải trực tiếp | Công khai, không HTML |
| fileUrl | Tải cùng ảnh đó mà không công khai | Bearer + 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.webpHeader 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
| Route | Mục đích |
|---|---|
| GET /api/v1 | Khám phá API, không cần xác thực |
| GET · POST /api/v1/photos | Liệ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}/file | Lấy WebP đã làm sạch bằng token |
| GET /p/{code}/image | Phục vụ trực tiếp ảnh công khai, không có trang HTML |
| POST /api/v1/exif/clean | Làm sạch ảnh và nhận lại WebP |
| POST /api/v1/uploads/presign | Chuẩn bị tải trực tiếp lên kho lưu trữ |
| GET · POST /api/v1/albums | Liệ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}/photos | Thê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.