Google Business

Google Business management

Run Google Business Profile listings through Pozy, from one location to hundreds: posts, reviews, hours, photos, services, menus and verification.

A Google Business Profile listing is what people see when they search for a business on Google Search and Maps: the hours, the photos, the reviews, the "Order" and "Book" buttons. Pozy lets you manage all of it through the API, for one shop or a chain of locations, with the same account you use to publish posts there.

#What you can do

Job Page
Publish updates, events and offers that appear on the listing Posts
Read and answer reviews, and get an event when a new one arrives Reviews
Change hours, holiday hours, description, phone, website and categories Location details
Set amenities such as Wi-Fi or outdoor seating, and the Book or Order buttons Location details
Add and remove photos and videos Photos and videos
Keep the service list and food menus current Services and menus
Verify a new or unverified location Verification
Read views, calls, direction requests and search keywords Platform insights

Connection details, character limits and media rules for posting are on the Google Business Profile platform page.

#How accounts map to locations

You connect Google Business Profile with Google sign-in on a profile. The person picks a location, and that location becomes one Pozy account (platform: "googlebusiness").

  • One account, one selected location. Every /v1/accounts/{accountId}/gmb-* endpoint acts on the account's selected location.
  • Other locations under the same Google login. Pass locationId as a query parameter to target any other location the login manages, without connecting it separately.
  • Several locations at connect time. In a headless connect, POST /v1/connect/googlebusiness/select-location accepts a locations array and creates one account per location. Any that could not be connected come back in failed.

#Work with many locations

#List the locations

GET /v1/accounts/{accountId}/gmb-locations returns up to 100 locations by default (raise limit up to 500, filter with search) and the one currently selected.

curl "https://api.pozy.ai/v1/accounts/6713b0e5d1f4c69a2b8e3f75/gmb-locations?search=lisbon" \
  -H "Authorization: Bearer $POZY_API_KEY"
Response
{
  "locations": [
    { "id": "4821930576104832190", "name": "Padaria Rosa Chiado", "accountId": "accounts/118273645509", "accountName": "Padaria Rosa", "address": "Rua Garrett 12, Lisboa", "category": "Bakery" },
    { "id": "5930184726391058277", "name": "Padaria Rosa Alfama", "accountId": "accounts/118273645509", "accountName": "Padaria Rosa", "address": "Rua dos Remédios 40, Lisboa", "category": "Bakery" }
  ],
  "hasMore": false,
  "selectedLocationId": "4821930576104832190",
  "cached": true
}

#Target a location

Pass ?locationId=5930184726391058277 on any gmb-* call. When posting, put locationId: "locations/5930184726391058277" in platformSpecificData, one platforms entry per location (multi-location posts).

#Change the default (optional)

PUT /v1/accounts/{accountId}/gmb-locations with selectedLocationId changes which location the account uses when you leave locationId out. Include googleAccountId (the accountId resource name from the list); large Google accounts need it.

#Give a location its own profile (optional)

Agencies often keep one Pozy profile per client. POST /v1/accounts/{accountId}/gmb-locations/assign creates a new account for one location on another profile, reusing the existing Google sign-in. No second consent screen is needed.

cURL
curl -X POST https://api.pozy.ai/v1/accounts/6713b0e5d1f4c69a2b8e3f75/gmb-locations/assign \
  -H "Authorization: Bearer $POZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "profileId": "6717f4c9b5d8a03e6f2c7d19",
    "selectedLocationId": "locations/5930184726391058277",
    "googleAccountId": "accounts/118273645509"
  }'

The new account's selectedLocationId comes back as bare digits. Post to it with its own accountId and no locationId.

#Verified locations only

Google only shows reviews, accepts most edits and returns full listing data for locations that are verified and matched to a published Maps place. Google calls this Voice of Merchant. Before you build anything on a location, read GET /v1/accounts/{accountId}/gmb-verifications and check voiceOfMerchantState.hasVoiceOfMerchant. If it is false, start with Verification.

#Errors you will see everywhere

Every gmb-* endpoint passes Google's own complaint through when Google rejects a request.

Status Meaning Fix
400 with code gbp_bad_request Google rejected a field, a mask or a value Read error, fix the field and retry
401 with code token_invalid Google revoked or expired the sign-in Reconnect the account
403 The Google login has no permission on this location Ask an owner or manager of the listing to connect
404 The accountId is not one of your accounts Check the id

#Endpoints

Endpoint What it does
GET /v1/accounts/{accountId}/gmb-locations List Google Business Profile locations
PUT /v1/accounts/{accountId}/gmb-locations Update Google Business Profile location
POST /v1/accounts/{accountId}/gmb-locations/assign Assign Google Business Profile location to another profile
GET /v1/connect/googlebusiness/locations List Google Business Profile locations
POST /v1/connect/googlebusiness/select-location Select Google Business Profile location
GET /v1/analytics/googlebusiness/performance Get Google Business Profile performance metrics
GET /v1/analytics/googlebusiness/search-keywords Get Google Business Profile search keywords

#Webhook events

Event When it fires
account.connected Account connected.
account.disconnected Account disconnected.
review.new Review new.
review.updated Review updated.
review.deleted Review deleted.
review.restored Review restored.