Fichas

Endpoints con cURL, Python y Node: estado de sincronización prémium, asistentes de voz, detección de duplicados por ubicación/cuenta y supresión.

Una ficha es la entrada de una ubicación en el directorio de una plataforma de publicación. Al crear una ubicación, se pone en cola una ficha por cada plataforma de publicación de tu plan, y los endpoints de fichas consultan el estado de cada una, enumeran los duplicados que se han detectado y permiten confirmarlos o descartarlos. Los cuatro endpoints GET funcionan con una clave Read (lectura); los dos endpoints POST necesitan una clave Write (escritura).

Endpoints de un vistazo

MétodoRutaQué haceReferencia
GET/locations/{locationId}/listings/premiumEstado de sincronización con cada plataforma de publicación prémium para una ubicación.Obtener fichas prémium
GET/locations/{locationId}/voice-assistantsEstado de sincronización en Google Assistant, Alexa, Siri, Cortana y Bixby.Obtener fichas de asistentes de voz
GET/locations/listings/duplicatesResumen paginado de los duplicados detectados en toda la cuenta.Obtener todas las fichas duplicadas de una cuenta
GET/locations/{locationId}/listings/duplicatesDuplicados de una ubicación, agrupados por sitio.Obtener fichas duplicadas de una ubicación
POST/locations/listings/mark-as-duplicateConfirmar elementos de ficha como duplicados para su supresión.Marcar una ficha como duplicada
POST/locations/listings/mark-as-not-duplicateDescartar elementos de ficha por ser falsos positivos.Marcar una ficha como no duplicada

Consultar el estado de las fichas prémium

GET /locations/{locationId}/listings/premium

Devuelve en data.listingsForLocation un registro por cada plataforma de publicación prémium del plan de la ubicación. Es un array simple, no una lista paginada. La ruta paralela /listings/additional devuelve los directorios gratuitos con la misma estructura; no existe el parámetro de consulta listingType y cualquier valor enviado en él se ignora.

Parámetros

NombreEnObligatorioNotas
locationIdpathSíId en base64 o databaseId numérico.
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"      }    ]  }}

Elige la lógica que se ejecuta según syncStatus. Muestra displayStatus a una persona, lee syncIssue para conocer el motivo indicado por la plataforma de publicación y usa lastUpdate para detectar un envío que se haya estancado. listingUrl solo tiene un valor en las filas de fichas publicadas.

syncStatusSignificado
AVAILABLEListo para sincronizar, aún no se ha iniciado.
IN_PROGRESSEnviado a la plataforma de publicación, a la espera de una respuesta.
PENDING_APPROVALLa plataforma de publicación lo está revisando.
SYNCED o COMPLETEDPublicado. listingUrl tiene un valor.
REQUIRING_ACTIONBloqueado a la espera de que actúes. actionRequired es true; lee displayStatus.
FAILEDLa sincronización ha fallado. Lee syncIssue.
CANNOT_SUBMITEsta plataforma de publicación no puede aceptar esta ubicación en ningún caso.

Google Maps, Facebook y Waze permanecen en REQUIRING_ACTION con displayStatus: "Connect your account to sync the listing" hasta que se conecte la cuenta correspondiente. Es lo esperado para una ubicación nueva.

Consultar el estado de los asistentes de voz

GET /locations/{locationId}/voice-assistants

Devuelve en data.voiceAssistantsForLocation un registro por cada asistente de voz: Google Assistant, Amazon Alexa, Apple Siri, Microsoft Cortana y Samsung Bixby. Es un array simple con un conjunto de estados más reducido que el del endpoint prémium.

Parámetros

NombreEnObligatorioNotas
locationIdpathSíId en base64 o databaseId numérico.
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": []      }    ]  }}

Marca todas las filas en las que actionRequired sea true o syncIssue tenga un valor. errors contiene las cadenas de error de la plataforma de publicación, y connectedAccountId indica el nombre de la cuenta conectada que realiza la sincronización cuando corresponde. Los resultados de Google Assistant proceden de la conexión con Google Business Profile, por lo que la ausencia de una conexión con Google es el motivo más habitual por el que requiere atención. Los resultados de Siri proceden de la ficha de la ubicación en Apple Maps.

syncStatusSignificado
NOT_SUBMITTEDAún no se ha enviado al asistente.
IN_PROGRESSEnvío en curso.
REQUIRING_ACTIONSe necesita información del cliente para que la sincronización pueda continuar.
LIVEPublicado. No hay un enlace a la ficha publicada para un asistente de voz.

Consolida los duplicados de toda la cuenta

GET /locations/listings/duplicates

Devuelve todos los duplicados detectados que la clave puede ver, en todas las ubicaciones y plataformas de publicación, en data.duplicateListingsRollup. Es una página basada en desplazamiento: recibe page y perPage y devuelve records[] junto con pageInfo.totalRecords, pageInfo.totalPages y pageInfo.hasNextPage. Los filtros son parámetros de consulta planos, no JSON. Si no se proporciona nada, status toma el valor predeterminado POTENTIAL y tag toma el valor all, por lo que una llamada sin parámetros devuelve los duplicados abiertos de la cuenta.

Parámetros

