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á:
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.
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" } ] } ] }}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.
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" } ] } }}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.
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 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.
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.
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
- Verifique o status das listagens e os links ativos: a listagem principal de cada diretório, com a qual uma duplicata compete.
- Encontre e corrija erros nas listagens: a outra etapa de limpeza.
- Referência: Obtenha listagens duplicadas de um local, Obtenha todas as listagens duplicadas de uma conta, Marque uma listagem como duplicata, Marque uma listagem como não duplicata.