/api/v4/locations/listings/duplicatesGet all duplicate listings for an account
Returns a paginated, account-wide rollup of potential duplicate listings across every location in the account.
Parameters
Query
| Name | Type | Required | Description | Default |
|---|---|---|---|---|
| filters | string | required | URL-encoded JSON filter object. Requires a `status`, one of `POTENTIAL`, `PROCESSING`, `FIXED`, `FAILED`. Optional `siteId` narrows to a single publisher. Example: `{"status":"POTENTIAL"}`. | — |
| page | integer | optional | 1-based page number. | 1 |
| perPage | integer | optional | Records 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?filters=%7B%22status%22%3A%22POTENTIAL%22%7D&page=1filters 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
The rollup always covers every location the key can see. To review a subset, page through the result and group by the locationId on each record, or call the per-location endpoint for the locations you care about.
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?filters=<filters>' \ -H "Authorization: API $LISTINGSAPI_KEY"