AnonShot

API REST v1

Integra las imágenes de AnonShot en tu aplicación

Sube una imagen desde tu servidor, recibe su código y usa una URL directa en un LLM, una etiqueta de imagen o cualquier cliente HTTP. Cada archivo se reorienta, se limpia de metadatos EXIF y se sirve en WebP.

Cómo funciona en 30 segundos

  1. Crea un token en los ajustes de tu cuenta.
  2. Envía el archivo a POST /api/v1/photos con ese token.
  3. Guarda el shortUrl o, más sencillo, las URL ya construidas en la respuesta.
  4. Pasa publicImageUrl al LLM si la imagen es pública, o descarga fileUrl con el token si debe seguir siendo privada.

1. Crear y proteger el token

El token completo solo se muestra una vez. Guárdalo en una variable de entorno de tu backend, nunca en Git, en una URL, en JavaScript enviado al navegador ni en una app móvil distribuida.

ANONSHOT_TOKEN=anon_live_…
Authorization: Bearer $ANONSHOT_TOKEN
  • photos:write permite subir, modificar y borrar.
  • photos:read permite listar, ver detalles y descargar con autenticación.
  • Las cuotas por defecto son de 60 peticiones por minuto y 10 000 peticiones al mes.
  • Los tokens se pueden revocar y pueden tener fecha de caducidad.

2. Subir una foto

Envía un formulario multipart/form-data. El campo files puede repetirse: se aceptan JPEG, PNG, WebP y GIF, hasta 50 MB por archivo y 20 archivos por petición.

Ejemplo con curl

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

Opciones: añade -F "password=un-secreto-distinto" para proteger la página, o -F "burnAfterRead=true" para una imagen de un solo uso. No uses estas opciones si un servicio externo debe poder leer libremente la URL pública.

Ejemplo en JavaScript en el 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 ?? "No se pudo subir")

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

No definas tú la cabecera Content-Type: FormData añade automáticamente el boundary multipart correcto.

3. La respuesta y sus tres 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
  }]
}
ValorPara qué usarloAcceso
shareUrlAbrir la página de AnonShot con su interfazPúblico
publicImageUrlLLM, <img>, descarga directaPúblico, sin HTML
fileUrlDescargar la misma imagen sin exponerla públicamenteBearer + photos:read

La dirección directa siempre es /p/{code}/image. Devuelve los bytes de la imagen en WebP, con sus dimensiones procesadas, no una página HTML. Las fotos creadas con un token de cuenta no caducan, salvo si se borran o se abren como envío de un solo uso. Una foto con contraseña no sirve para un LLM que no tenga la cookie de desbloqueo.

4. Conectar la imagen a un LLM

Si el proveedor acepta una URL de imagen, pásale directamente photo.publicImageUrl. Si la imagen no debe ser pública, obtén los bytes desde fileUrl en tu servidor y envíalos al proveedor según su API.

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

if (!imageResponse.ok) throw new Error("Imagen inaccesible")
const imageBytes = await imageResponse.arrayBuffer()
// Después pasa imageBytes al SDK del LLM.

Nunca pases el token de AnonShot al LLM ni lo añadas como parámetro de la URL. El token solo se usa entre tu backend y anonshot.com.

5. Leer, listar y borrar

# Listar tus fotos
curl https://anonshot.com/api/v1/photos \
  -H "Authorization: Bearer $ANONSHOT_TOKEN"

# Ver los datos de una foto
curl https://anonshot.com/api/v1/photos/Ab3dE7xK \
  -H "Authorization: Bearer $ANONSHOT_TOKEN"

# Descargar su WebP limpio
curl https://anonshot.com/api/v1/photos/Ab3dE7xK/file \
  -H "Authorization: Bearer $ANONSHOT_TOKEN" \
  --output Ab3dE7xK.webp

# Borrar el envío para siempre
curl -X DELETE https://anonshot.com/api/v1/photos/Ab3dE7xK \
  -H "Authorization: Bearer $ANONSHOT_TOKEN"

Limpiar solo los metadatos EXIF

Esta ruta recibe una imagen y devuelve directamente un WebP limpio, sin crear un enlace para compartir.

curl -X POST https://anonshot.com/api/v1/exif/clean \
  -H "Authorization: Bearer $ANONSHOT_TOKEN" \
  -F "files=@photo.jpg" \
  --output foto-sin-metadatos.webp

La cabecera X-AnonShot-Photo-Id contiene el identificador de la operación. En esta ruta se aceptan JPEG, PNG y WebP.

Todas las rutas

RutaFunción
GET /api/v1Descubrir la API, sin autenticación
GET · POST /api/v1/photosListar o subir hasta 20 imágenes
GET · PATCH · DELETE /api/v1/photos/{code}Leer, modificar o borrar un envío
GET /api/v1/photos/{code}/fileRecibir el WebP limpio con un token
GET /p/{code}/imageMostrar directamente una imagen pública, sin página HTML
POST /api/v1/exif/cleanLimpiar una imagen y recibir el WebP
POST /api/v1/uploads/presignPreparar una subida directa al almacenamiento
GET · POST /api/v1/albumsListar o crear álbumes
GET · PATCH · DELETE /api/v1/albums/{code}Leer, modificar o borrar un álbum
POST · DELETE /api/v1/albums/{code}/photosAñadir o quitar fotos

Respuestas, errores y cuotas

Las respuestas JSON correctas usan {"data": …}. Los errores usan {"error":{"code":"…","message":"…"}}. Gestiona sobre todo 400 (petición o imagen), 401 (token), 403 (scope) y 429 (cuota). Las cabeceras X-RateLimit-Remaining y X-Monthly-Remaining indican las cuotas restantes.

Crear o revocar un token de API
API de alojamiento de imágenes y borrado de EXIF — AnonShot