중복 등록 정보 찾기 및 노출 중단
사업장별 및 계정 전체에서 감지된 중복 등록 정보를 조회하고, 실제 중복 항목의 노출 중단을 확정하고, 오탐 항목을 제외하고, 각 항목이 해결될 때까지 추적합니다.
중복 등록 정보는 동일한 디렉터리에 같은 업체가 추가로 등록된 항목입니다. 리뷰와 순위 신호를 분산시키고 고객에게 혼란을 줍니다. 감지는 자동으로 실행됩니다. 감지 결과를 검토하여 실제 중복 항목을 확정하고 정상적인 항목은 제외합니다.
모든 중복 항목에는 정리 과정에서 어느 단계에 있는지 알려 주는 상태가 있습니다.
1. 한 사업장의 중복 항목 조회
GET /locations/{locationId}/listings/duplicates는 사이트 그룹으로 구성된 일반 배열을 반환합니다. 각 그룹은 하나의 디렉터리를 나타내며 중복으로 의심되는 항목의 listings 배열을 포함하고, 각 항목에는 listingItemId, 중복 여부를 판단하기 위해 열어 볼 수 있는 liveLink, status가 있습니다.
curl https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/listings/duplicates \-H "Authorization: API $LISTINGSAPI_KEY"{ "data": { "duplicateListingsForLocation": [ { "id": "U2l0ZToxNTA=", "name": "City Squares", "url": "citysquares.com", "listings": [ { "id": "RHVwbGljYXRlOjIzNTk4NDUw", "listingItemId": "TGlzdGluZ0l0ZW06MjM1OTg0NTA=", "name": "Woodbury Train Station", "liveLink": "http://citysquares.com/b/woodbury-train-station-23598450", "status": "POTENTIAL" } ] } ] }}빈 배열은 감지된 항목이 없음을 의미합니다. listingItemId를 보관합니다. 두 표시 엔드포인트가 모두 이 값을 받습니다. Node SDK는 그룹을 중복 항목 단위의 단일 배열로 펼치므로, 여기서는 d.id가 전달할 값입니다.
2. 계정 전체의 중복 항목 집계
GET /locations/listings/duplicates는 계정 전체를 조회합니다. 오프셋 기반 페이지 조회 방식으로, page와 perPage를 입력하면 records[]와 함께 pageInfo.totalRecords 및 pageInfo.totalPages가 반환됩니다. status의 기본값은 POTENTIAL이고 tag의 기본값은 all이므로, 매개변수 없이 호출하면 해당 키로 조회할 수 있는 모든 미해결 중복 항목이 반환됩니다. 하나의 디렉터리로 범위를 좁히려면 siteId(plan-sites id)를 추가합니다.
curl "https://listingsapi.com/api/v4/locations/listings/duplicates?status=POTENTIAL&page=1&perPage=50" \-H "Authorization: API $LISTINGSAPI_KEY"{ "data": { "duplicateListingsRollup": { "pageInfo": { "hasNextPage": true, "totalPages": 34, "totalRecords": 1673 }, "records": [ { "id": "3329229", "name": "Woodbury Train Station", "duplicateProcessingState": "POTENTIAL", "liveLink": "http://citysquares.com/b/woodbury-train-station-23598450", "locationId": "73451", "siteName": "City Squares", "siteUrl": "citysquares.com" } ] } }}집계 결과는 중복 항목이 어디에 있는지 알려 주며, duplicateProcessingState는 앞서 설명한 것과 동일한 수명 주기 상태입니다. 특정 항목에 조치하려면 해당 항목의 locationId를 사용하여 1단계의 사업장별 엔드포인트를 호출하고, 거기서 listingItemId를 읽습니다. 페이지는 한 번에 하나씩 조회합니다. 간격 없이 반복 호출하면 금방 429가 발생합니다.
3. 노출 중단을 위한 중복 항목 확정
검토자가 해당 항목이 중복이라는 데 동의하면 input 아래에 listingItemId 값을 넣어 POST /locations/listings/mark-as-duplicate를 호출합니다. 한 사업장에서 중복으로 확정된 모든 id를 하나의 호출로 일괄 처리합니다. locationId는 선택 사항이며 요청 범위를 해당 사업장으로 한정합니다.
curl -X POST https://listingsapi.com/api/v4/locations/listings/mark-as-duplicate \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "locationId": "TG9jYXRpb246MTgwMDI4OQ==", "listingItemIds": ["TGlzdGluZ0l0ZW06MjM1OTg0NTA="] }}'{ "data": { "markAsDuplicate": { "success": true, "errors": null } }}success: true는 항목이 접수되어 PROCESSING 상태로 전환되었음을 의미합니다. success: false인 200 응답이나 400 응답에는 errors 배열이 포함되며, 이 배열의 각 항목에는 code와 message가 있습니다. 일반적인 원인은 알 수 없거나 형식이 잘못된 id입니다. 이 경우 SDK는 ValidationError를 발생시킵니다.
4. 오탐 항목 제외
감지는 보수적으로 수행됩니다. 같은 프랜차이즈의 다른 지점, 정상적인 두 번째 프로필 또는 이름이 변경된 사업장도 중복으로 보일 수 있습니다. POST /locations/listings/mark-as-not-duplicate는 동일한 본문을 받아 두 목록에서 해당 항목을 영구적으로 제거합니다. 3단계를 잘못 수행했을 때 되돌리는 방법이기도 합니다.
curl -X POST https://listingsapi.com/api/v4/locations/listings/mark-as-not-duplicate \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "locationId": "TG9jYXRpb246MTgwMDI4OQ==", "listingItemIds": ["TGlzdGluZ0l0ZW06MjM1OTg0NTA="] }}'응답은 data.markAsNotDuplicate이며, 3단계와 동일한 success 및 errors 필드를 포함합니다.
5. 진행 상황 추적
status=PROCESSING으로 집계 결과를 다시 조회하여 게시 플랫폼에서 아직 처리 중인 항목을 확인하고, status=FIXED로 조회하여 제거된 항목을 확인합니다. 두 SDK 모두 아직 status 필터를 제공하지 않으므로, 동일한 Authorization 헤더로 엔드포인트를 직접 호출합니다.
curl "https://listingsapi.com/api/v4/locations/listings/duplicates?status=PROCESSING&page=1&perPage=50" \-H "Authorization: API $LISTINGSAPI_KEY" curl "https://listingsapi.com/api/v4/locations/listings/duplicates?status=FIXED&page=1&perPage=50" \-H "Authorization: API $LISTINGSAPI_KEY"perPage=1을 요청하고 pageInfo.totalRecords를 읽으면 4번의 호출로 상태별 개수를 확인할 수 있습니다. liveLink에 여전히 접속할 수 있는 FAILED 레코드는 수동 검토가 필요합니다. 링크가 더 이상 작동하지 않는 FAILED 레코드는 게시 플랫폼에서 자체적으로 해결한 것이므로 4단계에 따라 제외할 수 있습니다.
다음 단계
- 등록 정보 상태 및 공개 URL 확인: 각 디렉터리의 기본 등록 정보를 확인합니다. 중복 등록 정보는 이 기본 등록 정보와 경쟁합니다.
- 등록 정보 오류 찾기 및 수정: 함께 진행하는 또 다른 정리 작업입니다.
- 참조: 사업장의 중복 등록 정보 조회, 계정의 모든 중복 등록 정보 조회, 등록 정보를 중복으로 표시, 등록 정보를 중복이 아닌 것으로 표시.