POST/api/v4/locations/photos

Importer 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.

Nécessite une clé API. Consultez Authentification pour le format de l’en-tête et la rotation des clés.

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.

NomTypeObligatoireDescription
input.locationIdstringobligatoireThe location's Base64-encoded Relay ID to attach media to.
input.photosarray of objectsobligatoireImages to attach. `photo` is the only required key on each item.
input.photos[].photostringobligatoireA publicly accessible JPEG or PNG URL that Listings API fetches and stores. The field is named `photo`, not `url`.
input.photos[].typestringfacultatifWhich slot the image fills: `LOGO`, `COVER`, or `ADDITIONAL`. Defaults to an additional photo.
input.photos[].starredbooleanfacultatifStar 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[].sourcestringfacultatifFree-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.

Request body
{  "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.
Response
{  "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 :

JSON
{  "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 : photos est renvoyé vide et request.requestId est renseigné. Interrogez régulièrement GET /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 de request.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érale PROCCESSING, dont l’orthographe diffère de celle de PROCESSING, que l’endpoint de suivi renvoie pour la même tâche. La présence de request.requestId est l’indicateur fiable.
  • Transmettre starred: true pour un nombre de photos favorites dépassant la limite de 4 fait échouer l’appel entier avec SY15012. 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 type lorsque vous souhaitez utiliser une image comme logo ou comme image de couverture. Sans ce champ, l’image est stockée comme photo supplémentaire.
Request
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"        }      ]    }  }'