GET/api/v4/rollup_interactions

Get rollup interactions

Returns a cursor-paginated list of interactions across many locations in the account, with filtering and sorting.

Requires an API key. See Authentication for header format and key rotation.

Parameters

Query

NameTypeRequiredDescriptionDefault
tagstringrequiredLocation tag defining the rollup scope. Required, the request returns 400 without it. Use `all` to span every location.
locationFiltersstringoptionalJSON-encoded array of location IDs to restrict the rollup to.
siteUrlsstringoptionalJSON-encoded array of publisher hostnames to include.
startDatestringoptionalStart of the date-range filter (YYYY-MM-DD).
endDatestringoptionalEnd of the date-range filter (YYYY-MM-DD).
searchStringstringoptionalFull-text search across interaction content.
categorystringoptionalSingle interaction category, e.g. `REVIEW`.
categoriesstringoptionalJSON-encoded array of interaction categories.
ratingFiltersstringoptionalJSON-encoded array of star ratings to include, e.g. `[3,4]`.
ratingFilterintegeroptionalSingle star rating to filter by.
responseStatusstringoptionalJSON-encoded response-status filter. Values: `RESPONDED`, `PENDING`.
sortOrderstringoptionalJSON-encoded sort order. Values: `NEWEST_FIRST`, `OLDEST_FIRST`, `LAST_RESPONDED`.
firstintegeroptionalNumber of records to return from the beginning. Defaults to 20 when omitted, the endpoint always returns a single page, never the whole history.
afterstringoptionalCursor to page forward from. Pass `pageInfo.endCursor`, or equivalently the `cursor` of the last edge in the previous page.
lastintegeroptionalNumber of records to return from the end.
beforestringoptionalCursor 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"