/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 |
|---|---|---|---|---|
| status | string | optional | Duplicate status to return: `POTENTIAL`, `PROCESSING`, `FIXED`, or `FAILED`. Case-insensitive. | POTENTIAL |
| siteId | integer | optional | Narrow to a single publisher by site ID. See the plan-sites endpoint for valid IDs. | — |
| tag | string | optional | Tag to scope the rollup to. Defaults to every location the key can see. | all |
| 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" } ] } }}400An invalid `status` value, e.g. one outside `POTENTIAL` / `PROCESSING` / `FIXED` / `FAILED`.
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 shape 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?status=POTENTIAL&page=1Filters are flat query parameters, not JSON. status and siteId are both optional. With neither supplied, status defaults to POTENTIAL and tag to all, so a bare GET /api/v4/locations/listings/duplicates returns the account's open duplicates rather than a 400. Page through 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' \ -H "Authorization: API $LISTINGSAPI_KEY"