/api/v4/locations/{locationId}/google-analyticsGet Google analytics for a location
Returns daily Google Business Profile interaction metrics for a location over a date range.
Parameters
Path
| Name | Type | Required | Description |
|---|---|---|---|
| locationId | string | required | Location ID, either the Base64 Relay id (e.g. TG9jYXRpb246MTgwMDI4OQ==) or the raw numeric database id (e.g. 1800289). Both forms resolve to the same location. |
Query
| Name | Type | Required | Description | Default |
|---|---|---|---|---|
| fromDate | string | optional | Start of the range (YYYY-MM-DD). Defaults to a recent window when omitted. | — |
| toDate | string | optional | End of the range (YYYY-MM-DD). | — |
Responses
200Daily Google interaction metrics. Each metric is a time-series array; a metric is `null` when no data exists for the range or the profile is not connected.
{ "data": { "googleInsights": { "total": [ { "startTime": "2025-06-01T00:00:00+00:00", "value": 412 }, { "startTime": "2025-06-02T00:00:00+00:00", "value": 388 } ], "search": [ { "startTime": "2025-06-01T00:00:00+00:00", "value": 300 } ], "maps": [ { "startTime": "2025-06-01T00:00:00+00:00", "value": 112 } ], "directionsAction": [ { "startTime": "2025-06-01T00:00:00+00:00", "value": 24 } ], "phoneAction": [ { "startTime": "2025-06-01T00:00:00+00:00", "value": 8 } ], "websiteAction": [ { "startTime": "2025-06-01T00:00:00+00:00", "value": 41 } ], "businessBookings": [ { "startTime": "2025-06-01T00:00:00+00:00", "value": 0 } ], "businessFoodOrders": [ { "startTime": "2025-06-01T00:00:00+00:00", "value": 0 } ], "businessFoodMenuClicks": [ { "startTime": "2025-06-01T00:00:00+00:00", "value": 0 } ] } }}401Unauthenticated, missing or invalid API key.
Returns daily Google Business Profile interaction data for a location. Each metric is an array of time-series points, where each point has a startTime (the day the count is bucketed under) and a value.
Available metrics:
total: total profile impressions,searchplusmaps. It does not include the action metrics below, so in the sample above 412 = 300 search + 112 maps.search: impressions in Google Search results (desktop and mobile combined)maps: impressions in Google Maps results (desktop and mobile combined)directionsAction: direction requests to the locationphoneAction: clicks on the call buttonwebsiteAction: clicks through to the websitebusinessBookings: bookings started from the profilebusinessFoodOrders: food orders placed from the profilebusinessFoodMenuClicks: clicks on the food-menu link
Either id form works in the path
Both 1800289 and TG9jYXRpb246MTgwMDI4OQ== resolve to the same location. Prefer the Base64 Relay id: it is what every read endpoint returns, and it is the form the rest of the API takes. A value that is neither a number nor a decodable Relay id returns a 200 whose body is {"data":{"googleInsights":null},"errors":[...]}, which is easy to mistake for a server fault.
curl -s 'https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/google-analytics?fromDate=2025-06-01&toDate=2025-06-30' \ -H "Authorization: API $LISTINGSAPI_KEY"Reporting the impact of a data update
A common use is a before/after visibility report: after pushing hours or category changes to a location, poll google-analytics for the weeks on either side of the change and chart search + maps to show the lift. Individual metrics come back null (rather than an empty array) when the location has no Google data for the requested window or its Google profile is not connected, handle null and [] the same way in your aggregation. Pair with Facebook and Bing analytics for a cross-publisher view.
curl -X GET 'https://listingsapi.com/api/v4/locations/<locationId>/google-analytics' \ -H "Authorization: API $LISTINGSAPI_KEY"