NombreEnObligatorioNotas
statusqueryNoPOTENTIAL (predeterminado), PROCESSING, FIXED o FAILED. No distingue entre mayúsculas y minúsculas. Cualquier otro valor da lugar a un 400.
siteIdqueryNoLimita los resultados a una plataforma de publicación mediante su id numérico de sitio (el site.databaseId del endpoint premium o un id de plan-sites).
tagqueryNoLimita el consolidado a una etiqueta. El valor predeterminado es all.
pagequeryNoNúmero de página que comienza en 1. El valor predeterminado es 1.
perPagequeryNoRegistros por página.

Los wrappers de Python y Node solo exponen tag y page. Para filtrar por status o siteId, o para establecer perPage, llama a la ruta directamente como se muestra en Gestionar fichas duplicadas.

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

El consolidado te indica dónde están los duplicados: cada registro identifica el locationId y el siteName. duplicateProcessingState es el mismo estado del ciclo de vida que el endpoint por ubicación devuelve como status. Recorre las páginas hasta que hasNextPage sea false, de una en una; un bucle sin pausas es la forma más rápida de obtener un 429.

EstadoSignificado
POTENTIALDetectado, nadie ha actuado al respecto.
PROCESSINGConfirmado como duplicado; la supresión está en curso con la plataforma de publicación.
FIXEDLa plataforma de publicación lo eliminó o lo fusionó.
FAILEDLa supresión no se completó. Comprueba el liveLink.

Enumera los duplicados de una ubicación

GET /locations/{locationId}/listings/duplicates

Devuelve todos los duplicados detectados para una sola ubicación en data.duplicateListingsForLocation, agrupados por sitio de la plataforma de publicación. Es un array simple. Cada grupo es un sitio (name, url) con un array listings, y cada entrada incluye el listingItemId que aceptan ambos endpoints de marcado. Un array vacío significa que no se detectó nada.

Parámetros

NombreEnObligatorioNotas
locationIdpathSíId en Base64 o databaseId numérico.
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"          }        ]      }    ]  }}

Abre liveLink para revisar la entrada y, después, guarda listingItemId. En el Node SDK, el d.id aplanado es el valor que debes pasar. status usa los mismos cuatro valores que el consolidado de la cuenta anterior.

Confirma elementos de fichas como duplicados

POST /locations/listings/mark-as-duplicate

Marca elementos de fichas como duplicados confirmados para que se pueda gestionar su supresión con la plataforma de publicación. Envía los valores de listingItemId en input y agrupa todos los elementos confirmados de una ubicación en una sola llamada en lugar de realizar una llamada por elemento. Esta es una operación de escritura y requiere una clave Write (escritura).

Parámetros

NombreEnObligatorioNotas
input.listingItemIdsbodySíArray de valores listingItemId en base64 obtenidos de los endpoints de duplicados.
input.locationIdbodyNoId de ubicación en Base64 o numérico. Limita la operación a una ubicación.
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 los elementos se aceptaron y pasan a PROCESSING. Un 200 con success: false, o un 400, viene acompañado de un array errors cuyas entradas incluyen code, message y path; la causa habitual es un id desconocido o mal formado. El Python SDK devuelve el contenido de la respuesta; el Node SDK lanza ValidationError en su lugar, por lo que una promesa resuelta significa que la operación se completó correctamente.

Descarta elementos de fichas por no ser duplicados

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

Descarta posibles duplicados como falsos positivos. La detección es conservadora y marcará otra ubicación de la misma franquicia, un segundo perfil legítimo o una ubicación cuyo nombre haya cambiado. Una vez descartados, los elementos dejan de aparecer en ambos endpoints de duplicados. Acepta el mismo cuerpo que el endpoint anterior y también permite revertir el marcado de un elemento señalado por error.

Parámetros

NombreEnObligatorioNotas
input.listingItemIdsbodySíArray de valores listingItemId en base64 que se van a descartar.
input.locationIdbodyNoId de ubicación en Base64 o numérico. Limita la operación a una ubicación.
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 respuesta es data.markAsNotDuplicate con los mismos campos success y errors que la llamada para marcar como duplicado. Un elemento descartado se registra como confirmado que no es un duplicado y no vuelve a aparecer en la siguiente ejecución de la detección.

Errores que verás

Código o estadoSignificadoSolución
401Falta la clave de API o no es válida.Envía Authorization: API $LISTINGSAPI_KEY.
400 en el resumen agregado de la cuentastatus no es uno de estos valores: POTENTIAL, PROCESSING, FIXED, FAILED.Usa uno de los cuatro valores.
400 en un endpoint de marcadoEl identificador del elemento de ficha es desconocido o tiene un formato incorrecto. Lee errors[].code y message.Envía los valores de listingItemId de los endpoints de duplicados.
200 con success: falseLa solicitud se ejecutó, pero se rechazaron los datos de entrada. Los detalles están en data.<op>.errors.Comprueba el cuerpo de cada operación de escritura, no solo el estado.
SY90016 (HTTP 400)Una clave Read en una operación de escritura.Usa una clave Write para los dos endpoints de marcado.
429Se ha superado el límite de solicitudes. El plan Launch permite 10 solicitudes por minuto.Espera lo que indica Retry-After y luego reanuda las solicitudes. Consulta Límites de solicitudes.

Todos los códigos figuran en la referencia de errores.

Próximos pasos