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.
At a glance
Section titled “At a glance”| Platform ID | google_business |
| Formats | standard (default), event, offer, photo |
| Character limit | 1,500 (Photo has no body) |
| Media | Optional (local posts); required (Photo). No video |
| Placements | Locations — location_id (required) |
| Comments | Reviews via Profile Comments |
| Direct messages | No |
| Post chains | No |
Publishing
Section titled “Publishing”Formats
Section titled “Formats”| Format | Description |
|---|---|
standard | Plain local post (default) |
event | Event with a title and date range |
offer | Promotion with a validity window and optional coupon |
photo | Standalone photo uploaded to the location’s gallery (no text, no CTA) |
Shared parameters (standard, event, offer)
Section titled “Shared parameters (standard, event, offer)”| Parameter | Type | Required | Description |
|---|---|---|---|
format | string | No | standard (default), event, offer, or photo |
location_id | string | Yes | Full location resource path (e.g. accounts/123/locations/456) |
language_code | string | No | BCP 47 code (e.g. en, de). Defaults to en. Metadata only |
cta_action_type | string | No | LEARN_MORE, BOOK, ORDER, SHOP, SIGN_UP, or CALL |
cta_url | string | Conditional | HTTPS URL the CTA button opens. Required for every CTA except CALL |
event — additional parameters
Section titled “event — additional parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
event_title | string | Yes | Event title shown on the card |
event_start_date | string | Yes | YYYY-MM-DD |
event_end_date | string | Yes | YYYY-MM-DD |
event_start_time | string | No | HH:MM (24-hour) |
event_end_time | string | No | HH:MM (24-hour) |
offer — additional parameters
Section titled “offer — additional parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
event_start_date | string | Yes | YYYY-MM-DD — start of validity |
event_end_date | string | Yes | YYYY-MM-DD — end of validity |
event_start_time / event_end_time | string | No | HH:MM (24-hour) |
event_title | string | No | Offer headline (defaults to “Special Offer”) |
offer_coupon_code | string | No | Promo code shown with the offer |
offer_redeem_url | string | No | URL where the offer can be redeemed |
offer_terms | string | No | Terms and conditions |
photo — parameters
Section titled “photo — parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
location_id | string | Yes | Full 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.
| Format | Image max | Formats | Count | Min dimensions |
|---|---|---|---|---|
standard / event / offer | 5 MB | jpg, png | 1 (optional) | 400×300 (recommended 1200×900, 4:3) |
photo | 5 MB | jpg, png | 1 (required) | 250×250 |
- Local-post formats accept text-only posts;
photorequires an image and ignores body text. - Video is not supported by Google Business local posts or media.
# standard post with a CTAcurl -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" } } }'# eventcurl -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" } } }'# offer with a couponcurl -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" } } }'# 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" } } }'Placements
Section titled “Placements”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.
# 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.
Reviews
Section titled “Reviews”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.
# List reviews (and your replies) for a profilecurl "https://api.postproxy.dev/api/profiles/prof_abc123/comments" \ -H "Authorization: Bearer YOUR_API_KEY"# Reply to a review — parent_id is the review's external IDcurl -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).
Direct messages
Section titled “Direct messages”Not supported.
Webhooks
Section titled “Webhooks”Subscribe with the Webhooks API:
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:
| Event | When |
|---|---|
post.processed | A post is ready to publish |
platform_post.published | A post was published to the platform |
platform_post.failed | A post failed to publish (retries exhausted) |
platform_post.failed_waiting_for_retry | A publish attempt failed; will retry |
profile_comment.created | A new review was synced, or a reply was published. Filter on data.object.placement_id per location |
profile.connected / .disconnected | Connection state changed |
profile.stats | New profile stats snapshot |
media.failed | A media attachment failed to process |
location_idis 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.