API REST v1
Integre as imagens do AnonShot no seu app
Envie uma imagem do seu servidor, receba o código e use uma URL direta num LLM, numa tag de imagem ou em qualquer cliente HTTP. Cada arquivo é reorientado, limpo dos metadados EXIF e servido em WebP.
Como funciona em 30 segundos
- Crie um token em as configurações da conta.
- Envie o arquivo para
POST /api/v1/photoscom esse token. - Guarde o
shortUrlou, mais simples, as URLs já prontas na resposta. - Passe
publicImageUrlao LLM se a imagem for pública, ou baixefileUrlcom o token se ela precisar continuar privada.
1. Criar e proteger o token
O token completo só aparece uma vez. Guarde-o numa variável de ambiente do seu backend, nunca no Git, numa URL, em JavaScript enviado ao navegador ou num app mobile distribuído.
ANONSHOT_TOKEN=anon_live_…Authorization: Bearer $ANONSHOT_TOKENphotos:writepermite upload, edição e exclusão.photos:readpermite listar, ver detalhes e baixar com autenticação.- As cotas padrão são de 60 requisições por minuto e 10.000 por mês.
- Os tokens podem ser revogados e ter data de expiração.
2. Enviar uma foto
Envie um formulário multipart/form-data. O campo files pode se repetir: JPEG, PNG, WebP e GIF são aceitos, com até 50 MB por arquivo e 20 arquivos por requisição.
Exemplo com curl
curl -X POST https://anonshot.com/api/v1/photos \
-H "Authorization: Bearer $ANONSHOT_TOKEN" \
-F "files=@photo.jpg"Opções: adicione -F "password=um-segredo-diferente" para proteger a página, ou -F "burnAfterRead=true" para uma imagem de visualização única. Não use essas opções se um serviço externo precisar ler a URL pública livremente.
Exemplo em JavaScript no servidor
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 ?? "Falha no upload")
const photo = payload.data[0]
console.log(photo.shortUrl, photo.publicImageUrl)Não defina você mesmo o cabeçalho Content-Type: o FormData adiciona automaticamente o boundary multipart correto.
3. A resposta e suas três URLs
{
"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
}]
}| Valor | Use para | Acesso |
|---|---|---|
| shareUrl | Abrir a página do AnonShot com a interface | Público |
| publicImageUrl | LLM, <img>, download direto | Público, sem HTML |
| fileUrl | Baixar a mesma imagem sem expô-la publicamente | Bearer + photos:read |
O endereço direto é sempre /p/{code}/image. Ele devolve os bytes da imagem em WebP, já processada, e não uma página HTML. Fotos criadas com um token de conta não expiram, a não ser que sejam apagadas ou abertas como compartilhamento de visualização única. Uma foto com senha não funciona para um LLM que não tenha o cookie de desbloqueio.
4. Conectar a imagem a um LLM
Se o provedor aceita URL de imagem, passe photo.publicImageUrl diretamente. Se a imagem não pode ser pública, busque os bytes em fileUrl no servidor e envie esses bytes ao provedor conforme a API dele.
const imageResponse = await fetch(photo.fileUrl, {
headers: { Authorization: `Bearer ${process.env.ANONSHOT_TOKEN}` },
})
if (!imageResponse.ok) throw new Error("Imagem inacessível")
const imageBytes = await imageResponse.arrayBuffer()
// Depois passe imageBytes para o SDK do LLM.Nunca passe o token do AnonShot ao LLM nem o coloque como parâmetro de URL. O token só serve entre o seu backend e o anonshot.com.
5. Ler, listar e apagar
# Listar suas fotos
curl https://anonshot.com/api/v1/photos \
-H "Authorization: Bearer $ANONSHOT_TOKEN"
# Ver os dados de uma foto
curl https://anonshot.com/api/v1/photos/Ab3dE7xK \
-H "Authorization: Bearer $ANONSHOT_TOKEN"
# Baixar o WebP limpo
curl https://anonshot.com/api/v1/photos/Ab3dE7xK/file \
-H "Authorization: Bearer $ANONSHOT_TOKEN" \
--output Ab3dE7xK.webp
# Apagar o compartilhamento de vez
curl -X DELETE https://anonshot.com/api/v1/photos/Ab3dE7xK \
-H "Authorization: Bearer $ANONSHOT_TOKEN"Limpar só os metadados EXIF
Esta rota recebe uma imagem e devolve direto um WebP limpo, sem criar link de compartilhamento.
curl -X POST https://anonshot.com/api/v1/exif/clean \
-H "Authorization: Bearer $ANONSHOT_TOKEN" \
-F "files=@photo.jpg" \
--output foto-sem-metadados.webpO cabeçalho X-AnonShot-Photo-Id traz o identificador da operação. JPEG, PNG e WebP são aceitos nesta rota.
Todas as rotas
| Rota | Função |
|---|---|
| GET /api/v1 | Descoberta da API, sem autenticação |
| GET · POST /api/v1/photos | Listar ou enviar até 20 imagens |
| GET · PATCH · DELETE /api/v1/photos/{code} | Ler, editar ou apagar um compartilhamento |
| GET /api/v1/photos/{code}/file | Receber o WebP limpo com um token |
| GET /p/{code}/image | Exibir direto uma imagem pública, sem página HTML |
| POST /api/v1/exif/clean | Limpar uma imagem e receber o WebP |
| POST /api/v1/uploads/presign | Preparar um upload direto para o armazenamento |
| GET · POST /api/v1/albums | Listar ou criar álbuns |
| GET · PATCH · DELETE /api/v1/albums/{code} | Ler, editar ou apagar um álbum |
| POST · DELETE /api/v1/albums/{code}/photos | Adicionar ou remover fotos |
Respostas, erros e cotas
Respostas JSON de sucesso usam {"data": …}. Erros usam {"error":{"code":"…","message":"…"}}. Trate principalmente 400 (requisição ou imagem), 401 (token), 403 (scope) e 429 (cota). Os cabeçalhos X-RateLimit-Remaining e X-Monthly-Remaining mostram as cotas restantes.