Busca ubicaciones y archiva las que ya no gestionas

Busca por palabra clave, resuelve códigos e IDs de tienda en lote y programa o cancela el archivado de sucursales cerradas al fin del ciclo de facturación.

Tres endpoints de lectura permiten encontrar ubicaciones mediante distintas claves: una búsqueda de texto libre, una consulta por código de tienda y una consulta por id. El archivado es una operación de escritura programada: la ubicación permanece activa hasta el final del ciclo de facturación actual y, después, deja de sincronizarse y de facturarse. Hasta ese momento puedes cancelarlo.

1. Busca por palabra clave

GET /locations/search?query= busca coincidencias del término en el nombre, la dirección postal, la ciudad y el id de tienda, y devuelve una conexión con cursor: edges[].node con pageInfo.endCursor, paginada mediante first y after. Omite query para recorrer toda la cuenta mediante paginación.

Search
curl "https://listingsapi.com/api/v4/locations/search?query=Acme&first=10" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "searchLocations": {      "edges": [        {          "cursor": "TG9jYXRpb246MTgwMDI4OQ==",          "node": {            "id": "TG9jYXRpb246MTgwMDI4OQ==",            "databaseId": 1800289,            "name": "Acme Kitchen",            "storeId": "ACME-NYC-001",            "approved": "APPROVED",            "archived": false,            "archivalScheduledAt": null          }        }      ],      "pageInfo": { "endCursor": "TG9jYXRpb246MTgwMDI4OQ==", "hasNextPage": false, "total": 1 }    }  }}

Un array edges vacío significa que no hubo coincidencias, que es la comprobación que debes realizar antes de crear una tienda cuando no sabes con certeza si ya existe. Ambos SDK aceptan fields para restringir la búsqueda de coincidencias únicamente a name o store_id.

2. Consulta por código de tienda

Si tus sistemas identifican las ubicaciones mediante tu propio código de tienda, consúltalas directamente con GET /locations-by-store-codes. El parámetro storeCodes es un array JSON con codificación URL. Los códigos sin coincidencias no aparecen en el resultado.

By store code
curl -G https://listingsapi.com/api/v4/locations-by-store-codes \--data-urlencode 'storeCodes=["ACME-NYC-001","ACME-NYC-002"]' \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "getLocationsByStoreCodes": [      {        "id": "TG9jYXRpb246MTgwMDI4OQ==",        "databaseId": 1800289,        "storeId": "ACME-NYC-001",        "name": "Acme Kitchen",        "archived": false      }    ]  }}

3. Obtén los datos completos de un lote de ids

Cuando ya tienes ids en base64, procedentes de tu propio almacenamiento o del contenido de un webhook, GET /locations-by-ids devuelve el registro completo de cada uno en una sola llamada. También se devuelven las ubicaciones archivadas, así que consulta archived y archivedAt para distinguirlas. Los ids desconocidos se omiten sin avisar; compara los recuentos.

By ids
curl -G https://listingsapi.com/api/v4/locations-by-ids \--data-urlencode 'ids=["TG9jYXRpb246MTgwMDI4OQ==","TG9jYXRpb246MTgwMDI5MA=="]' \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "getLocationsByIds": [      { "id": "TG9jYXRpb246MTgwMDI4OQ==", "databaseId": 1800289, "name": "Acme Kitchen", "archived": false, "archivedAt": null },      { "id": "TG9jYXRpb246MTgwMDI5MA==", "databaseId": 1800290, "name": "Acme Kitchen Brooklyn", "archived": false, "archivedAt": null }    ]  }}

Para obtener un subconjunto de toda la cuenta filtrado en el servidor, GET /locations también acepta un parámetro filter codificado en JSON, por ejemplo, para filtrar por estado de aprobación. Consulta Listar todas las ubicaciones.

4. Archiva las ubicaciones que ya no gestionas

POST /locations/archive recibe input.locationIds y devuelve una entrada result por ubicación. El archivado es programado, no inmediato: cada ubicación pasa a ARCHIVE_SCHEDULED, sigue sincronizándose hasta que termina el ciclo de facturación actual y se archiva cuando se genera la siguiente factura. A partir de ese momento, deja de sincronizarse con las plataformas de publicación y de facturarse.

Archive
curl -X POST https://listingsapi.com/api/v4/locations/archive \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "locationIds": ["TG9jYXRpb246MTgwMDI4OQ==", "TG9jYXRpb246MTgwMDI5MA=="]  }}'
JSON
{  "data": {    "archiveLocations": {      "errors": null,      "result": [        { "locationId": "TG9jYXRpb246MTgwMDI4OQ==", "status": "ARCHIVE_SCHEDULED", "success": true, "errors": null },        { "locationId": "TG9jYXRpb246MTgwMDI5MA==", "status": "ARCHIVE_SCHEDULED", "success": true, "errors": null }      ]    }  }}
result[].statusSignificado
ARCHIVE_SCHEDULEDEn cola. La ubicación permanece activa y se sigue facturando hasta que termina el ciclo de facturación.
ARCHIVEDYa se archivó mediante una llamada o un ciclo anterior.

Consulta el success de cada entrada: un id incorrecto no bloquea el resto del lote. Mientras el archivado está programado, el campo archivalScheduledAt de la ubicación aparece establecido en los resultados de las listas y las búsquedas. Una ubicación archivada no se puede actualizar hasta que se reactive. Si hay webhooks configurados, se emite un evento profile.deleted; se trata de una eliminación lógica y no existe la eliminación permanente.

5. Cancela un archivado programado

Antes de que se cierre el ciclo, POST /locations/cancel_archive con los mismos ids devuelve las ubicaciones a ACTIVE y la facturación continúa. Una vez que la ubicación está completamente archivada, esta operación devuelve 404 para ella. La cancelación no emite ningún evento de webhook.

Cancel archive
curl -X POST https://listingsapi.com/api/v4/locations/cancel_archive \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "locationIds": ["TG9jYXRpb246MTgwMDI4OQ=="] } }'
JSON
{  "data": {    "cancelLocationsArchive": {      "errors": null,      "result": [        { "locationId": "TG9jYXRpb246MTgwMDI4OQ==", "status": "ACTIVE", "success": true, "errors": null }      ]    }  }}

Ambos SDK requieren dos argumentos posicionales adicionales, un tipo de selección y un identificador changedBy, que envían junto con locationIds. El cuerpo de la solicitud REST solo necesita los ids.

Próximos pasos