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는 목록, 상세 정보, 인증된 다운로드를 허용합니다.- 기본 한도는 분당 60회, 월 10,000회 요청입니다.
- 토큰은 폐기할 수 있고 만료일을 둘 수 있습니다.
2. 사진 업로드
multipart/form-data 양식을 보내세요. files 필드는 반복할 수 있으며 JPEG, PNG, WebP, GIF를 지원하고, 파일당 50MB, 요청당 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. 응답과 세 가지 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회 열람 공유로 열리지 않는 한 만료되지 않습니다. 비밀번호로 보호된 사진은 잠금 해제 쿠키가 없는 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 헤더로 남은 한도를 확인할 수 있습니다.