GET/api/v4/locations/{locationId}/reviews

List interactions for a location

Returns a cursor-paginated list of reviews and social interactions for a single location, with filters.

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

Parameters

Path

NameTypeRequiredDescription
locationIdstringrequiredLocation ID, a raw numeric database ID (e.g. `1800289`) or its Base64-encoded Relay ID (e.g. `TG9jYXRpb246MTgwMDI4OQ==`).

Query

NameTypeRequiredDescriptionDefault
tagstringoptionalFilter by a location tag.
siteUrlsstringoptionalJSON-encoded array of publisher hostnames to include, e.g. `["maps.google.com","yelp.com"]`.
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 (newest first). 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 interactions result. `data.interactions` holds the connection.
{
  "data": {
    "interactions": {
      "pageInfo": {
        "hasNextPage": true,
        "hasPreviousPage": false,
        "endCursor": "SW50ZXJhY3Rpb246MV8xNTU0MjQzMDczMDM2LTllMjZkMmE4LWE2ZWQtNDJlYS04NDU0LTQ3ZDFjOTJlYTg0MQ=="
      },
      "edges": [
        {
          "node": {
            "id": "9e26d2a8-a6ed-42ea-8454-47d1c92ea841",
            "source": "maps.google.com",
            "content": "nice place for family together",
            "authorName": "vaibhav nakate",
            "rating": 5,
            "date": "2019-04-02T22:11:13.036997+00:00",
            "category": "Review",
            "type": "Review",
            "responded": false,
            "responseCount": 0,
            "canRespond": true,
            "permalink": "https://maps.google.com/maps?cid=..."
          },
          "cursor": "SW50ZXJhY3Rpb246MV8xNTU0MjQzMDczMDM2LTllMjZkMmE4LWE2ZWQtNDJlYS04NDU0LTQ3ZDFjOTJlYTg0MQ=="
        }
      ],
      "totalCount": 425
    }
  }
}
401Unauthenticated, missing or invalid API key.
429Rate limit exceeded. Retry after the `Retry-After` header value.

Returns reviews and social interactions for a location using cursor-based pagination. Results default to the most recent first. The connection lives at data.interactions and contains edges[].node (see the interaction attributes reference), an endCursor in pageInfo, and a totalCount.

totalCount is the number of interactions matching your filters across the whole result set, not the number returned in this page. Use it to size a backfill or to check your own tally: a location with totalCount: 450 read at first=50 takes 9 requests, and the counts should add up to 450 when you reach the end. Omitting first returns 20 records, so a single call is never the full history.

Use case: a per-store reviews inbox

To build a reviews inbox for one location, page forward with first and after: request first=25, then pass the response's pageInfo.endCursor as after on the next call. Every edge also carries its own cursor, and the last edge's cursor is that page's endCursor, so either value works as after. Stop when hasNextPage is false or when a page comes back with an empty edges array, test both, because a page boundary that lands exactly on the oldest review is followed by one final empty page. Layer on responseStatus=["PENDING"] to show only reviews still awaiting an owner reply, or ratingFilters=[1,2] to triage negative reviews first. From each node, the id is what you pass to Respond to an interaction, and canRespond tells you whether that source accepts owner replies.

Use case: incremental sync

To keep a local mirror in sync, filter by startDate/endDate and sort with sortOrder=["NEWEST_FIRST"], persisting the highest date you have seen. Note this is a paginated, rate-limited endpoint, honor the Retry-After header on a 429 and avoid re-fetching the full history on every run.

Google Maps and Facebook are available on every plan. Yelp is available on the Growth and Enterprise plans. JSON-encoded filters (siteUrls, categories, ratingFilters, responseStatus, sortOrder) are passed as URL-encoded JSON strings.

curl -X GET 'https://listingsapi.com/api/v4/locations/<locationId>/reviews' \
  -H "Authorization: API $LISTINGSAPI_KEY"