AnonShot

API REST v1

AnonShot 이미지를 앱에 연동하기

서버에서 이미지를 업로드하고 코드를 받아 LLM, 이미지 태그, 다른 HTTP 클라이언트에서 직링크로 사용하세요. 모든 파일은 방향을 바로잡고 EXIF 메타데이터를 지운 뒤 WebP로 제공됩니다.

30초 만에 이해하는 원리

  1. 계정 설정에서 토큰을 만드세요.
  2. 그 토큰으로 POST /api/v1/photos에 파일을 보내세요.
  3. shortUrl을 보관하거나, 더 간단하게 응답에 담긴 완성된 URL을 쓰세요.
  4. 이미지가 공개라면 publicImageUrl을 LLM에 넘기고, 비공개로 두어야 한다면 토큰으로 fileUrl을 내려받으세요.

1. 토큰 만들고 보호하기

전체 토큰은 한 번만 표시됩니다. 백엔드의 환경 변수에 보관하고, Git, URL, 브라우저로 보내는 JavaScript, 배포하는 모바일 앱에는 절대 넣지 마세요.

ANONSHOT_TOKEN=anon_live_…
Authorization: Bearer $ANONSHOT_TOKEN
  • photos: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 페이지 열기공개
publicImageUrlLLM, <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.webp

X-AnonShot-Photo-Id 헤더에 작업 ID가 담깁니다. 이 경로는 JPEG, PNG, WebP를 지원합니다.

전체 경로

경로기능
GET /api/v1API 안내, 인증 불필요
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 헤더로 남은 한도를 확인할 수 있습니다.

API 토큰 만들기 또는 폐기
이미지 호스팅 및 EXIF 삭제 API — AnonShot