Google Business Profile
Publish updates, events and offers to a Google Business Profile location with the Zernio API, then manage its reviews, listing details and performance metrics.
Publish updates, events and offers to Google Business Profile (googlebusiness) with POST /v1/posts and platform: "googlebusiness". The same account also serves reviews, listing management (hours, photos, services, menus, verification) and location-level performance metrics.
Quick reference
| Property | Value |
|---|---|
| Character limit | 1,500 |
| Images per post | 1 |
| Videos per post | Not supported |
| Image formats | JPEG, PNG only (WebP auto-converted) |
| Image max size | 5 MB |
| Image min dimensions | 400 x 300 px |
| Post types | Text, Text+Image, Text+CTA, Event, Offer |
| Scheduling | Yes |
| Inbox (Reviews) | Yes |
| Inbox (DMs/Comments) | No |
| Analytics | Location-level only (per-post deprecated by Google) |
Before you start
Google Business Profile requires a verified location. Posts appear in Google Search, Google Maps and the Knowledge Panel rather than in a social feed, and they contribute to local search ranking. A post stays visible for about 7 days before Google archives it, so post at least weekly. Videos are not supported, and a text-only post works but gets less visibility than one with an image or a call-to-action button.
Connect
Call GET /v1/connect/googlebusiness with profileId (Get OAuth connect URL) and send the user's browser to the returned authUrl. After Google's consent screen the user picks which location to connect; Zernio hosts that screen by default, or pass headless=true and build it yourself with List locations and Select location. The connecting accounts guide covers both modes and scopes; Account health reports what a connected account can do.
import Zernio from '@zernio/node';
const zernio = new Zernio();
const { data: connect } = await zernio.connect.getConnectUrl({
path: { platform: 'googlebusiness' },
query: { profileId: '66a1f0c2a4b9d3e8f1a2b3c4', redirect_url: 'https://myapp.com/callback' }
});
// Send the user's browser to connect.authUrlResponse (200):
{
"authUrl": "https://accounts.google.com/o/oauth2/v2/auth?client_id=...",
"state": "..."
}After the location is selected the user lands on redirect_url with connected=googlebusiness&profileId=...&accountId=... appended. One account is one location; an account that manages several locations posts to the others with locationId, see Multi-Location Posting.
OAuth scopes
| Scope | What it enables |
|---|---|
https://www.googleapis.com/auth/business.manage | Manage locations: local posts, reviews and performance metrics |
https://www.googleapis.com/auth/userinfo.profile | Account identity during connection |
https://www.googleapis.com/auth/userinfo.email | Account email during connection |
Publish
A plain post becomes a STANDARD update on the connected location. Call POST /v1/posts with content, at most one image in mediaItems, a platforms entry with platform: "googlebusiness" and publishNow: true:
curl -X POST https://zernio.com/api/v1/posts \
-H "Authorization: Bearer $ZERNIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "Open all holiday weekend. Stop by for the seasonal menu.",
"mediaItems": [
{"type": "image", "url": "https://cdn.example.com/holiday-special.jpg"}
],
"platforms": [
{"platform": "googlebusiness", "accountId": "66b2e19d8c3f5a7e9d0b1c2d"}
],
"publishNow": true
}'Response (201):
{
"post": {
"_id": "65f1c0a9e2b5af0012ab34cd",
"status": "published",
"platforms": [
{
"platform": "googlebusiness",
"status": "published",
"platformPostId": "1234567890123456789",
"platformPostUrl": "https://business.google.com/..."
}
]
}
}Replace publishNow with scheduledFor and timezone to schedule it. Call-to-action buttons, text-only posts and edits are on Posts & Content Types; topicType: "EVENT" and "OFFER" are on Event & Offer Posts.
In this section
Posts & Content Types
Create a post with an image, add a call-to-action button and edit a published post
Event & Offer Posts
Event and offer posts with topicType, event and offer
Multi-Location Posting
List the locations an account manages and post to several at once
Business Profile Management
Verification, hours, photos, attributes and action links
Services & Food Menus
The service list, and the menus of a restaurant or cafe
Analytics
Daily performance metrics and the search keywords that triggered impressions
Inbox
List and reply to reviews
Fields, Media & Limits
Media requirements, every platformSpecificData field and common errors
Common errors
| Error | Cause | Fix |
|---|---|---|
402 with code: "PAYMENT_REQUIRED" on GET /v1/connect/googlebusiness | A billing gate stopped the connection before OAuth started, usually no payment method on file. | Send the user to the dashboard_url in the response, then call connect again. |
500 on GET /v1/connect/googlebusiness/locations | Google refused the listing: the token is invalid, or the user lacks permission on the Google Business account. | Restart the connect flow so the user re-authorizes with business.manage. |
404 on POST /v1/connect/googlebusiness/select-location | locationId is not one of the locations this connection manages. | Pass an id from the List locations response of the same flow. |
The publish-time errors are in Fields, Media & Limits, and Error handling covers the envelope.
Related
- Connecting accounts: the OAuth flow and the location selection step.
- Create post: every field of the request.
- Media uploads: upload images instead of hosting them.
- Reviews: the inbox API for reviews.
- Performance metrics: daily impressions, clicks, calls, directions and bookings.
Threads
Publish text, image, video and carousel posts and thread sequences to Threads with the Zernio API, with topic tags, first comments and reply management.
Posts & Content Types
Create a Google Business Profile post with an image, add a call-to-action button, publish text only and edit a published post.