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 covers the full Google Business Profile API: posts, reviews, profile management, and analytics
Quick answer

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.

SurfaceWhat you can doWhere it lives
Local postsPublish standard, event, and offer posts with CTA buttons; upload standalone gallery photos; schedule, queue, draft, and approve them like any other networkPOST /api/posts
ReviewsList every review across every location, reply, edit or delete your reply, get a webhook on each new reviewProfile Comments API
Business Profile managementRead and update the location itself: name, phone, website, description, categories, address, temporary closuresLocation endpoints
HoursRegular weekly hours, special hours for holidays, and named extra sets such as kitchen or delivery hoursHours endpoint
AttributesPayments accepted, accessibility, amenities, menu and booking URLs — whatever Google allows for the location’s categoryAttributes endpoints
Services and food menusThe service list on service-business profiles; full menu → section → item → price structures on restaurant profilesService list, Food menus
Place action linksThe “Order online”, “Book”, and “Reserve a table” buttons: list, create, update, delete, set the preferred onePlace action links
Profile mediaList, add, and delete photos on the profile with a category such as COVER, LOGO, INTERIOR, or MENUProfile media
Location analyticsSearch and Maps impressions, website clicks, call clicks, direction requests, conversations, bookings, food orders — per location, as a timeseriesProfile 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:

  1. My Business Account Management API — accounts and which locations they own
  2. My Business Business Information API — the location resource, attributes, categories, service items
  3. My Business Verifications API — verification state
  4. Business Profile Performance API — impressions, clicks, calls, directions
  5. My Business Q&A API — questions and answers on the listing
  6. My Business Notifications API — Pub/Sub push for new reviews and updates
  7. Place Actions API — action links
  8. My Business Lodging API — hotel-specific attributes
  9. 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:

Terminal window
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:

Terminal window
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:

MetricKey
Impressions on Search, desktop and mobilebusiness_impressions_desktop_search, business_impressions_mobile_search
Impressions on Maps, desktop and mobilebusiness_impressions_desktop_maps, business_impressions_mobile_maps
All four impression metrics summedviews
Website clickswebsite_clicks
Call clickscall_clicks
Direction requestsbusiness_direction_requests
Messages startedbusiness_conversations
Bookingsbusiness_bookings
Food orders and menu clicksbusiness_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:

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

  1. In the dashboard, go to Profiles → Connect account and pick Google Business, or call Initialize Connection with platform: "google_business".
  2. Complete the Google consent. Postproxy indexes every location across every account the signed-in user manages.
  3. Call List placements for the location_id values, 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.

Ready to get started?

Start with our free plan and scale as your needs grow. No credit card required.