image_id. Utilise
l’image_id comme image source d’un Magic Edit,
d’un img2img,
de variations,
d’un redimensionnement,
d’un upscale,
d’une suppression d’arrière-plan,
d’une vectorisation ou d’une
génération image-to-video. Le MCP server propose
le même flux sous forme de deux outils, prepare_image_upload et
complete_image_upload — voir Outils MCP.
Les uploads sont gratuits — ils ne coûtent aucun credit.
Les trois étapes
1
Préparer
Appelle
POST /images/uploads/prepare avec
le filename, le content_type et la taille exacte du fichier dans
size_bytes. La réponse te donne l’image_id et une upload_url presignée.2
PUT du fichier
Fais un
PUT des octets bruts du fichier vers upload_url avec le même
Content-Type. N’envoie pas d’en-tête Authorization vers cette URL.3
Finaliser
Appelle
POST /images/uploads/{image_id}/complete
dans l’heure. Samsa vérifie le fichier et renvoie l’image avec sa width et sa
height mesurées. L’image_id est utilisable à partir de ce moment.curl --data-binary @file envoie la longueur réelle du fichier, donc elle
correspond toujours à size_bytes si tu as mesuré le même fichier.
Limites
Le fichier doit être au format que tu as déclaré dans
content_type. width et
height sont des indications optionnelles au moment du prepare : Samsa ne les
utilise que pour refuser tôt une image de plus de 32 MP. Les dimensions stockées sont
toujours mesurées à partir des octets téléversés. Un upload jamais finalisé est
supprimé après l’expiration de son URL.
Cycle de vie et erreurs
- Inutilisable avant complete. Tant que complete n’a pas réussi, l’
image_idrenvoie404 not_foundpartout. - Complete est idempotent. Le rappeler renvoie le même résultat et ne change
rien. Un
PUTultérieur vers la mêmeupload_urlne remplace pas une image finalisée. 422 validation_error— il n’y a pas encore de fichier, ou le fichier est vide, a une taille différente desize_bytes, est trop grand, est illisible, est d’un autre format ou dépasse 32 MP. Samsa supprime un fichier refusé : fais unPUTd’un fichier valide vers la mêmeupload_urltant qu’elle est valide, puis rappelle complete.404 not_found— l’image_idest inconnu, expiré, appartient à un autre utilisateur, ou n’a pas été créé par prepare.409 upload_in_progress— un autre appel complete pour le même upload est en cours. Réessaie dans quelques secondes ; si cela dure plusieurs minutes, prépare un nouvel upload.429 too_many_pending_uploads— tu as 20 uploads en attente de finalisation. Finalise-les, ou attends que ceux non finalisés expirent (voirRetry-After).
Scope et propriété
Les deux endpoints acceptent une clé avec l’un des scopesimages.edit,
images.transform ou videos.generate — les scopes des opérations qui prennent un
image_id source. Il n’y a pas de scope d’upload séparé, donc les clés existantes
fonctionnent. Une clé sans aucun des trois reçoit
403 missing_scope.
L’image téléversée appartient à l’utilisateur appelant — le créateur de la clé
API, ou l’utilisateur d’un token OAuth. Les autres membres de ton organisation ne
peuvent pas utiliser son image_id.