Postproxy now covers the full Google Business Profile API: posts, reviews, profile management, and analytics
Every Google Business Profile surface behind one API key — local posts, events, offers, photos, reviews, hours, attributes, services, food menus, action links, and per-location performance. No Google API access request.
Postproxy now exposes the whole Google Business Profile API through one OAuth connection: local posts, events, offers, and gallery photos; review listing and replies; opening hours, attributes, services, food menus, and place action links; and 30-day performance metrics per location. Eighteen profile-management endpoints joined the existing publishing, reviews, and stats surfaces on August 31, 2026.
What changed
In May, Google Business Profile joined Postproxy as a publishing target: standard posts, events, offers, and review replies. Since then three more layers shipped, and with the August 31 release the platform is covered end to end.
| Surface | What you can do | Where it lives |
|---|---|---|
| Local posts | Publish standard, event, and offer posts with CTA buttons; upload standalone gallery photos; schedule, queue, draft, and approve them like any other network | POST /api/posts |
| Reviews | List every review across every location, reply, edit or delete your reply, get a webhook on each new review | Profile Comments API |
| Business Profile management | Read and update the location itself: name, phone, website, description, categories, address, temporary closures | Location endpoints |
| Hours | Regular weekly hours, special hours for holidays, and named extra sets such as kitchen or delivery hours | Hours endpoint |
| Attributes | Payments accepted, accessibility, amenities, menu and booking URLs — whatever Google allows for the location’s category | Attributes endpoints |
| Services and food menus | The service list on service-business profiles; full menu → section → item → price structures on restaurant profiles | Service list, Food menus |
| Place action links | The “Order online”, “Book”, and “Reserve a table” buttons: list, create, update, delete, set the preferred one | Place action links |
| Profile media | List, add, and delete photos on the profile with a category such as COVER, LOGO, INTERIOR, or MENU | Profile media |
| Location analytics | Search and Maps impressions, website clicks, call clicks, direction requests, conversations, bookings, food orders — per location, as a timeseries | Profile stats |
Every request carries the same location_id you already use to post, and every profile connected to Postproxy can call every endpoint. There is no second connection, no extra scope, and no separate plan.
Which Google APIs does this replace?
Google does not ship one Business Profile API. It ships nine, each enabled separately in Google Cloud and each with its own resource shapes:
- My Business Account Management API — accounts and which locations they own
- My Business Business Information API — the location resource, attributes, categories, service items
- My Business Verifications API — verification state
- Business Profile Performance API — impressions, clicks, calls, directions
- My Business Q&A API — questions and answers on the listing
- My Business Notifications API — Pub/Sub push for new reviews and updates
- Place Actions API — action links
- My Business Lodging API — hotel-specific attributes
- Google My Business API v4.9 — still the only home for local posts, reviews, media, and food menus
A developer covering the surfaces in the table above touches at least five of these. Postproxy collapses them into one base path, one auth header, and one location_id. Payloads for the management endpoints keep Google’s own field names and shapes, so a GET response can be edited and sent straight back as the PATCH body, and anything you learn from Google’s documentation still applies.
Do you still need Google API access approval?
No. Direct use of the Business Profile APIs requires a manual access request to Google. The project starts with a quota of zero requests per minute until Google reviews and approves the application, and approval is tied to a business justification. Postproxy’s Google app is already approved, so connecting a Business Profile is a normal OAuth consent: the owner or manager of the profile signs in once, and every location that account manages becomes a placement.
Teams that already hold their own approval can keep it. Bring-your-own-keys is available for Google Business, so profiles can authenticate through your Cloud project and your quota instead of the shared pool.
How does multi-location work?
One connected profile covers every Google account the signed-in user manages and every location under those accounts. List placements returns the locations with their full resource path and Google Maps Place ID:
curl "https://api.postproxy.dev/api/profiles/prof_abc123/placements" \ -H "Authorization: Bearer YOUR_API_KEY"{ "data": [ { "id": "accounts/113344/locations/558899", "name": "Acme Coffee — Downtown", "metadata": { "place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4" } }, { "id": "accounts/113344/locations/558900", "name": "Acme Coffee — Airport", "metadata": { "place_id": "ChIJrTLr-GyuEmsRBfy61i59si0" } } ]}Anything that has to happen on all of them is a loop over that list. Setting holiday hours on forty locations:
const placements = await api("GET", `/api/profiles/${PROFILE}/placements`);
for (const loc of placements.data) { await api("PATCH", `/api/profiles/${PROFILE}/google_business/update_hours`, { location_id: loc.id, fields: ["specialHours"], specialHours: { specialHourPeriods: [ { startDate: { year: 2026, month: 12, day: 25 }, closed: true }, { startDate: { year: 2026, month: 12, day: 31 }, openTime: "09:00", closeTime: "15:00" } ] } });}Placements can be split across profile groups, so an agency can connect one Google account and hand each client’s locations to that client’s group, with group-scoped API keys that only see their own locations. The agencies page covers that setup.
What does the profile-management API look like?
Every write is field-masked. A PATCH names the parts of the resource it replaces in a fields array, and only those parts change:
curl -X PATCH "https://api.postproxy.dev/api/profiles/prof_abc123/google_business/update_location" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "location_id": "accounts/113344/locations/558899", "fields": ["websiteUri", "profile"], "websiteUri": "https://acme.example/coffee", "profile": { "description": "Neighbourhood coffee since 2009. Now with a roastery." } }'The pattern is the same for hours, attributes, services, and menus: GET the current value, edit it, PATCH it back with fields naming what you touched. Naming a field without sending a value returns 400 rather than clearing it. Attributes are the exception: update_attributes defaults its mask to the attributes you sent, so a partial update never removes ones you left out.
Google gates some surfaces by category and country. Food menus require metadata.canHaveFoodMenus on the location, the service list requires metadata.canModifyServiceList, and valid attribute IDs come from the available attributes endpoint. A request against a surface the location does not support returns 422 with the flag named in the message.
What analytics come back per location?
Google publishes Business Profile performance as trailing totals, and Postproxy snapshots them per location roughly every 23 hours:
| Metric | Key |
|---|---|
| Impressions on Search, desktop and mobile | business_impressions_desktop_search, business_impressions_mobile_search |
| Impressions on Maps, desktop and mobile | business_impressions_desktop_maps, business_impressions_mobile_maps |
| All four impression metrics summed | views |
| Website clicks | website_clicks |
| Call clicks | call_clicks |
| Direction requests | business_direction_requests |
| Messages started | business_conversations |
| Bookings | business_bookings |
| Food orders and menu clicks | business_food_orders, business_food_menu_clicks |
Pass the location_id as placement_id on GET /api/profiles/:id/stats for the raw series, or on daily_stats for one record per day over a date range up to 366 days. GET /api/profiles/:id returns the latest snapshot for every location plus a summary_stats rollup across all of them.
Google exposes no per-post analytics for local posts and no follower count for a Business Profile, so those fields do not appear.
Guides
Step-by-step guides for each surface:
- Update Google Business Profile hours via API — regular, holiday, and kitchen or delivery hours, plus temporary closures
- Update Google Business Profile attributes via API — discover valid attributes, set booleans, enums, and URLs
- Manage Google Business Profile photos via API — cover, logo, and gallery photos; list and delete
- Manage menus and services via API — food menus for restaurants, service lists for everyone else
- Add “Order online” and “Book” buttons via API — place action links
- Pull Google Business Profile insights via API — impressions, calls, directions, bookings per location
- Reply to Google Business reviews via API and auto-respond to reviews with AI
The complete field reference, including every enum and error shape, is on the Google Business API reference. The MCP server exposes the same endpoints as tools, so an agent can update hours or reply to a review without custom code: see Manage Google Business Profile from ChatGPT or Claude.
Getting started
- In the dashboard, go to Profiles → Connect account and pick Google Business, or call Initialize Connection with
platform: "google_business". - Complete the Google consent. Postproxy indexes every location across every account the signed-in user manages.
- Call List placements for the
location_idvalues, then post, patch, or read stats.
Google Business is on the same flat platform list and the same plans as Instagram, Facebook, TikTok, YouTube, LinkedIn, X, Threads, Pinterest, Telegram, and Bluesky. Every change to the API is logged in the changelog.
Postproxy
One API for every social platform
Publish to Instagram, X, LinkedIn, TikTok, YouTube and more with a single request. Free plan, no credit card required.