Duplicate Listings
Detect, review, and resolve duplicate listings across directories.
Returns duplicate listings detected for one location, grouped by publisher, with counts by status.
Get duplicate listings for a location
/api/v1/listings/duplicates{
"data": {
"found": true,
"yourListing": {
"name": "Acme Dental — Downtown",
"address": "123 Main St, Austin, TX 78701",
"phone": "+15125551234"
},
"counts": {
"potential": 2,
"flagged": 1,
"deleted": 0,
"failed": 0
},
"groups": [
{
"publisherId": "yelp",
"publisherName": "Yelp",
"status": "potential",
"duplicates": [
{
"id": "dup_1",
"name": "Acme Dental Downtown",
"address": "123 Main St, Austin, TX",
"phone": "+15125551234",
"url": "https://yelp.com/biz/acme-dental-downtown",
"matchScore": 0.92
}
]
}
]
}
}Returns an aggregated duplicate-listings summary and a paginated queue across every location of a client, or the whole agency when clientId is omitted. A key scoped to specific clients must always pass a clientId — there is no safe agency-wide default for it.
Get the duplicate-listings rollup
/api/v1/listings/duplicates/rollup{
"data": {
"summary": {
"potentialTotal": 14,
"locationsAffected": 6,
"bands": {
"high": 4,
"med": 7,
"low": 3
},
"topPublishers": [
{
"publisherId": "yelp",
"publisherName": "Yelp",
"count": 6
}
],
"publisherSites": [
{
"id": "yelp",
"name": "Yelp"
}
]
},
"queue": {
"rows": [
{
"id": "dup_1",
"locationId": "loc_456",
"locationName": "Acme Dental — Downtown",
"publisherId": "yelp",
"publisherName": "Yelp",
"name": "Acme Dental Downtown",
"matchScore": 0.92,
"status": "potential"
}
],
"total": 14,
"page": 1,
"perPage": 25
}
}
}Flags duplicate listings for removal, or dismisses them, either by an explicit list of duplicateListingIds or by a filter matching the same shape as the rollup queue. Filter-mode runs as a single bulk update scoped to the intersection of the filter's own statuses and the action's eligible source statuses — it can never reach rows outside what that filter would show. Flagging does not remove the listing itself; it queues the removal request, which a background job carries out against the publisher.
Resolve duplicate listings
/api/v1/listings/duplicates/resolve{
"data": {
"updated": 3,
"skipped": []
}
}