/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. | — |
| after | string | optional | Cursor value — return records after this cursor (forward pagination). | — |
| last | integer | optional | Number of records to return from the end. | — |
| before | string | optional | Cursor value — return records before this cursor (backward pagination). | — |
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.
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 until hasNextPage is false. 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"