/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 | required | Location tag defining the rollup scope. Required, the request returns 400 without it. Use `all` to span every location. | — |
| locationFilters | string | optional | JSON-encoded array of location IDs to restrict the rollup to. | — |
| 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, plus a locationFilters scope. The connection lives 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: tag is required
Unlike the per-location endpoint, tag is mandatory here: omitting it returns a 400 with Variable "$tag" of required type "String!" was not provided. Pass tag=all to span every location, or a specific tag to scope the rollup to a subset (for example, one region or brand).
Use case: an account-wide "needs a reply" queue
To surface every review still awaiting an owner response across all locations, call GET /rollup_interactions?tag=all&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?tag=<tag>' \
-H "Authorization: API $LISTINGSAPI_KEY"