Actualiza los datos y el horario de una ubicación

Cambia datos de contacto, publica un horario semanal completo con excepciones, indica un cierre temporal, fija categorías de Google y relee los cambios.

POST /locations/update realiza una actualización parcial. Todos los campos van dentro de input, input.id es el único campo obligatorio y los campos que omitas conservan sus valores actuales. Cada sección a continuación cambia únicamente el cuerpo JSON de la solicitud.

1. Actualiza el teléfono y el sitio web

Envía id junto con los campos que quieras cambiar. Las plataformas de publicación publican bizUrl como URL del sitio web. locations.update() del Python SDK recibe un dict con claves camelCase, y updateLocation() del Node SDK recibe el mismo objeto.

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 fallo de validación también devuelve HTTP 200, con success: false y el motivo en data.updateLocation.errors, así que comprueba success en lugar del código de estado. Ambos SDK lanzan ValidationError en ese caso.

2. Establece el horario semanal

businessHours es un array con una entrada por cada día de la semana. Envía siempre las siete entradas e indica los días de cierre con type: "CLOSED" y un array slots vacío en lugar de omitirlos. Los intervalos de un mismo día no deben solaparse.

CampoValoresNotas
dayDe MONDAY a SUNDAY, o SPECIALSPECIAL es una excepción puntual para la fecha indicada en specialDate.
typeOPEN o CLOSEDUsa CLOSED con slots: [] para un día sin actividad.
slots[].start, slots[].end09:00am, 05:00pmHoras en formato de 12 horas con am o pm. Se permiten varias franjas por día para horarios partidos.
specialDateYYYY-MM-DDSolo en una entrada SPECIAL, enviada junto con las siete entradas de los días de la semana, nunca en su lugar.
moreHours[]hoursTypeId, moreHour[]Horarios secundarios, como los de entrega a domicilio o atención desde el automóvil. moreHour usa la misma estructura de day, type y slots, y no tiene 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": [] }    ]  }}'

Para un día festivo, añade una entrada SPECIAL al mismo array. Esta sustituye el horario únicamente para esa fecha y mantiene intacto el patrón semanal:

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

3. Indica un cierre temporal u oculta la dirección

temporarilyClosed: true marca el negocio como cerrado y deja de publicar su horario. Establécelo en false para volver a abrir. Para un negocio con área de servicio, establece hideAddress: true: ListingsAPI conserva la dirección en la ubicación, pero no la envía a las plataformas de publicación.

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. Establece las categorías de Google

Google Business Profile tiene su propia taxonomía de categorías, independiente del subCategoryId numérico. primaryGbpSiteCategoryId recibe un GCID, como gcid:restaurant, y additionalGbpSiteCategoryIds recibe más GCID. Ambos se resuelven en función de countryIso, así que envía el país en la misma llamada.

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"]  }}'

No los confundas con additionalCategoryIds, que recibe valores enteros de databaseId del endpoint de subcategorías. Consulta Consultar países, estados y categorías.

5. Vuelve a consultar la ubicación

GET /locations-by-ids devuelve el registro completo para uno o varios ids en base64, pasados como un array JSON en el parámetro de consulta ids. Compara phone, businessHours y temporarilyClosed con lo que enviaste.

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      }    ]  }}

Los ids que no existen en tu cuenta se omiten del array sin generar un error, así que compara la cantidad devuelta con la que solicitaste.

Si hay webhooks configurados, se genera un evento profile.updated. Su entrega se limita a una por ubicación cada 60 segundos y se realiza al inicio de ese intervalo: las modificaciones posteriores dentro de ese intervalo se agrupan, y changed_fields describe únicamente la modificación que lo inició. Vuelve a consultar la ubicación cuando llegue el evento y otra vez cuando haya terminado el intervalo.

Siguientes pasos