重複する掲載情報を見つけて非表示にする

拠点単位およびアカウント全体で検出された重複する掲載情報を一覧表示し、実際の重複を非表示の対象として確定し、誤検出を除外して、それぞれが解決するまで追跡します。

重複とは、同じディレクトリに同じビジネスのエントリがもう1つ存在することです。レビューや検索順位の評価が分散し、顧客の混乱を招きます。検出は自動的に実行されます。検出結果を確認し、実際の重複を確定して、正当なエントリを対象から除外します。

各重複には、解消プロセスの進捗を示すステータスがあります。

ステータス意味必要な対応
POTENTIAL検出されていますが、まだ誰も対応していません。内容を確認します(手順3と4)。
PROCESSING重複として確定済みで、掲載先で非表示処理が進行中です。待機します。後で再取得します(手順5)。
FIXED掲載先が削除または統合しました。完了です。
FAILED非表示処理が完了しませんでした。公開ページのリンクを確認し、まだ掲載されている場合はサポートに問い合わせます。

1. 1つの拠点の重複を一覧表示する

GET /locations/{locationId}/listings/duplicates はサイトグループの単純な配列を返します。各グループはディレクトリを表し、重複の疑いがあるエントリの listings 配列を含み、各エントリには listingItemId、開いて判断に使用できる liveLink、および status があります。

Duplicates for a location
curl https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/listings/duplicates \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "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 はグループを平坦化し、重複1件につき1要素の配列にまとめるため、そこでの d.id が次に渡す値になります。

2. アカウント全体の重複を集約する

GET /locations/listings/duplicates はアカウント全体を対象とするビューです。オフセット方式でページ分割されており、page と perPage を入力すると、records[] に加えて pageInfo.totalRecords と pageInfo.totalPages が返されます。status のデフォルトは POTENTIAL、tag のデフォルトは all なので、引数なしで呼び出すと、そのキーで参照できる未解決の重複がすべて返されます。1つのディレクトリに絞り込むには、siteId(plan-sites の id)を追加します。

Account rollup
curl "https://listingsapi.com/api/v4/locations/listings/duplicates?status=POTENTIAL&page=1&perPage=50" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "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 を読み取ります。ページは1つずつ取得してください。短い間隔でループを回すと、すぐに 429 が発生します。

3. 重複を確定して非表示処理を開始する

確認担当者がエントリを重複と判断したら、input の下に listingItemId の値を指定して POST /locations/listings/mark-as-duplicate を呼び出します。1つの拠点で確定したすべての id を、1回の呼び出しにまとめます。locationId は省略可能で、指定するとリクエストの対象をその拠点に限定します。

Mark as duplicate
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="]  }}'
JSON
{  "data": {    "markAsDuplicate": {      "success": true,      "errors": null    }  }}

success: true は、項目が受け付けられ、PROCESSING に移行したことを意味します。success: false を伴う 200、または 400 には errors 配列が含まれ、その各エントリには code と message が格納されます。通常の原因は、不明な id または形式が不正な id です。その場合、SDK は ValidationError を送出します。

4. 誤検出を除外する

検出では慎重を期しています。同じフランチャイズの別店舗、正当な2つ目のプロフィール、名称変更された拠点はいずれも、重複に見える場合があります。POST /locations/listings/mark-as-not-duplicate は同じリクエストボディを受け取り、両方の一覧からエントリを恒久的に削除します。手順3で誤って行った操作も、この方法で取り消します。

Mark as not duplicate
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 ヘッダーを使用してエンドポイントを直接呼び出します。

Progress
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で対象から除外できます。

次の手順