Google Business Location Info
Read and edit the business information of a connected Google Business Profile location:
description, regular and special opening hours, phone numbers, website and categories.
Both endpoints call Google's Business Information API in real time and refresh the stored
access token automatically. The Google Business connection already includes the required
permission (business.manage), so no reconnection is needed.
- Authentication: API Key —
Authorization: Apikey <YOUR_API_KEY>
The location is resolved in this order: location_id in the request → the location
pinned to the profile → the account's only location.
If the account has several locations and none of those applies, the API answers
400 location_required with the list of available_locations. List them with
Get Google Business Locations.
Read location info
- Method:
GET - Endpoint:
/api/uploadposts/google-business/location-info
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
user | string | Yes | The profile username that owns the connected Google Business account. |
location_id | string | No | locations/123, a bare 123, or accounts/456/locations/123. See "Which location?" above. |
Example Request
curl 'https://api.upload-post.com/api/uploadposts/google-business/location-info?user=agent-paris' \
-H 'Authorization: Apikey YOUR_API_KEY'
Successful Response (200 OK)
{
"success": true,
"location_id": "locations/111",
"info": {
"location_id": "locations/111",
"title": "Agence Dupont",
"description": "Agence immobilière à Paris 11e.",
"phone": "+33 1 23 45 67 89",
"additional_phones": [],
"website": "https://dupont.example",
"primary_category": "categories/gcid:real_estate_agency",
"primary_category_name": "Real estate agency",
"additional_categories": ["categories/gcid:property_management_company"],
"regular_hours": [
{ "day": "MONDAY", "open": "09:00", "close": "18:30" }
],
"special_hours": [
{ "date": "2026-12-25", "closed": true },
{ "date": "2026-12-31", "open": "10:00", "close": "14:00", "end_date": "2026-12-31" }
],
"address": { "locality": "Paris", "postalCode": "75011", "regionCode": "FR", "addressLines": ["1 rue Exemple"] },
"open_status": "OPEN",
"maps_uri": "https://maps.google.com/?cid=1"
},
"location": { "name": "locations/111", "title": "Agence Dupont", "...": "raw Google Location resource" }
}
info is a flat, readable view; location is Google's raw
Location resource.
Update location info
Only the fields you send are changed: the API builds Google's updateMask from them.
A field sent empty ("" or []) is cleared.
- Method:
PATCH(also acceptsPOST) - Endpoint:
/api/uploadposts/google-business/location-info
Body Parameters (JSON)
| Name | Type | Required | Description |
|---|---|---|---|
user | string | Yes | Profile username. |
location_id | string | No | Location to edit (see "Which location?"). |
validate_only | boolean | No | true asks Google to validate the change without applying it. |
description | string | No | Business description, max 750 characters. |
website | string | No | Absolute http(s) URL. "" removes it. |
phone | string | No | Primary phone, e.g. +33 1 23 45 67 89. |
additional_phones | array of string | No | Up to 2 extra phone numbers. |
regular_hours | array | No | Weekly hours: [{"day": "MONDAY", "open": "09:00", "close": "18:00"}]. day may also be a list (["MONDAY", "TUESDAY"]). Several entries for the same day = split hours (e.g. lunch break). A close earlier than open closes the next day; "close": "24:00" = until midnight. [] clears the hours. |
special_hours | array | No | Exceptions: [{"date": "2026-12-25", "closed": true}] or [{"date": "2026-12-31", "open": "10:00", "close": "14:00"}]. Optional end_date. [] clears them. |
primary_category | string | No | Google category id, e.g. gcid:real_estate_agency (or categories/gcid:...). |
additional_categories | array of string | No | Up to 9 extra category ids. |
regular_hours and special_hours also accept Google's native objects
({"periods": [...]} and {"specialHourPeriods": [...]}). When you send only
phone or only additional_phones (same for the two category fields), the other half
keeps its current value.
Example Request
curl -X PATCH https://api.upload-post.com/api/uploadposts/google-business/location-info \
-H 'Authorization: Apikey YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"user": "agent-paris",
"description": "Agence immobilière à Paris 11e : vente, location et gestion.",
"website": "https://dupont.example",
"regular_hours": [
{ "day": ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"], "open": "09:00", "close": "12:30" },
{ "day": ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"], "open": "14:00", "close": "19:00" },
{ "day": "SATURDAY", "open": "10:00", "close": "13:00" }
],
"special_hours": [{ "date": "2026-12-25", "closed": true }]
}'
Successful Response (200 OK)
{
"success": true,
"location_id": "locations/111",
"validate_only": false,
"update_mask": ["profile", "websiteUri", "regularHours", "specialHours"],
"ignored_fields": [],
"info": { "...": "same shape as the GET response" },
"location": { "...": "raw Google Location after the update" }
}
ignored_fields lists keys of your body that are not supported (they are not sent to Google).
Errors
| Status | code | Meaning |
|---|---|---|
| 400 | user_required | Missing or invalid user. |
| 404 | profile_not_found | The profile does not exist. |
| 400 | google_business_not_connected | The profile has no Google Business account connected. |
| 401 | google_business_reconnect_required | The Google connection expired; reconnect Google Business. |
| 400 | location_required | Several locations and none selected; see available_locations. |
| 404 | no_locations / location_not_found | No location for the account / Google does not know the location. |
| 400 | invalid_field | A field failed validation; see errors. |
| 400 | no_fields | Nothing to update was sent. |
| 400 | google_validation_error | Google rejected the change; see google_error (with fieldViolations). |
| 403 | google_business_permission_denied | The connected Google user cannot edit this location. |
| 429 | google_rate_limited | Google rate limit; retry later. |
| 502 | google_api_error | Google error on their side. |
Notes:
- Google may review some edits before they appear publicly on Search and Maps.
- Category ids are Google's
gcid:values; changing the primary category may trigger re-verification of the business.