API REST v1
Intégrer les images AnonShot dans une application
Envoyez une image depuis votre serveur, récupérez son code et utilisez une URL directe dans un LLM, une balise image ou un autre client HTTP. Chaque fichier est réorienté, débarrassé de ses métadonnées EXIF et servi en WebP.
Le principe en 30 secondes
- Créez un jeton dans les paramètres du compte.
- Envoyez le fichier à
POST /api/v1/photosavec ce jeton. - Conservez
shortUrlou, plus simplement, les URL déjà construites dans la réponse. - Donnez
publicImageUrlau LLM si l’image est publique, ou téléchargezfileUrlavec le jeton si elle doit rester privée.
1. Créer et protéger le jeton
Le jeton complet n’est affiché qu’une fois. Placez-le dans une variable d’environnement de votre backend, jamais dans Git, une URL, du JavaScript envoyé au navigateur ou une application mobile distribuée.
ANONSHOT_TOKEN=anon_live_…Authorization: Bearer $ANONSHOT_TOKENphotos:writepermet l’upload, la modification et la suppression.photos:readpermet la liste, les détails et le téléchargement authentifié.- Les quotas par défaut sont de 60 requêtes par minute et 10 000 requêtes par mois.
- Les jetons sont révocables et peuvent avoir une date d’expiration.
2. Envoyer une photo
Envoyez un formulaire multipart/form-data. Le champ files est répétable : JPEG, PNG, WebP et GIF sont acceptés, avec 50 Mo maximum par fichier et 20 fichiers par requête.
Exemple curl
curl -X POST https://anonshot.com/api/v1/photos \
-H "Authorization: Bearer $ANONSHOT_TOKEN" \
-F "files=@photo.jpg"Options : ajoutez -F "password=un-secret-distinct" pour protéger la page, ou -F "burnAfterRead=true" pour une image à consultation unique. N’utilisez pas ces options si un service externe doit pouvoir relire librement l’URL publique.
Exemple JavaScript côté serveur
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 ?? "Upload impossible")
const photo = payload.data[0]
console.log(photo.shortUrl, photo.publicImageUrl)Ne définissez pas vous-même l’en-tête Content-Type : FormData y ajoute automatiquement la bonne boundary multipart.
3. Comprendre la réponse et les trois 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
}]
}| Valeur | À utiliser pour | Accès |
|---|---|---|
| shareUrl | Ouvrir la page AnonShot avec son interface | Public |
| publicImageUrl | LLM, <img>, téléchargement direct | Public, sans HTML |
| fileUrl | Télécharger la même image sans l’exposer publiquement | Bearer + photos:read |
L’adresse directe est toujours /p/{code}/image. Elle renvoie les octets de l’image en WebP, dans ses dimensions traitées, et non une page HTML. Les photos créées via un jeton de compte n’expirent pas, sauf suppression ou lecture d’un partage à usage unique. Une photo protégée par mot de passe ne convient pas à un LLM qui ne possède pas le cookie de déverrouillage.
4. Brancher l’image à un LLM
Si le fournisseur accepte une URL d’image, passez-lui directement photo.publicImageUrl. Si l’image ne doit pas être publique, récupérez plutôt les octets depuis fileUrl côté serveur, puis envoyez ces octets au fournisseur selon son API.
const imageResponse = await fetch(photo.fileUrl, {
headers: { Authorization: `Bearer ${process.env.ANONSHOT_TOKEN}` },
})
if (!imageResponse.ok) throw new Error("Image inaccessible")
const imageBytes = await imageResponse.arrayBuffer()
// Transmettez ensuite imageBytes au SDK du LLM.Ne transmettez jamais le jeton AnonShot au LLM et ne l’ajoutez jamais comme paramètre de requête. Le jeton sert uniquement entre votre backend et anonshot.com.
5. Lire, lister et supprimer
# Lister vos photos
curl https://anonshot.com/api/v1/photos \
-H "Authorization: Bearer $ANONSHOT_TOKEN"
# Lire les informations d’une photo
curl https://anonshot.com/api/v1/photos/Ab3dE7xK \
-H "Authorization: Bearer $ANONSHOT_TOKEN"
# Télécharger son WebP nettoyé
curl https://anonshot.com/api/v1/photos/Ab3dE7xK/file \
-H "Authorization: Bearer $ANONSHOT_TOKEN" \
--output Ab3dE7xK.webp
# Supprimer définitivement le partage
curl -X DELETE https://anonshot.com/api/v1/photos/Ab3dE7xK \
-H "Authorization: Bearer $ANONSHOT_TOKEN"Nettoyer uniquement les métadonnées EXIF
Cette route reçoit une image et renvoie directement un WebP nettoyé, sans créer de lien de partage.
curl -X POST https://anonshot.com/api/v1/exif/clean \
-H "Authorization: Bearer $ANONSHOT_TOKEN" \
-F "files=@photo.jpg" \
--output photo-sans-metadonnees.webpL’en-tête X-AnonShot-Photo-Id contient l’identifiant de l’opération. JPEG, PNG et WebP sont acceptés sur cette route.
Toutes les routes
| Route | Fonction |
|---|---|
| GET /api/v1 | Découverte de l’API, sans authentification |
| GET · POST /api/v1/photos | Lister ou envoyer jusqu’à 20 images |
| GET · PATCH · DELETE /api/v1/photos/{code} | Lire, modifier ou supprimer un partage |
| GET /api/v1/photos/{code}/file | Recevoir le WebP nettoyé avec un jeton |
| GET /p/{code}/image | Afficher directement une image publique, sans page HTML |
| POST /api/v1/exif/clean | Nettoyer une image et recevoir le WebP |
| POST /api/v1/uploads/presign | Préparer un upload direct vers le stockage |
| GET · POST /api/v1/albums | Lister ou créer des albums |
| GET · PATCH · DELETE /api/v1/albums/{code} | Lire, modifier ou supprimer un album |
| POST · DELETE /api/v1/albums/{code}/photos | Ajouter ou retirer des photos |
Réponses, erreurs et quotas
Les succès JSON utilisent {"data": …}. Les erreurs utilisent {"error":{"code":"…","message":"…"}}. Gérez notamment 400 (requête ou image), 401 (jeton), 403 (scope) et 429 (quota). Les en-têtes X-RateLimit-Remaining et X-Monthly-Remaining indiquent les quotas restants.