POST/api/v4/locations/update

Update a location

Updates writable fields on an existing location. Only the fields you send are changed.

Requires an API key. See Authentication for header format and key rotation.

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.

NameTypeRequiredDescription
input.idstringrequiredThe location's Base64-encoded Relay ID to update.
input.namestringoptionalBusiness name.
input.streetstringoptionalStreet address.
input.citystringoptionalCity.
input.stateIsostringoptionalState/region ISO code.
input.postalCodestringoptionalPostal or ZIP code.
input.countryIsostringoptionalTwo-letter country ISO code.
input.phonestringoptionalPrimary phone number.
input.bizUrlstringoptionalBusiness website URL. Published to directories as the location's website.
input.primaryGbpSiteCategoryIdstringoptionalPrimary Google Business Profile category, as a GCID (e.g. `gcid:restaurant`). Resolved against `countryIso`, so send the two together.
input.additionalGbpSiteCategoryIdsarray of stringsoptionalAdditional Google Business Profile categories, as GCIDs. Also resolved against `countryIso`.
input.offeringsUrlstringoptionalURL of the menu, catalogue, or service list.
input.bookingUrlstringoptionalURL customers use to book an appointment.
input.reservationUrlstringoptionalURL customers use to make a reservation.
input.street1stringoptionalSecond address line (suite, unit, floor).
input.latitudestringoptionalLatitude of the location, as a string. Send with `longitude`; publishers use it when the address alone is ambiguous.
input.longitudestringoptionalLongitude of the location, as a string. Send with `latitude`.
input.ownerEmailstringoptionalEmail of the location owner. Used for listing claims and verification, not for login.
input.ownerNamestringoptionalName of the location owner.
input.facebookUrlstringoptionalURL of the location's Facebook page.
input.twitterUrlstringoptionalURL of the location's X (Twitter) profile.
input.linkedinUrlstringoptionalURL of the location's LinkedIn page.
input.instagramUrlstringoptionalURL of the location's Instagram profile.
input.youtubeUrlstringoptionalURL of the location's YouTube channel.
input.tiktokUrlstringoptionalURL of the location's TikTok profile.
input.pinterestUrlstringoptionalURL of the location's Pinterest profile.
input.taglinestringoptionalShort tagline for the business.
input.descriptionstringoptionalBusiness description. Published to Google Business Profile as the business description.
input.yearOfIncorporationstringoptionalYear the business was incorporated, e.g. `2014`.
input.googleAdsPhonestringoptionalAlternate phone shown on Google Ads location extensions instead of `phone`.
input.additionalPhonesarray of stringsoptionalSecondary phone numbers submitted to Google Business Profile.
input.videosarray of stringsoptionalVideo URLs for the location.
input.additionalCategoryIdsarray of integersoptionalSecondary Listings API subcategory IDs, from the subcategories endpoint. Distinct from `additionalGbpSiteCategoryIds`, which takes Google GCIDs.
input.subCategoryIdintegeroptionalPrimary subcategory ID. Pick a valid ID from the subcategories list endpoint.
input.storeIdstringoptionalUnique store code. Must be unique across the account.
input.enabledSiteIdsarray of integersoptionalSite 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.updateOnlySiteIdsarray of integersoptionalRestrict this update to the given site IDs. Other sites keep their current published values.
input.contentPreferredLanguagestringoptionalPreferred language for the location's published content, e.g. `ENGLISH`.
input.submissionDisabledSiteIdsarray of integersoptionalSite IDs to exclude from submission. The inverse of `enabledSiteIds`, useful when you want every site in your plan except a few.
input.hideAddressbooleanoptionalSet `true` for a service-area business. ListingsAPI stores the address you send but does not submit it to publishers.
input.temporarilyClosedbooleanoptionalSet `true` to stop publishing business hours while the location is temporarily closed.
input.serviceItemsarray of objectsoptionalServices offered, published to Google Business Profile.
input.paymentMethodsarray of stringsoptionalPayment 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.businessHoursarray of objectsoptionalHours. Each entry is `{ day, type, slots }`, plus `specialDate` for a `SPECIAL` entry. Send the full seven-day week when you set hours.
input.businessHours[].daystringrequiredOne of MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY, or SPECIAL (a one-off override for the date in `specialDate`).
input.businessHours[].typestringrequired`OPEN` or `CLOSED`.
input.businessHours[].specialDatestringoptionalDate of a one-off override, as `YYYY-MM-DD`. Set this only when `day` is `SPECIAL`.
input.businessHours[].slotsarray of objectsoptionalOpen intervals for the day, each `{ start, end }` (e.g. `09:00am`, `05:00pm`). Use an empty array when `type` is `CLOSED`.
input.businessHours[].slots[].startstringrequiredOpening time for the interval, e.g. `09:00am`.
input.businessHours[].slots[].endstringrequiredClosing time for the interval, e.g. `05:00pm`.
input.moreHoursarray of objectsoptionalAdditional 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.serviceAreaobjectoptionalService-area business config: `businessType`, `regionCode`, and a `placeInfos` array of `{ placeId, placeName }`.
input.customAttributesarray of objectsoptionalCustom 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.placeActionLinksarray of objectsoptionalGoogle 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.

Request body
{  "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.
Response
{  "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/end inside each slots entry (e.g. 09:00am, 05:00pm); intervals within a day must not overlap.
  • Holiday and event overrides are extra entries with day: "SPECIAL" and a specialDate (YYYY-MM-DD), sent alongside the seven weekday entries, never instead of them.
  • Use SPECIAL only in businessHours. moreHours entries have no specialDate field, so a SPECIAL day there carries no date.
  • Use moreHours for secondary schedules (delivery, drive-through), keyed by hoursTypeId.

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: false and a populated errors array, always check success, not just the status code.

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's uri/isPreferred in 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:

JSON
{  "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.

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