GET/api/v4/locations/listings/duplicates

Get all duplicate listings for an account

Returns a paginated, account-wide rollup of potential duplicate listings across every location under a tag.

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

Parameters

Query

NameTypeRequiredDescriptionDefault
tagstringrequiredLocation tag to scope the rollup to. Use `all` to span every location in the account.
filtersstringrequiredURL-encoded JSON filter object. Requires a `status` — one of `POTENTIAL`, `PROCESSING`, `FIXED`, `FAILED`. Optional `siteId` narrows to a single publisher. Example: `{"status":"POTENTIAL"}`.
pageintegeroptional1-based page number.1
perPageintegeroptionalRecords per page.

Responses

200Paginated rollup of duplicate listing records across the account.
{
  "data": {
    "duplicateListingsRollup": {
      "pageInfo": {
        "hasNextPage": true,
        "hasPreviousPage": false,
        "totalPages": 34,
        "totalRecords": 1673
      },
      "records": [
        {
          "id": "3329229",
          "name": "Woodbury Train Station",
          "nameValid": false,
          "duplicateProcessingState": "POTENTIAL",
          "liveLink": "http://citysquares.com/b/woodbury-train-station-23598450",
          "locationId": "73451",
          "siteName": "City Squares",
          "siteUrl": "citysquares.com"
        }
      ]
    }
  }
}
400Missing or invalid `filters` — e.g. omitting the required `status` returns `Field value.status of required type DuplicateListingStatus! was not provided.`
401Unauthenticated — missing or invalid API key.
429Rate limit exceeded. Retry after the `Retry-After` header value.

Returns an account-wide view of potential duplicate listings across every publisher directory, rolled up so you can triage duplicates in bulk instead of querying each location one at a time. The pageInfo/records envelope shown above is live-verified against account 62670; that account currently has no open duplicates, so the single record is representative of the shape a location with duplicates returns.

Use case: nightly duplicate-suppression sweep

Page through POTENTIAL duplicates for the whole account and hand each id to a reviewer:

GET /api/v4/locations/listings/duplicates?tag=all&filters=%7B%22status%22%3A%22POTENTIAL%22%7D&page=1

filters is a JSON object that must be URL-encoded{"status":"POTENTIAL"} becomes %7B%22status%22%3A%22POTENTIAL%22%7D. Omitting it, or omitting the status inside it, returns 400. Walk pages using pageInfo.hasNextPage and incrementing page until it is false; totalRecords and totalPages let you show progress.

Use case: scope to one segment of your catalog

Pass a real tag instead of all (for example tag=us-stores) to limit the rollup to locations carrying that tag — useful when different teams own different regions and you only want that team's duplicates.

Once you have ids to act on, resolve them with Mark listing as duplicate or dismiss false positives with Mark listing as not a duplicate. For a single location's duplicates grouped by site, use Get duplicate listings for a location. This is a paginated list endpoint subject to the account rate limit — on 429, back off using the Retry-After header.

curl -X GET 'https://listingsapi.com/api/v4/locations/listings/duplicates?tag=<tag>&filters=<filters>' \
  -H "Authorization: API $LISTINGSAPI_KEY"