Schede

Tutti gli endpoint Listings con esempi cURL, Python e Node: stato sync premium, assistenti vocali, rilevamento duplicati per sede/account e soppressione.

Una scheda è la voce di una sede nella directory di una piattaforma di pubblicazione. La creazione di una sede mette in coda una scheda per ogni piattaforma di pubblicazione inclusa nel tuo piano, e gli endpoint per le schede consentono di leggere lo stato di ciascuna, elencare i duplicati rilevati e confermarli o scartarli. I quattro endpoint GET funzionano con una chiave Read (lettura); i due endpoint POST richiedono una chiave Write (scrittura).

Panoramica degli endpoint

MetodoPercorsoFunzioneRiferimento
GET/locations/{locationId}/listings/premiumStato di sincronizzazione di ogni piattaforma di pubblicazione premium per una sede.Ottieni le schede premium
GET/locations/{locationId}/voice-assistantsStato di sincronizzazione su Google Assistant, Alexa, Siri, Cortana e Bixby.Ottieni le schede degli assistenti vocali
GET/locations/listings/duplicatesRiepilogo paginato dei duplicati rilevati nell'intero account.Ottieni tutte le schede duplicate di un account
GET/locations/{locationId}/listings/duplicatesDuplicati di una sede, raggruppati per sito.Ottieni le schede duplicate di una sede
POST/locations/listings/mark-as-duplicateConferma le voci delle schede come duplicati da sopprimere.Contrassegna la scheda come duplicato
POST/locations/listings/mark-as-not-duplicateScarta le voci delle schede in quanto falsi positivi.Contrassegna la scheda come non duplicata

Leggi lo stato delle schede premium

GET /locations/{locationId}/listings/premium

Restituisce un record per ogni piattaforma di pubblicazione premium inclusa nel piano della sede, sotto data.listingsForLocation. È un semplice array, non un elenco paginato. Il percorso parallelo /listings/additional restituisce le directory gratuite nella stessa struttura; non esiste alcun parametro di query listingType e un valore inviato con quel parametro viene ignorato.

Parametri

NomeInObbligatorioNote
locationIdpathSìId in base64 o databaseId numerico.
Premium listings
curl https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/listings/premium \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "listingsForLocation": [      {        "id": "TGlzdGluZzoxMDQ0Njg3MjM=",        "site": { "databaseId": "1", "name": "Google Maps", "url": "maps.google.com" },        "syncStatus": "REQUIRING_ACTION",        "displayStatus": "Connect your account to sync the listing",        "actionRequired": true,        "listingUrl": null,        "syncIssue": null,        "lastUpdate": "2026-07-06T18:33:28Z"      },      {        "id": "TGlzdGluZzoxMDQ0Njg3Mjc=",        "site": { "databaseId": "387", "name": "BeLocalFocussed", "url": "belocalfocussed.com" },        "syncStatus": "SYNCED",        "displayStatus": "Synced",        "actionRequired": false,        "listingUrl": "https://belocalfocussed.com/jenny-home-26x0ffkd0e",        "syncIssue": null,        "lastUpdate": "2026-07-06T18:33:30Z"      },      {        "id": "TGlzdGluZzoxMDQ0Njg3MDk=",        "site": { "databaseId": "301", "name": "Local Mint", "url": "localmint.com" },        "syncStatus": "FAILED",        "displayStatus": "Partner experiencing issues; awaiting response",        "actionRequired": false,        "listingUrl": null,        "syncIssue": "Publisher requires website URL",        "lastUpdate": "2026-07-06T18:34:03Z"      }    ]  }}

Gestisci i diversi casi in base a syncStatus. Mostra displayStatus a una persona, leggi syncIssue per conoscere la motivazione fornita dalla piattaforma di pubblicazione e usa lastUpdate per individuare un invio che si è bloccato. listingUrl è impostato solo nelle righe relative alle schede pubblicate.

syncStatusSignificato
AVAILABLEPronta per la sincronizzazione, che non è ancora iniziata.
IN_PROGRESSInviata alla piattaforma di pubblicazione, in attesa di risposta.
PENDING_APPROVALLa piattaforma di pubblicazione la sta esaminando.
SYNCED o COMPLETEDPubblicata. listingUrl è valorizzato.
REQUIRING_ACTIONBloccata in attesa di un tuo intervento. actionRequired è true; leggi displayStatus.
FAILEDLa sincronizzazione non è riuscita. Leggi syncIssue.
CANNOT_SUBMITQuesta piattaforma di pubblicazione non può accettare questa sede in alcun caso.

