Business Profile Management
Manage location details, attributes, services, menus, media, reviews, and verifications
Business Profile Management
Beyond posting, you can manage your Google Business Profile listing directly through the API. Each subsection below covers a specific management feature.
Food Menus
Manage food menus for locations that support them (restaurants, cafes, etc.). Menu items support price (with currency code), dietaryRestriction (VEGETARIAN, VEGAN, GLUTEN_FREE), allergen (DAIRY, GLUTEN, SHELLFISH), spiciness, servesNumPeople, and preparationMethods.
// Get menus
const menus = await zernio.gmbfoodmenus.getGoogleBusinessFoodMenus('YOUR_ACCOUNT_ID');
console.log('Food menus:', menus);
// Update menus
await zernio.gmbfoodmenus.updateGoogleBusinessFoodMenus('YOUR_ACCOUNT_ID', {
menus: [{
labels: [{ displayName: 'Lunch Menu', languageCode: 'en' }],
sections: [{
labels: [{ displayName: 'Appetizers' }],
items: [{
labels: [{ displayName: 'Caesar Salad', description: 'Romaine, parmesan, croutons' }],
attributes: {
price: { currencyCode: 'USD', units: '12' },
dietaryRestriction: ['VEGETARIAN']
}
}]
}]
}],
updateMask: 'menus'
});# Get menus
menus = client.accounts.get_google_business_food_menus("YOUR_ACCOUNT_ID")
print("Food menus:", menus)
# Update menus
client.accounts.update_google_business_food_menus("YOUR_ACCOUNT_ID",
menus=[{
"labels": [{"displayName": "Lunch Menu", "languageCode": "en"}],
"sections": [{
"labels": [{"displayName": "Appetizers"}],
"items": [{
"labels": [{"displayName": "Caesar Salad", "description": "Romaine, parmesan, croutons"}],
"attributes": {
"price": {"currencyCode": "USD", "units": "12"},
"dietaryRestriction": ["VEGETARIAN"]
}
}]
}]
}],
update_mask="menus"
)# Get menus
curl -X GET https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-food-menus \
-H "Authorization: Bearer YOUR_API_KEY"
# Update menus
curl -X PUT https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-food-menus \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"menus": [{
"labels": [{"displayName": "Lunch Menu", "languageCode": "en"}],
"sections": [{
"labels": [{"displayName": "Appetizers"}],
"items": [{
"labels": [{"displayName": "Caesar Salad", "description": "Romaine, parmesan, croutons"}],
"attributes": {
"price": {"currencyCode": "USD", "units": "12"},
"dietaryRestriction": ["VEGETARIAN"]
}
}]
}]
}],
"updateMask": "menus"
}'See the GMB Food Menus API Reference for full schema details.
Location Details
Read and update your business information including hours, special hours, description, phone numbers, and website. Use readMask to request specific fields and updateMask to update them. Available fields include regularHours, specialHours, profile.description, websiteUri, and phoneNumbers.
// Get location details
const details = await zernio.gmblocationdetails.getGoogleBusinessLocationDetails('YOUR_ACCOUNT_ID', {
readMask: 'regularHours,specialHours,profile,websiteUri'
});
// Update business hours
await zernio.gmblocationdetails.updateGoogleBusinessLocationDetails('YOUR_ACCOUNT_ID', {
updateMask: 'regularHours',
regularHours: {
periods: [
{ openDay: 'MONDAY', openTime: '09:00', closeDay: 'MONDAY', closeTime: '17:00' },
{ openDay: 'TUESDAY', openTime: '09:00', closeDay: 'TUESDAY', closeTime: '17:00' }
]
}
});# Get location details
details = client.accounts.get_google_business_location_details("YOUR_ACCOUNT_ID",
read_mask="regularHours,specialHours,profile,websiteUri"
)
# Update business hours
client.accounts.update_google_business_location_details("YOUR_ACCOUNT_ID",
update_mask="regularHours",
regular_hours={
"periods": [
{"openDay": "MONDAY", "openTime": "09:00", "closeDay": "MONDAY", "closeTime": "17:00"},
{"openDay": "TUESDAY", "openTime": "09:00", "closeDay": "TUESDAY", "closeTime": "17:00"}
]
}
)# Get location details
curl -X GET "https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-location-details?readMask=regularHours,specialHours,profile,websiteUri" \
-H "Authorization: Bearer YOUR_API_KEY"
# Update business hours
curl -X PUT https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-location-details \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"updateMask": "regularHours",
"regularHours": {
"periods": [
{"openDay": "MONDAY", "openTime": "09:00", "closeDay": "MONDAY", "closeTime": "17:00"},
{"openDay": "TUESDAY", "openTime": "09:00", "closeDay": "TUESDAY", "closeTime": "17:00"}
]
}
}'See the GMB Location Details API Reference for the full schema.
Verification
Check a location's verification status and drive the verification flow programmatically. GET /gmb-verifications returns the location's Voice of Merchant state plus its verification history. hasVoiceOfMerchant tells you whether the listing is verified and published; when it is false, verify.hasPendingVerification tells you whether a verification is already in progress (so you can distinguish "pending" from "not started").
To verify a location: call POST /gmb-verifications/options to see which methods Google offers, POST /gmb-verifications to start one (Google then mails a postcard, calls, or texts the business), and POST /gmb-verifications/{verificationId}/complete with the PIN to finish.
Reviews, edits, and other listing data only surface once a location is matched to a published Google Maps place (it has a placeId, visible via Location Details) and has Voice of Merchant. If GET /gmb-reviews returns an empty array for a listing that has reviews on Google, check hasVoiceOfMerchant here first: the connected location is usually not yet verified or not yet matched to its Maps place.
POST /gmb-verifications is a real-world action: it triggers Google to send a postcard, call, or SMS to the business. Service-area businesses must include a context (service address) when fetching options, otherwise Google returns a 400.
// 1. Check verification state
const { data: state } = await zernio.gmbverifications.getGoogleBusinessVerifications({
path: { accountId: 'YOUR_ACCOUNT_ID' }
});
// 2. See which methods are available
const { data: options } = await zernio.gmbverifications.fetchGoogleBusinessVerificationOptions({
path: { accountId: 'YOUR_ACCOUNT_ID' },
body: { languageCode: 'en-US' }
});
// 3. Start a verification (e.g. by SMS)
const { data: started } = await zernio.gmbverifications.startGoogleBusinessVerification({
path: { accountId: 'YOUR_ACCOUNT_ID' },
body: { method: 'SMS', languageCode: 'en-US', phoneNumber: '+14155550123' }
});
// 4. Complete it with the PIN Google sent
await zernio.gmbverifications.completeGoogleBusinessVerification({
path: { accountId: 'YOUR_ACCOUNT_ID', verificationId: 'VERIFICATION_ID' },
body: { pin: '123456' }
});# 1. Check verification state
state = client.accounts.get_google_business_verifications("YOUR_ACCOUNT_ID")
# 2. See which methods are available
options = client.accounts.fetch_google_business_verification_options(
"YOUR_ACCOUNT_ID", language_code="en-US"
)
# 3. Start a verification (e.g. by SMS)
started = client.accounts.start_google_business_verification(
"YOUR_ACCOUNT_ID", method="SMS", language_code="en-US", phone_number="+14155550123"
)
# 4. Complete it with the PIN Google sent
client.accounts.complete_google_business_verification(
"YOUR_ACCOUNT_ID", "VERIFICATION_ID", pin="123456"
)# 1. Check verification state
curl -X GET "https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-verifications" \
-H "Authorization: Bearer YOUR_API_KEY"
# 2. See which methods are available
curl -X POST "https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-verifications/options" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "languageCode": "en-US" }'
# 3. Start a verification (e.g. by SMS)
curl -X POST "https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-verifications" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "method": "SMS", "languageCode": "en-US", "phoneNumber": "+14155550123" }'
# 4. Complete it with the PIN Google sent
curl -X POST "https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-verifications/VERIFICATION_ID/complete" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "pin": "123456" }'See the GMB Verification API Reference for the full schema.
Media (Photos)
Upload, list, and delete photos for your Google Business Profile listing. Photo categories: COVER, PROFILE, LOGO, EXTERIOR, INTERIOR, FOOD_AND_DRINK, MENU, PRODUCT, TEAMS, ADDITIONAL.
// List photos
const media = await zernio.gmbmedia.listGoogleBusinessMedia('YOUR_ACCOUNT_ID');
// Upload a photo
await zernio.gmbmedia.createGoogleBusinessMedia('YOUR_ACCOUNT_ID', {
sourceUrl: 'https://example.com/photos/interior.jpg',
description: 'Dining area with outdoor seating',
category: 'INTERIOR'
});# List photos
media = client.accounts.list_google_business_media("YOUR_ACCOUNT_ID")
# Upload a photo
client.accounts.create_google_business_media("YOUR_ACCOUNT_ID",
source_url="https://example.com/photos/interior.jpg",
description="Dining area with outdoor seating",
category="INTERIOR"
)# List photos
curl -X GET https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-media \
-H "Authorization: Bearer YOUR_API_KEY"
# Upload a photo
curl -X POST https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-media \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sourceUrl": "https://example.com/photos/interior.jpg",
"description": "Dining area with outdoor seating",
"category": "INTERIOR"
}'See the GMB Media API Reference for full details.
Attributes
Manage amenities and services like delivery, Wi-Fi, outdoor seating, and payment types. Available attributes vary by business category. Common ones include has_dine_in, has_takeout, has_delivery, has_wifi, has_outdoor_seating, and pay_credit_card_types_accepted.
// Get attributes
const attrs = await zernio.gmbattributes.getGoogleBusinessAttributes('YOUR_ACCOUNT_ID');
// Update attributes
await zernio.gmbattributes.updateGoogleBusinessAttributes('YOUR_ACCOUNT_ID', {
attributes: [
{ name: 'has_delivery', values: [true] },
{ name: 'has_outdoor_seating', values: [true] }
],
attributeMask: 'has_delivery,has_outdoor_seating'
});# Get attributes
attrs = client.accounts.get_google_business_attributes("YOUR_ACCOUNT_ID")
# Update attributes
client.accounts.update_google_business_attributes("YOUR_ACCOUNT_ID",
attributes=[
{"name": "has_delivery", "values": [True]},
{"name": "has_outdoor_seating", "values": [True]}
],
attribute_mask="has_delivery,has_outdoor_seating"
)# Get attributes
curl -X GET https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-attributes \
-H "Authorization: Bearer YOUR_API_KEY"
# Update attributes
curl -X PUT https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-attributes \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"attributes": [
{"name": "has_delivery", "values": [true]},
{"name": "has_outdoor_seating", "values": [true]}
],
"attributeMask": "has_delivery,has_outdoor_seating"
}'See the GMB Attributes API Reference for full details.
Place Actions
Manage booking, ordering, and reservation buttons that appear on your listing. Action types: APPOINTMENT, ONLINE_APPOINTMENT, DINING_RESERVATION, FOOD_ORDERING, FOOD_DELIVERY, FOOD_TAKEOUT, SHOP_ONLINE.
// List place actions
const actions = await zernio.gmbplaceactions.listGoogleBusinessPlaceActions('YOUR_ACCOUNT_ID');
// Create a place action
await zernio.gmbplaceactions.createGoogleBusinessPlaceAction('YOUR_ACCOUNT_ID', {
uri: 'https://order.ubereats.com/mybusiness',
placeActionType: 'FOOD_ORDERING'
});# List place actions
actions = client.accounts.list_google_business_place_actions("YOUR_ACCOUNT_ID")
# Create a place action
client.accounts.create_google_business_place_action("YOUR_ACCOUNT_ID",
uri="https://order.ubereats.com/mybusiness",
place_action_type="FOOD_ORDERING"
)# List place actions
curl -X GET https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-place-actions \
-H "Authorization: Bearer YOUR_API_KEY"
# Create a place action
curl -X POST https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-place-actions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"uri": "https://order.ubereats.com/mybusiness",
"placeActionType": "FOOD_ORDERING"
}'See the GMB Place Actions API Reference for full details.
Services
Get and manage the services offered by a Google Business Profile location. Services can be structured (using a predefined serviceTypeId) or free-form (custom label), with an optional price.
Note: Google's API requires full replacement of the service list. Use
PUT /v1/accounts/{accountId}/gmb-servicesto replace the entire list.
// Get services
const services = await zernio.gmbservices.getGoogleBusinessServices('YOUR_ACCOUNT_ID');
console.log('Services:', services);
// Replace services (full replacement)
await zernio.gmbservices.updateGoogleBusinessServices('YOUR_ACCOUNT_ID', {
serviceItems: [
{
freeFormServiceItem: {
category: 'categories/gcid:plumber',
label: {
displayName: 'Pipe Repair',
description: 'Emergency and scheduled pipe repair'
}
},
price: { currencyCode: 'USD', units: '150' }
}
]
});# Get services
services = client.gmb_services.get_google_business_services("YOUR_ACCOUNT_ID")
print("Services:", services)
# Replace services (full replacement)
client.gmb_services.update_google_business_services("YOUR_ACCOUNT_ID",
service_items=[
{
"freeFormServiceItem": {
"category": "categories/gcid:plumber",
"label": {
"displayName": "Pipe Repair",
"description": "Emergency and scheduled pipe repair"
}
},
"price": {"currencyCode": "USD", "units": "150"}
}
]
)# Get services
curl -X GET https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-services \
-H "Authorization: Bearer YOUR_API_KEY"
# Replace services (full replacement)
curl -X PUT https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-services \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"serviceItems": [
{
"freeFormServiceItem": {
"category": "categories/gcid:plumber",
"label": {
"displayName": "Pipe Repair",
"description": "Emergency and scheduled pipe repair"
}
},
"price": {
"currencyCode": "USD",
"units": "150"
}
}
]
}'// List place actions
const actions = await zernio.gmbplaceactions.listGoogleBusinessPlaceActions('YOUR_ACCOUNT_ID');
// Create a place action
await zernio.gmbplaceactions.createGoogleBusinessPlaceAction('YOUR_ACCOUNT_ID', {
uri: 'https://order.ubereats.com/mybusiness',
placeActionType: 'FOOD_ORDERING'
});# List place actions
actions = client.accounts.list_google_business_place_actions("YOUR_ACCOUNT_ID")
# Create a place action
client.accounts.create_google_business_place_action("YOUR_ACCOUNT_ID",
uri="https://order.ubereats.com/mybusiness",
place_action_type="FOOD_ORDERING"
)# List place actions
curl -X GET https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-place-actions \
-H "Authorization: Bearer YOUR_API_KEY"
# Create a place action
curl -X POST https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-place-actions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"uri": "https://order.ubereats.com/mybusiness",
"placeActionType": "FOOD_ORDERING"
}'See the GMB Place Actions API Reference for full details.
Update an existing place action
Use PATCH /v1/accounts/{accountId}/gmb-place-actions to update an existing action link (change uri and/or placeActionType). Only fields included in the request body are updated.
await zernio.gmbplaceactions.updateGoogleBusinessPlaceAction('YOUR_ACCOUNT_ID', {
name: 'locations/123/placeActionLinks/456',
uri: 'https://order.doordash.com/joespizza'
});client.accounts.update_google_business_place_action("YOUR_ACCOUNT_ID",
name="locations/123/placeActionLinks/456",
uri="https://order.doordash.com/joespizza"
)curl -X PATCH "https://zernio.com/api/v1/accounts/YOUR_ACCOUNT_ID/gmb-place-actions" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "locations/123/placeActionLinks/456",
"uri": "https://order.doordash.com/joespizza"
}'