/api/v4/rollup_interactionsGet rollup interactions
Returns a cursor-paginated list of interactions across many locations in the account, with filtering and sorting.
Parameters
Query
| Name | Type | Required | Description | Default |
|---|---|---|---|---|
| tag | string | optional | Location tag to scope the rollup to. Defaults to `all`, every location the key can see. Omit it unless you tag locations. | all |
| siteUrls | string | optional | JSON-encoded array of publisher hostnames to include. | — |
| startDate | string | optional | Start of the date-range filter (YYYY-MM-DD). | — |
| endDate | string | optional | End of the date-range filter (YYYY-MM-DD). | — |
| searchString | string | optional | Full-text search across interaction content. | — |
| category | string | optional | Single interaction category, e.g. `REVIEW`. | — |
| categories | string | optional | JSON-encoded array of interaction categories. | — |
| ratingFilters | string | optional | JSON-encoded array of star ratings to include, e.g. `[3,4]`. | — |
| ratingFilter | integer | optional | Single star rating to filter by. | — |
| responseStatus | string | optional | JSON-encoded response-status filter. Values: `RESPONDED`, `PENDING`. | — |
| sortOrder | string | optional | JSON-encoded sort order. Values: `NEWEST_FIRST`, `OLDEST_FIRST`, `LAST_RESPONDED`. | — |
| first | integer | optional | Number of records to return from the beginning. Defaults to 20 when omitted, the endpoint always returns a single page, never the whole history. | — |
| after | string | optional | Cursor to page forward from. Pass `pageInfo.endCursor`, or equivalently the `cursor` of the last edge in the previous page. | — |
| last | integer | optional | Number of records to return from the end. | — |
| before | string | optional | Cursor to page backward from, used with `last`. Pass the `cursor` of the first edge of the page you are moving back from. `pageInfo` carries no `startCursor` field, so the edge cursor is the value to use. | — |
Responses
200Paginated rollup of interactions across the account. `data.rollupInteractions` holds the connection.
{ "data": { "rollupInteractions": { "pageInfo": { "hasNextPage": true, "hasPreviousPage": false }, "edges": [ { "node": { "id": "9e26d2a8-a6ed-42ea-8454-47d1c92ea841", "source": "maps.google.com", "content": "Excellent service, highly recommend.", "authorName": "Priya S.", "rating": 5, "date": "2026-06-30T12:04:11+00:00", "category": "Review", "type": "Review", "responded": false, "responseCount": 0, "canRespond": true, "locationId": 1800289 }, "cursor": "SW50ZXJhY3Rpb246OWUyNmQyYTg=" } ], "totalCount": 1284 } }}401Unauthenticated, missing or invalid API key.
429Rate limit exceeded. Retry after the `Retry-After` header value.
Returns a cross-location view of interactions for the account. It supports the same cursor-based pagination (first, last, after, before) and filters as the per-location List interactions endpoint. The connection is at data.rollupInteractions and each node carries a locationId so you can attribute an interaction to its store.
totalCount is the number of interactions matching your filters across every location in scope, not the number returned in this page. Omitting first returns 20 records, so a single call is never the full account history, page through with after until you have totalCount records.
Gotcha: the rollup always spans the whole account
This endpoint has no per-location parameter: with the default tag=all it rolls up every location the API key can see, and the only narrower scope is a location tag. There is no locationFilters or locationIds argument, and sending one is ignored rather than rejected. Narrow the result set with the filters that do exist (siteUrls, responseStatus, sortOrder, startDate/endDate, searchString), or group the results yourself by each node's locationId.
Use case: an account-wide "needs a reply" queue
To list every review still awaiting an owner response across all locations, call GET /rollup_interactions?responseStatus=["PENDING"]&sortOrder=["NEWEST_FIRST"]&first=50, then page with after = pageInfo.endCursor (equivalently, the cursor of the last edge), stopping when hasNextPage is false or a page returns an empty edges array. This avoids iterating location by location. Because it is paginated and rate-limited, honor the Retry-After header on a 429 and prefer date-bounded runs (startDate/endDate) for scheduled syncs.
curl -X GET 'https://listingsapi.com/api/v4/rollup_interactions' \ -H "Authorization: API $LISTINGSAPI_KEY"