/api/v4/locations/photosImporter des photos pour un établissement
Associe des médias à un établissement via une URL d’image publique ou en référençant des fichiers de votre bibliothèque de médias.
Paramètres
Corps
Un champ imbriqué marqué comme obligatoire ne s’applique que si vous envoyez son parent. Si le parent est facultatif et que vous l’omettez, ses champs enfants obligatoires ne s’appliquent pas.
| Nom | Type | Obligatoire | Description |
|---|---|---|---|
| input.locationId | string | obligatoire | The location's Base64-encoded Relay ID to attach media to. |
| input.photos | array of objects | obligatoire | Images to attach. `photo` is the only required key on each item. |
| input.photos[].photo | string | obligatoire | A publicly accessible JPEG or PNG URL that Listings API fetches and stores. The field is named `photo`, not `url`. |
| input.photos[].type | string | facultatif | Which slot the image fills: `LOGO`, `COVER`, or `ADDITIONAL`. Defaults to an additional photo. |
| input.photos[].starred | boolean | facultatif | Star the photo as it is attached, instead of a follow-up call to the star endpoint. Only additional photos can be starred, at most 4 per location. |
| input.photos[].source | string | facultatif | Free-text label recording where the image came from. |
Exemple de requête
Corps prêt à coller. Remplacez les identifiants et valeurs d’exemple par les vôtres.
{ "input": { "locationId": "TG9jYXRpb246MTgwMDI4OQ==", "photos": [ { "photo": "https://cdn.example.com/jenny-home/logo.png", "type": "LOGO" }, { "photo": "https://cdn.example.com/jenny-home/storefront.jpg", "type": "ADDITIONAL" } ] }}Réponses
200Photos attached inline. Returns the created photo records; `errors` is null on success and `request` is empty because nothing was queued.
{ "data": { "addLocationPhotos": { "clientMutationId": null, "success": true, "request": {}, "photos": [ { "id": "TWVkaWFGaWxlOjU4Nzg5MzE=", "databaseId": 5878931, "url": "https://sy-media-store.s3-us-west-2.amazonaws.com/f868bb3f/59c670a3/f47d62a6.png", "thumbnailUrl": "https://sy-media-store.s3-us-west-2.amazonaws.com/f868bb3f/59c670a3/thumbnail_f47d62a6.png", "type": "LOGO", "starred": false }, { "id": "TWVkaWFGaWxlOjU4Nzg5MzI=", "databaseId": 5878932, "url": "https://sy-media-store.s3-us-west-2.amazonaws.com/f868bb3f/59c670a3/ef4ffb12.jpg", "thumbnailUrl": "https://sy-media-store.s3-us-west-2.amazonaws.com/f868bb3f/59c670a3/thumbnail_ef4ffb12.jpg", "type": "ADDITIONAL", "starred": false } ], "errors": null } }}401Unauthenticated, missing or invalid API key.
Associe une ou plusieurs images à un établissement. Fournissez un tableau photos dont chaque élément contient au minimum photo, une URL d’image publique à partir de laquelle Listings API récupère et stocke l’image. locationId et un tableau photos non vide sont toujours requis.
Deux formes de réponse de succès
Un petit lot est importé directement pendant l’appel : photos contient les médias dont l’importation est terminée et request est un objet vide, comme dans l’exemple ci-dessus. Un grand lot est plutôt mis en file d’attente, et le même 200 se présente alors ainsi :
{ "data": { "addLocationPhotos": { "clientMutationId": null, "success": true, "request": { "requestId": "e6c2d9d9-9a18-4015-88cf-9a4e19a6f49a", "status": "PROCCESSING" }, "photos": [], "errors": null } }}Les deux cas correspondent à un succès ; traitez-les donc en vérifiant la présence de request.requestId plutôt qu’en supposant que photos contient des données.
Le champ URL est photo. Ce n’est ni url ni image. En complément, chaque élément accepte les champs facultatifs type (LOGO, COVER ou ADDITIONAL), starred et source ; publisherOverride et partnerMediaId sont également acceptés pour les intégrations partenaires. Une photo renvoyée ne comporte pas de champ caption.
Cas d’utilisation : ajouter les premières images d’un nouvel établissement. Juste après avoir créé un établissement tel que « Jenny Home », utilisez POST pour importer son logo et ses photos de devanture à partir de leurs URL en un seul appel. La réponse renvoie le id de chaque nouvelle photo, que vous transmettez ensuite aux endpoints de mise en favori et de suppression.
Cas d’utilisation : réutiliser une ressource approuvée pour plusieurs établissements. Indiquez la même URL d’image hébergée dans les tableaux photos de plusieurs établissements afin que chaque établissement partage la même ressource source.
Points d’attention.
- Les images doivent être au format JPEG ou PNG. Les règles de taille des plateformes de publication s’appliquent par catégorie (le minimum habituel est d’environ 10 Ko et le maximum de quelques Mo).
- Les grands lots sont traités de manière asynchrone. Au-delà d’une taille de lot définie côté serveur, l’appel met le travail en file d’attente au lieu d’effectuer l’importation directement :
photosest renvoyé vide etrequest.requestIdest renseigné. Interrogez régulièrementGET /locations/photos/requests/{requestId}avec cet identifiant pour suivre l’avancement jusqu’à la fin du traitement. Le seuil est configuré côté serveur ; considérez donc que « les grands lots peuvent être mis en file d’attente » plutôt que de vous baser sur un nombre fixe, et choisissez le traitement à appliquer selon la présence derequest.requestId. - Ne choisissez pas le traitement à appliquer en fonction de
request.status. Dans la réponse de mise en file d’attente, sa valeur est la chaîne littéralePROCCESSING, dont l’orthographe diffère de celle dePROCESSING, que l’endpoint de suivi renvoie pour la même tâche. La présence derequest.requestIdest l’indicateur fiable. - Transmettre
starred: truepour un nombre de photos favorites dépassant la limite de 4 fait échouer l’appel entier avecSY15012. La vérification compte les photos favorites déjà présentes pour l’établissement ainsi que les éléments marqués comme favoris dans cette requête. - Un établissement conserve un seul logo et une seule image de couverture ; une nouvelle importation dans l’une de ces catégories remplace l’image existante.
- Définissez explicitement
typelorsque vous souhaitez utiliser une image comme logo ou comme image de couverture. Sans ce champ, l’image est stockée comme photo supplémentaire.
curl -X POST 'https://listingsapi.com/api/v4/locations/photos' \ -H "Authorization: API $LISTINGSAPI_KEY" \ -H 'Content-Type: application/json' \ -d '{ "input": { "locationId": "TG9jYXRpb246MTgwMDI4OQ==", "photos": [ { "photo": "https://cdn.example.com/jenny-home/logo.png", "type": "LOGO" }, { "photo": "https://cdn.example.com/jenny-home/storefront.jpg", "type": "ADDITIONAL" } ] } }'