Encontre e suprima listagens duplicadas

Liste listagens duplicadas por local e na conta, confirme as reais para supressão, descarte falsos positivos e acompanhe cada uma até a resolução.

Uma duplicação é uma segunda entrada para a mesma empresa no mesmo diretório. Ela divide as avaliações e os sinais de classificação e confunde os clientes. A detecção é executada automaticamente. Você analisa o que ela encontrou, confirma as duplicações reais e descarta as entradas que são legítimas.

Cada duplicação tem um status que indica em que etapa da limpeza ela está:

StatusSignificadoSua ação
POTENTIALDetectada, ninguém tomou nenhuma ação.Analise-a (etapas 3 e 4).
PROCESSINGVocê a confirmou; a supressão está em andamento junto à plataforma de publicação.Aguarde. Consulte novamente mais tarde (etapa 5).
FIXEDA plataforma de publicação a removeu ou mesclou.Concluído.
FAILEDA supressão não foi concluída.Verifique o link da listagem publicada; entre em contato com o suporte se ela ainda estiver no ar.

1. Liste as duplicações de um local

GET /locations/{locationId}/listings/duplicates retorna um array simples de grupos de sites. Cada grupo é um diretório com um array listings de possíveis duplicações, e cada entrada tem um listingItemId, um liveLink que você pode abrir para analisá-la e um 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"          }        ]      }    ]  }}

Um array vazio significa que nada foi detectado. Guarde listingItemId: esse é o valor aceito pelos dois endpoints de marcação. O Node SDK achata os grupos em um array por duplicação, portanto, nele, d.id é o valor a ser passado adiante.

2. Consolide as duplicações de toda a conta

GET /locations/listings/duplicates é a visão de toda a conta. É uma página com paginação por offset: recebe page e perPage e retorna records[] junto com pageInfo.totalRecords e pageInfo.totalPages. O valor padrão de status é POTENTIAL, e o de tag é all, portanto, uma chamada sem parâmetros retorna todas as duplicações em aberto que a chave pode acessar. Adicione siteId (um id de plan-sites) para restringir a um diretório.

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"        }      ]    }  }}

A consolidação informa onde estão as duplicações; duplicateProcessingState é o mesmo status do ciclo de vida descrito acima. Para agir sobre uma delas, use seu locationId no endpoint por local da etapa 1 e leia o listingItemId ali. Percorra uma página por vez; um loop sem pausas é a maneira mais rápida de receber um 429.

3. Confirme uma duplicação para que ela seja suprimida

Assim que uma pessoa responsável pela análise confirmar que uma entrada é uma duplicação, chame POST /locations/listings/mark-as-duplicate com os valores de listingItemId em input. Agrupe todos os ids confirmados de um local em uma única chamada. locationId é opcional e restringe a solicitação àquele local.

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 significa que os itens foram aceitos e passaram para PROCESSING. Um 200 com success: false, ou um 400, vem acompanhado de um array errors cujas entradas contêm code e message; a causa mais comum é um id desconhecido ou malformado. Os SDKs lançam ValidationError nesse caso.

4. Descarte um falso positivo

A detecção é conservadora. Outra unidade da mesma franquia, um segundo perfil legítimo ou um local renomeado podem parecer duplicações. POST /locations/listings/mark-as-not-duplicate aceita o mesmo corpo e remove a entrada das duas listas permanentemente. Também é assim que você desfaz uma ação equivocada na etapa 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="]  }}'

A resposta é data.markAsNotDuplicate com os mesmos campos success e errors da etapa 3.

5. Acompanhe o progresso

Consulte novamente a consolidação com status=PROCESSING para ver o que ainda está com as plataformas de publicação, e com status=FIXED para confirmar o que foi removido. Nenhum dos dois SDKs disponibiliza o filtro status ainda, portanto, chame o endpoint diretamente com o mesmo cabeçalho 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"

Solicitar perPage=1 e ler pageInfo.totalRecords fornece a contagem de cada status em quatro chamadas. Um registro FAILED cujo liveLink ainda abre precisa de análise manual; um registro FAILED cujo link não funciona mais foi corrigido pela própria plataforma de publicação e pode ser descartado seguindo a etapa 4.

Próximos passos