Google Maps, Facebook e Waze rimangono nello stato REQUIRING_ACTION con displayStatus: "Connect your account to sync the listing" finché non viene collegato l'account corrispondente. È il comportamento previsto per una nuova sede.

Leggi lo stato degli assistenti vocali

GET /locations/{locationId}/voice-assistants

Restituisce un record per ogni assistente vocale sotto data.voiceAssistantsForLocation: Google Assistant, Amazon Alexa, Apple Siri, Microsoft Cortana e Samsung Bixby. È un semplice array con un insieme di stati più ristretto rispetto all'endpoint premium.

Parametri

NomeInObbligatorioNote
locationIdpathSìId in base64 o databaseId numerico.
Voice assistants
curl https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/voice-assistants \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "voiceAssistantsForLocation": [      {        "databaseId": "104468723",        "voiceIdentifier": "GOOGLE_ASSISTANT",        "name": "Google Assistant",        "connectedAccountId": null,        "syncStatus": "REQUIRING_ACTION",        "actionRequired": true,        "syncIssue": null,        "errors": []      },      {        "databaseId": "104468711",        "voiceIdentifier": "SIRI",        "name": "Siri",        "connectedAccountId": null,        "syncStatus": "IN_PROGRESS",        "actionRequired": false,        "syncIssue": null,        "errors": []      }    ]  }}

Segnala ogni riga in cui actionRequired è true oppure syncIssue è impostato. errors contiene le stringhe di errore della piattaforma di pubblicazione, mentre connectedAccountId identifica l'account collegato tramite cui avviene la sincronizzazione, quando applicabile. I risultati di Google Assistant provengono dal collegamento a Google Business Profile, quindi l'assenza di un collegamento a Google è il motivo più comune per cui è necessario intervenire. I risultati di Siri provengono dalla scheda della sede su Apple Maps.

syncStatusSignificato
NOT_SUBMITTEDNon ancora inviata all'assistente.
IN_PROGRESSInvio in corso.
REQUIRING_ACTIONÈ necessario un intervento del cliente prima che la sincronizzazione possa proseguire.
LIVEPubblicata. Non è disponibile un link alla scheda pubblicata per un assistente vocale.

Riepiloga i duplicati di tutto l'account

GET /locations/listings/duplicates

Restituisce tutti i duplicati rilevati accessibili alla chiave, per tutte le sedi e le piattaforme di pubblicazione, in data.duplicateListingsRollup. La paginazione è basata su offset: page e perPage in ingresso, records[] più pageInfo.totalRecords, pageInfo.totalPages e pageInfo.hasNextPage in uscita. I filtri sono parametri di query semplici, non JSON. Se non fornisci alcun parametro, status assume il valore predefinito POTENTIAL e tag il valore all, quindi una chiamata senza parametri restituisce i duplicati aperti dell'account.

Parametri

NomeInObbligatorioNote
statusqueryNoPOTENTIAL (predefinito), PROCESSING, FIXED o FAILED. Non distingue tra maiuscole e minuscole. Qualsiasi altro valore genera un 400.
siteIdqueryNoLimita i risultati a una sola piattaforma di pubblicazione tramite il suo id numerico del sito (il site.databaseId dell'endpoint premium o un id di plan-sites).
tagqueryNoLimita il riepilogo a un solo tag. Il valore predefinito è all.
pagequeryNoNumero di pagina a partire da 1. Il valore predefinito è 1.
perPagequeryNoRecord per pagina.

I wrapper Python e Node espongono solo tag e page. Per filtrare per status o siteId, o per impostare perPage, chiama direttamente la route come mostrato in Gestire le schede duplicate.

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,        "hasPreviousPage": false,        "totalPages": 34,        "totalRecords": 1673      },      "records": [        {          "id": "3329229",          "name": "Woodbury Train Station",          "nameValid": false,          "duplicateProcessingState": "POTENTIAL",          "liveLink": "http://citysquares.com/b/woodbury-train-station-23598450",          "locationId": "73451",          "siteName": "City Squares",          "siteUrl": "citysquares.com"        }      ]    }  }}

Il riepilogo indica dove si trovano i duplicati: ogni record specifica locationId e siteName. duplicateProcessingState è lo stesso stato del ciclo di vita che l'endpoint per singola sede riporta come status. Scorri le pagine una alla volta finché hasNextPage non è false; un ciclo senza pause è il modo più rapido per ottenere un 429.

