Skip to content

Google Business API

Postproxy publishes local updates to a Google Business Profile location — standard posts, events, offers, and standalone gallery photos. Every post targets a specific location via location_id. Customer reviews are read and replied to through the Profile Comments API.

Every request below uses the base URL https://api.postproxy.dev and an Authorization: Bearer YOUR_API_KEY header. Replace YOUR_API_KEY and the example IDs with your own.

Platform IDgoogle_business
Formatsstandard (default), event, offer, photo
Character limit1,500 (Photo has no body)
MediaOptional (local posts); required (Photo). No video
PlacementsLocations — location_id (required)
CommentsReviews via Profile Comments
Direct messagesNo
Post chainsNo
FormatDescription
standardPlain local post (default)
eventEvent with a title and date range
offerPromotion with a validity window and optional coupon
photoStandalone photo uploaded to the location’s gallery (no text, no CTA)

Shared parameters (standard, event, offer)

Section titled “Shared parameters (standard, event, offer)”
ParameterTypeRequiredDescription
formatstringNostandard (default), event, offer, or photo
location_idstringYesFull location resource path (e.g. accounts/123/locations/456)
language_codestringNoBCP 47 code (e.g. en, de). Defaults to en. Metadata only
cta_action_typestringNoLEARN_MORE, BOOK, ORDER, SHOP, SIGN_UP, or CALL
cta_urlstringConditionalHTTPS URL the CTA button opens. Required for every CTA except CALL
ParameterTypeRequiredDescription
event_titlestringYesEvent title shown on the card
event_start_datestringYesYYYY-MM-DD
event_end_datestringYesYYYY-MM-DD
event_start_timestringNoHH:MM (24-hour)
event_end_timestringNoHH:MM (24-hour)
ParameterTypeRequiredDescription
event_start_datestringYesYYYY-MM-DD — start of validity
event_end_datestringYesYYYY-MM-DD — end of validity
event_start_time / event_end_timestringNoHH:MM (24-hour)
event_titlestringNoOffer headline (defaults to “Special Offer”)
offer_coupon_codestringNoPromo code shown with the offer
offer_redeem_urlstringNoURL where the offer can be redeemed
offer_termsstringNoTerms and conditions
ParameterTypeRequiredDescription
location_idstringYesFull location resource path

photo uploads a single image to the location’s gallery. The post body is ignored, and CTA / language parameters do not apply.

FormatImage maxFormatsCountMin dimensions
standard / event / offer5 MBjpg, png1 (optional)400×300 (recommended 1200×900, 4:3)
photo5 MBjpg, png1 (required)250×250
  • Local-post formats accept text-only posts; photo requires an image and ignores body text.
  • Video is not supported by Google Business local posts or media.
Terminal window
# standard post with a CTA
curl -X POST "https://api.postproxy.dev/api/posts" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"post": { "body": "We are now open on Sundays, 10am–4pm — come visit!" },
"profiles": ["prof_abc123"],
"platforms": {
"google_business": {
"format": "standard",
"location_id": "accounts/123456789/locations/987654321",
"cta_action_type": "LEARN_MORE",
"cta_url": "https://acme.example.com/hours"
}
}
}'
Terminal window
# event
curl -X POST "https://api.postproxy.dev/api/posts" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"post": { "body": "Live music, free coffee, prizes." },
"profiles": ["prof_abc123"],
"platforms": {
"google_business": {
"format": "event",
"location_id": "accounts/123456789/locations/987654321",
"event_title": "5-Year Anniversary",
"event_start_date": "2026-06-15",
"event_end_date": "2026-06-15"
}
}
}'
Terminal window
# offer with a coupon
curl -X POST "https://api.postproxy.dev/api/posts" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"post": { "body": "20% off all whole-bean coffee through the end of the month." },
"profiles": ["prof_abc123"],
"media": ["https://example.com/offer.jpg"],
"platforms": {
"google_business": {
"format": "offer",
"location_id": "accounts/123456789/locations/987654321",
"event_start_date": "2026-06-01",
"event_end_date": "2026-06-30",
"offer_coupon_code": "BEANS20",
"cta_action_type": "SHOP",
"cta_url": "https://example.com/shop"
}
}
}'
Terminal window
# photo (uploads to the location gallery; body is ignored)
curl -X POST "https://api.postproxy.dev/api/posts" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"post": {},
"profiles": ["prof_abc123"],
"media": ["https://example.com/storefront.jpg"],
"platforms": {
"google_business": {
"format": "photo",
"location_id": "accounts/123456789/locations/987654321"
}
}
}'

A Google Business profile may manage multiple Google accounts and any number of locations. List them with the placements endpoint — each placement’s id is the full resource path (e.g. accounts/123456789/locations/987654321) you pass as location_id. It is always required.

Terminal window
# List locations (placements)
curl "https://api.postproxy.dev/api/profiles/prof_abc123/placements" \
-H "Authorization: Bearer YOUR_API_KEY"

Listing issues one call per Google Business account, so responses can be slower when many accounts/locations are linked.

Google Business reviews live on a location, not on a post, so they surface through the Profile Comments API — not the post-level Comments API. Reviews sync twice daily, at 06:00 and 18:00 UTC.

Terminal window
# List reviews (and your replies) for a profile
curl "https://api.postproxy.dev/api/profiles/prof_abc123/comments" \
-H "Authorization: Bearer YOUR_API_KEY"
Terminal window
# Reply to a review — parent_id is the review's external ID
curl -X POST "https://api.postproxy.dev/api/profiles/prof_abc123/comments" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"body": "Thank you for the kind words — see you next time!",
"parent_id": "accounts/123456789/locations/987654321/reviews/AbFvOq"
}'

A profile_comment.created webhook fires for each new review (across all locations of the account).

Not supported.

Subscribe with the Webhooks API:

Terminal window
curl -X POST "https://api.postproxy.dev/api/webhooks" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/webhooks/postproxy",
"events": ["platform_post.published", "profile_comment.created"]
}'

Events relevant to Google Business:

EventWhen
post.processedA post is ready to publish
platform_post.publishedA post was published to the platform
platform_post.failedA post failed to publish (retries exhausted)
platform_post.failed_waiting_for_retryA publish attempt failed; will retry
profile_comment.createdA new review was synced, or a reply was published. Filter on data.object.placement_id per location
profile.connected / .disconnectedConnection state changed
profile.statsNew profile stats snapshot
media.failedA media attachment failed to process
  • location_id is required on every post; it is the full Business Profile resource path.
  • Video is not supported — local posts and the gallery accept images only.
  • Some verticals (e.g. lodging) have local posts disabled by Google and will return a validation error.