/api/v4/locations/updateUpdate a location
Updates writable fields on an existing location. Only the fields you send are changed.
Parameters
Body
A nested field marked required applies only when you send its parent. If the parent is optional and you omit it, its required children do not apply.
| Name | Type | Required | Description |
|---|---|---|---|
| input.id | string | required | The location's Base64-encoded Relay ID to update. |
| input.name | string | optional | Business name. |
| input.street | string | optional | Street address. |
| input.city | string | optional | City. |
| input.stateIso | string | optional | State/region ISO code. |
| input.postalCode | string | optional | Postal or ZIP code. |
| input.countryIso | string | optional | Two-letter country ISO code. |
| input.phone | string | optional | Primary phone number. |
| input.bizUrl | string | optional | Business website URL. Published to directories as the location's website. |
| input.primaryGbpSiteCategoryId | string | optional | Primary Google Business Profile category, as a GCID (e.g. `gcid:restaurant`). Resolved against `countryIso`, so send the two together. |
| input.additionalGbpSiteCategoryIds | array of strings | optional | Additional Google Business Profile categories, as GCIDs. Also resolved against `countryIso`. |
| input.offeringsUrl | string | optional | URL of the menu, catalogue, or service list. |
| input.bookingUrl | string | optional | URL customers use to book an appointment. |
| input.reservationUrl | string | optional | URL customers use to make a reservation. |
| input.street1 | string | optional | Second address line (suite, unit, floor). |
| input.latitude | string | optional | Latitude of the location, as a string. Send with `longitude`; publishers use it when the address alone is ambiguous. |
| input.longitude | string | optional | Longitude of the location, as a string. Send with `latitude`. |
| input.ownerEmail | string | optional | Email of the location owner. Used for listing claims and verification, not for login. |
| input.ownerName | string | optional | Name of the location owner. |
| input.facebookUrl | string | optional | URL of the location's Facebook page. |
| input.twitterUrl | string | optional | URL of the location's X (Twitter) profile. |
| input.linkedinUrl | string | optional | URL of the location's LinkedIn page. |
| input.instagramUrl | string | optional | URL of the location's Instagram profile. |
| input.youtubeUrl | string | optional | URL of the location's YouTube channel. |
| input.tiktokUrl | string | optional | URL of the location's TikTok profile. |
| input.pinterestUrl | string | optional | URL of the location's Pinterest profile. |
| input.tagline | string | optional | Short tagline for the business. |
| input.description | string | optional | Business description. Published to Google Business Profile as the business description. |
| input.yearOfIncorporation | string | optional | Year the business was incorporated, e.g. `2014`. |
| input.googleAdsPhone | string | optional | Alternate phone shown on Google Ads location extensions instead of `phone`. |
| input.additionalPhones | array of strings | optional | Secondary phone numbers submitted to Google Business Profile. |
| input.videos | array of strings | optional | Video URLs for the location. |
| input.additionalCategoryIds | array of integers | optional | Secondary Listings API subcategory IDs, from the subcategories endpoint. Distinct from `additionalGbpSiteCategoryIds`, which takes Google GCIDs. |
| input.subCategoryId | integer | optional | Primary subcategory ID. Pick a valid ID from the subcategories list endpoint. |
| input.storeId | string | optional | Unique store code. Must be unique across the account. |
| input.enabledSiteIds | array of integers | optional | Site IDs to publish this location to, when you want a subset of your plan's sites. See the plan-sites endpoint for valid IDs. Omit to publish to every site in your plan. |
| input.updateOnlySiteIds | array of integers | optional | Restrict this update to the given site IDs. Other sites keep their current published values. |
| input.contentPreferredLanguage | string | optional | Preferred language for the location's published content, e.g. `ENGLISH`. |
| input.submissionDisabledSiteIds | array of integers | optional | Site IDs to exclude from submission. The inverse of `enabledSiteIds`, useful when you want every site in your plan except a few. |
| input.hideAddress | boolean | optional | Set `true` for a service-area business. ListingsAPI stores the address you send but does not submit it to publishers. |
| input.temporarilyClosed | boolean | optional | Set `true` to stop publishing business hours while the location is temporarily closed. |
| input.serviceItems | array of objects | optional | Services offered, published to Google Business Profile. |
| input.paymentMethods | array of strings | optional | Payment methods accepted. One or more of `VISA`, `MASTERCARD`, `AMEX`, `CASH`, `CHEQUE`, `CRYPTO`, `DINERS_CLUB`, `DISCOVER`, `FINANCING`, `INVOICE`, `TRAVELERS_CHECK`, `APPLE_PAY`, `SAMSUNG_PAY`, `PAYPAL`, `ANDROID_PAY`. |
| input.businessHours | array of objects | optional | Hours. Each entry is `{ day, type, slots }`, plus `specialDate` for a `SPECIAL` entry. Send the full seven-day week when you set hours. |
| input.businessHours[].day | string | required | One of MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY, or SPECIAL (a one-off override for the date in `specialDate`). |
| input.businessHours[].type | string | required | `OPEN` or `CLOSED`. |
| input.businessHours[].specialDate | string | optional | Date of a one-off override, as `YYYY-MM-DD`. Set this only when `day` is `SPECIAL`. |
| input.businessHours[].slots | array of objects | optional | Open intervals for the day, each `{ start, end }` (e.g. `09:00am`, `05:00pm`). Use an empty array when `type` is `CLOSED`. |
| input.businessHours[].slots[].start | string | required | Opening time for the interval, e.g. `09:00am`. |
| input.businessHours[].slots[].end | string | required | Closing time for the interval, e.g. `05:00pm`. |
| input.moreHours | array of objects | optional | Additional hour sets (e.g. delivery, drive-through). Each entry is `{ hoursTypeId, moreHour }`, where `moreHour` is an array of `{ day, type, slots }` using the same shape as `businessHours` (minus `specialDate`). |
| input.serviceArea | object | optional | Service-area business config: `businessType`, `regionCode`, and a `placeInfos` array of `{ placeId, placeName }`. |
| input.customAttributes | array of objects | optional | Custom attribute values for the location. Each item is `{ slug, value }`, where `slug` identifies a custom attribute registered on your account and `value` is an array of strings. Sending a slug that is not registered returns `SY10035`. Registering a new custom attribute is not yet available through the API. |
| input.placeActionLinks | array of objects | optional | Google action links (ordering, delivery, takeout, reservation, appointment). Each item: `placeActionType` (enum), `uri` (string), optional `isPreferred` (boolean), optional `action` (`add`, the default, or `delete`), optional `name` (the link identifier returned by read endpoints once synced to Google). Only the links you reference are affected; links you don't include are left unchanged. See the Place Action Links guide. |
Sample request
Ready-to-paste body. Replace placeholder IDs and values with yours.
{ "input": { "id": "TG9jYXRpb246MTgwMDI4OQ==", "phone": "5125550199", "bizUrl": "https://acmekitchen.example.com", "primaryGbpSiteCategoryId": "gcid:restaurant", "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": [] } ] }}Responses
200Location updated. `success` is true and the updated location summary is returned.
{ "data": { "updateLocation": { "clientMutationId": null, "success": true, "errors": null, "location": { "id": "TG9jYXRpb246MTgwMDI4OQ==", "databaseId": 1800289, "name": "Jenny Home", "street": "600 Congress Ave, Suite 200", "city": "Austin", "stateIso": "TX", "countryIso": "US", "postalCode": "78701", "phone": "5125550199", "storeId": null, "status": "APPROVED", "placeActionLinks": [ { "placeActionType": "FOOD_ORDERING", "uri": "https://order.example.com", "isPreferred": true, "name": null, "submissionStatus": null } ], "discoveredPlaceActionLinks": [] } } }}401Unauthenticated, missing or invalid API key.
Updates a single location. Only the fields present in input are modified; everything you omit keeps its current value. id is the only required field.
Use case: correct a phone number. Send just id and phone to fix contact details without touching address or hours. The response returns the updated location so you can confirm the new values landed.
Use case: publish a full weekly schedule. Send the seven-day businessHours array (as in the sample request) to set open intervals per day. Mark closed days with { "day": "SUNDAY", "type": "CLOSED", "slots": [] }.
Business hours rules.
- Provide all seven days; a partial week is rejected.
- Times use
start/endinside eachslotsentry (e.g.09:00am,05:00pm); intervals within a day must not overlap. - Holiday and event overrides are extra entries with
day: "SPECIAL"and aspecialDate(YYYY-MM-DD), sent alongside the seven weekday entries, never instead of them. - Use
SPECIALonly inbusinessHours.moreHoursentries have nospecialDatefield, so aSPECIALday there carries no date. - Use
moreHoursfor secondary schedules (delivery, drive-through), keyed byhoursTypeId.
Always send the full week. Publishers expect a complete MONDAY–SUNDAY schedule; send all seven entries whenever you set businessHours, using type: "CLOSED" (with empty slots) for non-operating days rather than omitting the day.
Gotchas.
- The identifier field is
id(the Base64 Relay ID returned by every read endpoint). - On validation failure the call still returns HTTP 200 with
success: falseand a populatederrorsarray, always checksuccess, not just the status code.
Place action links
placeActionLinks manages a location's Google action buttons (ordering, delivery, takeout, reservation, appointment). The write model is append/upsert, not replace:
action: "add"(the default): adds a new link, or updates a saved link'suri/isPreferredin place.action: "delete": removes a saved link and queues its removal from Google.- Links you don't reference in the request are left unchanged, omitting a link never removes it.
How a link is matched (for edit/delete): by name if present, otherwise by placeActionType + uri. Include name (from a read endpoint) when you have it, for the most accurate match; a link that hasn't synced to Google yet has no name and is matched by placeActionType + uri.
Valid placeActionType values: APPOINTMENT, ONLINE_APPOINTMENT, DINING_RESERVATION, FOOD_ORDERING, FOOD_DELIVERY, FOOD_TAKEOUT, SHOP_ONLINE. At most one preferred link per type.
Changing a link's URL = remove the old + add the new in the same request:
{ "input": { "id": "TG9jYXRpb246MTgwMDI4OQ==", "placeActionLinks": [ { "placeActionType": "FOOD_ORDERING", "uri": "https://order.example.com", "name": "<link-name-if-synced>", "action": "delete" }, { "placeActionType": "FOOD_ORDERING", "uri": "https://new-order.example.com", "isPreferred": true, "action": "add" } ] }}Right after a write, a link's name and submissionStatus are null; they populate once the link syncs to Google. See the Place Action Links guide for the full flow, including how links discovered directly on Google appear under discoveredPlaceActionLinks.
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", "primaryGbpSiteCategoryId": "gcid:restaurant", "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": [] } ] } }'