Skip to main content
A Google Business Profile location is one business listing on Google Search and Maps. In SocialAPI, each connected google account is one location. These endpoints list the locations a Google login manages, connect another one to a brand, update a location’s public profile, and manage the photos and videos on it.

Endpoints

{loginId} is the login_id returned when you connect Google and on every Google account: see Choose a Google Business Profile. {id} is the connected account ID (acc_...). The full schemas are in the API reference.

Read a location’s details

GET /v1/platforms/google/logins/{loginId}/locations returns the locations the Google login can manage, read from Google at request time. A location added in Google Business Profile after the login was authorized appears at once, with no new consent screen.
Response (HTTP 200):
details carries these fields. Each one is absent when Google returns no value for it, so treat every field as optional. A service-area business (a locksmith, a plumber) has no storefront_address and carries service_area instead. A boolean flag that is absent means Google told SocialAPI nothing. It does not mean false: check that the key is present before treating a flag as a denial.

Connect another location to a brand

POST /v1/platforms/google/logins/{loginId}/locations/{locationId}/assign connects one location from the login to a brand, without a second consent screen. {locationId} is the platform_account_id, with the slashes either sent as they are or URL-encoded as %2F.
Response (HTTP 201):
The rules:
  • One brand per location. A location belongs to exactly 1 brand. Assigning a location that another brand holds returns 400 validation.location_already_assigned.
  • One Google Business Profile per brand. A brand holds at most 1 location. Assigning a second location to the same brand returns 409 platform.google.brand_has_account. Disconnect the first account, or assign the location to another brand.
  • The login must still grant the location. A location the login no longer manages returns 400 validation.location_not_granted.
  • The brand must exist. An unknown brand returns 404 brand.not_found. A missing brand_id returns 400 validation.field_required.
  • Cost. Assigning a location costs no credits.
When the Google login manages more than 1 location, the connect flow pauses so you choose one. The other locations stay available on the same login: assign each to another brand with this endpoint.

Update a location

PUT /v1/platforms/google/accounts/{id} writes the location’s public profile. Send only the fields you want to change:
Response (HTTP 200): the location as Google now holds it, in data, in the shape of details above:
The writable fields:
A field you omit is left alone. A field you send with an empty value is cleared: "website_uri": "" removes the website. Send only the fields you mean to change, and never send back a location you just read. Fields the read omitted would arrive empty and erase what is there.
Lists replace instead of merging: regular_hours.periods, labels, additional_phones, and additional_categories each overwrite the whole list, so include every entry you want to keep. Objects merge: inside storefront_address you can send only postal_code and the rest of the address stays. Not writable: place_id, maps_uri, new_review_uri, and the status flags are output only. language_code is fixed when the location is created. A request with none of the writable fields returns 400 validation.no_fields_to_update. A value Google rejects returns 502 platform.google.api_error, with Google’s reason in error.message.

Validate before you write

Google has no sandbox, so every write changes a real Business Profile. Add validate_only=true to have Google check the change and apply nothing:
Response (HTTP 200):

Edits are moderated

A 200 means Google accepted the change for review. It does not mean the change is live on Search and Maps. Read the location back to see what is live, and check details.has_pending_edits for edits still under review.

Profile media

A location’s profile carries its own photos and videos: the logo, the cover image, interior and exterior shots. They are separate from the media attached to a post, and they are what customers see on the listing. GET /v1/platforms/google/accounts/{id}/media lists them:
Response (HTTP 200):
GET /v1/platforms/google/accounts/{id}/media/{mediaId} returns one item. mediaId accepts the bare ID or the full resource name from the list.

Add a photo or video

POST /v1/platforms/google/accounts/{id}/media adds one item. media takes exactly 1 entry, in the same {source_type, source} form the publishing endpoints accept:
Response (HTTP 201): the new item, in the shape of a list item. category is one of COVER, PROFILE, LOGO, EXTERIOR, INTERIOR, PRODUCT, AT_WORK, FOOD_AND_DRINK, MENU, COMMON_AREA, ROOMS, TEAMS, or ADDITIONAL. PROFILE sets the avatar shown for the location. LOGO is the fallback when no PROFILE photo exists. A request with other than 1 media entry returns 422 google.media.single_item_required. An unknown category returns 422 google.media.invalid_category. A media entry that cannot be resolved returns 422 google.media.unresolvable.

Remove a photo or video

DELETE /v1/platforms/google/accounts/{id}/media/{mediaId} removes an item you added and returns 204 with no body. mediaId accepts the bare ID or the full resource name.

Photos your customers posted

Customers add their own photos to a listing. They live in a separate read-only gallery. Read it with contributed=true:
Each item carries an attribution block with profile_name, profile_photo_url, profile_url, and takedown_url. Google requires you to display the attribution exactly as given, without changing or removing it. A delete on a customer photo returns 403 platform.google.access_denied. Report the photo to Google through its takedown_url instead.

Limits

Scopes

Last modified on October 13, 2026