StatoSignificato
POTENTIALRilevato, nessuno è ancora intervenuto.
PROCESSINGConfermato come duplicato; la soppressione è in corso presso la piattaforma di pubblicazione.
FIXEDLa piattaforma di pubblicazione lo ha rimosso o unito.
FAILEDLa soppressione non è andata a buon fine. Controlla liveLink.

Elenca i duplicati di una singola sede

GET /locations/{locationId}/listings/duplicates

Restituisce tutti i duplicati rilevati per una singola sede in data.duplicateListingsForLocation, raggruppati per sito della piattaforma di pubblicazione. È un semplice array. Ogni gruppo è un sito (name, url) con un array listings e ogni voce contiene il listingItemId accettato da entrambi gli endpoint di contrassegno. Un array vuoto indica che non è stato rilevato nulla.

Parametri

NomeInObbligatorioNote
locationIdpathSìId in base64 o databaseId numerico.
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"          }        ]      }    ]  }}

Apri liveLink per esaminare la voce, poi conserva listingItemId. Nel Node SDK, il campo d.id ottenuto dall'appiattimento è il valore da passare. status usa gli stessi quattro valori del riepilogo dell'account riportato sopra.

Conferma gli elementi delle schede come duplicati

POST /locations/listings/mark-as-duplicate

Contrassegna gli elementi delle schede come duplicati confermati, in modo che possano essere soppressi presso la piattaforma di pubblicazione. Invia i valori listingItemId in input e raggruppa tutti gli elementi confermati di una sede in un'unica chiamata anziché effettuare una chiamata per ogni elemento. Questa è un'operazione di scrittura e richiede una chiave Write (scrittura).

Parametri

NomeInObbligatorioNote
input.listingItemIdsbodySìArray di valori listingItemId in base64 provenienti dagli endpoint dei duplicati.
input.locationIdbodyNoId della sede in base64 o numerico. Limita l'operazione a una singola sede.
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 indica che gli elementi sono stati accettati e passano a PROCESSING. Un 200 con success: false, oppure un 400, è accompagnato da un array errors le cui voci contengono code, message e path; la causa più comune è un id sconosciuto o non valido. Il Python SDK restituisce il payload; il Node SDK, invece, genera un'eccezione ValidationError, quindi una promise risolta indica che l'operazione è riuscita.

Escludi gli elementi delle schede dai duplicati

POST /locations/listings/mark-as-not-duplicate

Esclude i potenziali duplicati in quanto falsi positivi. Il rilevamento è prudente e segnala anche un'altra sede dello stesso franchising, un secondo profilo legittimo o una sede rinominata. Una volta esclusi, gli elementi non compaiono più in nessuno dei due endpoint dei duplicati. Accetta lo stesso body dell'endpoint precedente e consente anche di annullare il contrassegno di un elemento segnalato per errore.

Parametri

NomeInObbligatorioNote
input.listingItemIdsbodySìArray di valori listingItemId in base64 da escludere.
input.locationIdbodyNoId della sede in base64 o numerico. Limita l'operazione a una singola sede.
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="]  }}'
JSON
{  "data": {    "markAsNotDuplicate": {      "success": true,      "errors": null    }  }}

La risposta è data.markAsNotDuplicate con gli stessi campi success e errors della chiamata per contrassegnare un elemento come duplicato. Un elemento escluso viene registrato come non duplicato confermato e non ricompare al successivo ciclo di rilevamento.

Errori che potresti riscontrare

Codice o statoSignificatoSoluzione
401Chiave API mancante o non valida.Invia Authorization: API $LISTINGSAPI_KEY.
400 nel riepilogo dell'accountstatus non è uno dei valori POTENTIAL, PROCESSING, FIXED, FAILED.Usa uno dei quattro valori.
400 su un endpoint markID dell'elemento della scheda sconosciuto o non valido nel formato. Leggi errors[].code e message.Invia i valori listingItemId ottenuti dagli endpoint dei duplicati.
200 con success: falseLa richiesta è stata eseguita, ma l'input è stato rifiutato. I dettagli sono in data.<op>.errors.Controlla il corpo della risposta a ogni operazione di scrittura, non solo lo stato.
SY90016 (HTTP 400)Una chiave Read usata per un'operazione di scrittura.Usa una chiave Write per i due endpoint mark.
429Limite di frequenza superato. Il piano Launch consente 10 richieste al minuto.Attendi il tempo indicato da Retry-After, poi riprendi. Consulta Limiti di frequenza.

Tutti i codici sono elencati nella documentazione di riferimento degli errori.

Passaggi successivi