Modifier les informations et horaires d’un établissement

Modifiez coordonnées et horaires hebdomadaires avec exceptions, signalez une fermeture temporaire, fixez les catégories Google et vérifiez les changements.

POST /locations/update effectue une mise à jour partielle. Tous les champs doivent être placés sous input, input.id est le seul champ obligatoire et les champs que vous omettez conservent leurs valeurs actuelles. Chaque section ci-dessous modifie uniquement le corps de la requête JSON.

1. Mettre à jour le téléphone et le site web

Envoyez id ainsi que les champs à modifier. Les plateformes de publication publient bizUrl comme URL du site web. La méthode locations.update() du Python SDK accepte un dict avec des clés camelCase, et la méthode updateLocation() du Node SDK accepte le même objet.

Phone and website
curl -X POST https://listingsapi.com/api/v4/locations/update \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "id": "TG9jYXRpb246MTgwMDI4OQ==",    "phone": "5125550199",    "bizUrl": "https://acmekitchen.example.com"  }}'
JSON
{  "data": {    "updateLocation": {      "success": true,      "errors": null,      "location": {        "id": "TG9jYXRpb246MTgwMDI4OQ==",        "databaseId": 1800289,        "name": "Jenny Home",        "phone": "5125550199",        "status": "APPROVED"      }    }  }}

Un échec de validation renvoie tout de même le statut HTTP 200, avec success: false et le motif dans data.updateLocation.errors ; vérifiez donc success plutôt que le code de statut. Les deux SDK lèvent ValidationError dans ce cas.

2. Définir les horaires hebdomadaires

businessHours est un tableau contenant une entrée pour chaque jour de la semaine. Envoyez toujours les 7 entrées et indiquez un jour de fermeture avec type: "CLOSED" et un tableau slots vide plutôt que de l'omettre. Les plages horaires d'une même journée ne doivent pas se chevaucher.

ChampValeursRemarques
dayDe MONDAY à SUNDAY, ou SPECIALSPECIAL est une exception ponctuelle pour la date indiquée dans specialDate.
typeOPEN ou CLOSEDUtilisez CLOSED avec slots: [] pour un jour sans activité.
slots[].start, slots[].end09:00am, 05:00pmHeures au format 12 heures avec am ou pm. Plusieurs créneaux par jour sont autorisés pour les horaires fractionnés.
specialDateYYYY-MM-DDUniquement dans une entrée SPECIAL, envoyée en complément des 7 entrées correspondant aux jours de la semaine, jamais à leur place.
moreHours[]hoursTypeId, moreHour[]Horaires secondaires, par exemple pour la livraison ou le service au volant. moreHour utilise la même structure day, type, slots et ne comporte pas de specialDate.
Weekly hours
curl -X POST https://listingsapi.com/api/v4/locations/update \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "id": "TG9jYXRpb246MTgwMDI4OQ==",    "businessHours": [      { "day": "MONDAY",    "type": "OPEN",   "slots": [{ "start": "09:00am", "end": "05:00pm" }] },      { "day": "TUESDAY",   "type": "OPEN",   "slots": [{ "start": "09:00am", "end": "05:00pm" }] },      { "day": "WEDNESDAY", "type": "OPEN",   "slots": [{ "start": "09:00am", "end": "05:00pm" }] },      { "day": "THURSDAY",  "type": "OPEN",   "slots": [{ "start": "09:00am", "end": "05:00pm" }] },      { "day": "FRIDAY",    "type": "OPEN",   "slots": [{ "start": "09:00am", "end": "05:00pm" }] },      { "day": "SATURDAY",  "type": "OPEN",   "slots": [{ "start": "10:00am", "end": "02:00pm" }] },      { "day": "SUNDAY",    "type": "CLOSED", "slots": [] }    ]  }}'

Pour un jour férié, ajoutez une entrée SPECIAL au même tableau. Elle remplace les horaires pour cette seule date et laisse le planning hebdomadaire inchangé :

JSON
{ "day": "SPECIAL", "type": "CLOSED", "specialDate": "2026-12-25", "slots": [] }

3. Signaler une fermeture temporaire ou masquer l'adresse

temporarilyClosed: true indique que l'entreprise est fermée et interrompt la publication de ses horaires. Définissez sa valeur sur false pour signaler la réouverture. Pour une entreprise desservant une zone géographique, définissez hideAddress: true : ListingsAPI conserve l'adresse dans les données de l'établissement, mais ne la transmet pas aux plateformes de publication.

Temporary closure
curl -X POST https://listingsapi.com/api/v4/locations/update \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "id": "TG9jYXRpb246MTgwMDI4OQ==", "temporarilyClosed": true } }'

4. Définir les catégories Google

Google Business Profile possède sa propre taxonomie de catégories, distincte du subCategoryId numérique. primaryGbpSiteCategoryId accepte un GCID tel que gcid:restaurant, et additionalGbpSiteCategoryIds en accepte d'autres. Les deux sont résolus en fonction de countryIso ; envoyez donc le pays dans le même appel.

Google categories
curl -X POST https://listingsapi.com/api/v4/locations/update \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "id": "TG9jYXRpb246MTgwMDI4OQ==",    "countryIso": "US",    "primaryGbpSiteCategoryId": "gcid:restaurant",    "additionalGbpSiteCategoryIds": ["gcid:pizza_restaurant", "gcid:italian_restaurant"]  }}'

Ne les confondez pas avec additionalCategoryIds, qui accepte des valeurs entières de databaseId provenant de l'endpoint des sous-catégories. Consultez Rechercher les pays, les États et les catégories.

5. Relire les données de l'établissement

GET /locations-by-ids renvoie l'enregistrement complet pour un ou plusieurs identifiants encodés en base64, transmis sous forme de tableau JSON dans le paramètre de requête ids. Comparez phone, businessHours et temporarilyClosed avec les valeurs que vous avez envoyées.

Verify
curl -G https://listingsapi.com/api/v4/locations-by-ids \--data-urlencode 'ids=["TG9jYXRpb246MTgwMDI4OQ=="]' \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "getLocationsByIds": [      {        "id": "TG9jYXRpb246MTgwMDI4OQ==",        "databaseId": 1800289,        "name": "Jenny Home",        "phone": "5125550199",        "hideAddress": false,        "temporarilyClosed": true      }    ]  }}

Les identifiants qui n'existent pas dans votre compte sont exclus du tableau sans erreur ; comparez donc le nombre d'enregistrements renvoyés au nombre demandé.

Si des webhooks sont configurés, un événement profile.updated est déclenché. Les notifications sont limitées à un envoi par établissement toutes les 60 secondes, effectué dès la première modification : les modifications suivantes dans cette fenêtre sont regroupées, et changed_fields décrit uniquement la modification qui a ouvert cette fenêtre. Relisez les données de l'établissement à la réception de l'événement, puis à nouveau après la fin de la fenêtre.

Étapes suivantes