NovedadesNuevo

Presentamos Place Lookup

Place Lookup
Un mapa de Seattle con un pin en el restaurante Canlis, unido a cuatro tarjetas de motores: ChatGPT encontró su ficha de Yelp, Gemini y Copilot la misma ficha de Google Maps, y la tarjeta de Google dice Not found

Una llamada pregunta a ChatGPT, Gemini, Google, Copilot y, en Corea, a Naver por tu tienda, y devuelve la ficha de cada motor, la base de mapas de la que viene y cada dato que difiere del tuyo.

Qué obtienes

  • POST /v1/place-lookup recibe una tienda, con su nombre y una dirección o un punto en el mapa, además de su teléfono, sitio web e ID de lugar si los tienes, y pregunta por ella a CHATGPT, GEMINI, GOOGLE, BING_COPILOT y, para tiendas de KR, a NAVER_AI_TAB.
  • GET /v1/place-lookup/{id} devuelve el record de la tienda en cada motor: su source, como google_maps, naver_place o yelp, su placeId y su página, y el nombre, la dirección, el teléfono, el sitio web y la valoración que muestra el motor.
  • issues indica qué falla en una ficha: phone_mismatch, website_mismatch, location_mismatch, other_business_record o una ficha marcada como cerrada.
  • summary enumera los motores que mostraron la tienda y las differences entre sus fichas, y credits muestra lo que la consulta lleva cobrado.

Cómo funciona

Cada motor recibe dos preguntas, como Show Canlis on a map y la misma con la dirección, y cada una se ejecuta como una tarea normal de ese motor. Para tiendas de KR, las preguntas van en coreano y la segunda pregunta a ChatGPT en inglés. Entre los lugares de las respuestas, el que coincide con la tienda por ID de lugar, teléfono, sitio web, punto, dirección y nombre es la ficha de la tienda, y match enumera los datos que coinciden. La consulta se evalúa de nuevo con las respuestas guardadas cada vez que la lees, y la mayoría termina en menos de dos minutos.

Para qué sirve

  • Encontrar la ficha de la que sale un teléfono equivocado. Un error en una ficha de Google Maps aparece en todos los motores que leen esa ficha, y la consulta la señala.
  • Saber qué base de mapas lee cada motor en tu mercado. En una prueba con 20 tiendas de EE. UU., ChatGPT mostró fichas de Yelp para 15.
  • Revisar cada sucursal de una cadena antes de una campaña local, con una consulta por sucursal.

Envía la solicitud

Envía la solicitud con tu clave de API en la cabecera Authorization.

curl -X POST https://api.querying.ai/v1/place-lookup \
  -H "Authorization: Bearer $QUERYING_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "place": {
      "name": "Canlis",
      "address": "2576 Aurora Ave N, Seattle, WA 98109",
      "location": { "latitude": 47.6430534, "longitude": -122.3467361 },
      "phone": "(206) 283-3313",
      "website": "https://canlis.com/"
    },
    "country": "US",
    "idempotencyKey": "canlis-2026-10"
  }'

Campos de la solicitud

place.namestringObligatorio
El nombre de la tienda, de 1 a 200 caracteres. En una cadena, incluye la sucursal.
place.addressstring
La dirección, hasta 500 caracteres. La consulta necesita esta, place.location o ambas.
place.locationobject
El pin de la tienda, con latitude y longitude. Con él, cada ficha lleva su distancia a la tienda y se informa de un pin a más de 300 m.
place.phonestring
El teléfono oficial, en cualquier formato. Se compara con el teléfono de cada ficha.
place.websitestring
El sitio web oficial, una URL http o https. Se compara por sitio con el de cada ficha.
place.googlePlaceIdstring
El Google Place ID de la tienda. Una ficha con este ID es la tienda.
place.naverPlaceIdstring
El Naver Place ID de la tienda, o su página de map.naver.com o place.naver.com. Una ficha con este ID es la tienda.
place.yelpUrlstring
La página yelp.com/biz/… de la tienda. Una ficha de ese negocio es la tienda.
countrystringObligatorio
El país de la tienda como código ISO 3166-1 alfa-2, como US o KR.
enginesarray
Motores a consultar, sin repetir: CHATGPT, GEMINI, GOOGLE, BING_COPILOT y, en KR, NAVER_AI_TAB. Por defecto, los cinco en KR y los cuatro primeros en los demás países.
idempotencyKeystring
El id de la consulta, de 1 a 200 caracteres. Por defecto, un UUID del servidor. Reenviar la misma solicitud con él añade las preguntas que faltan.

Respuesta

La respuesta, recortada para que se lea mejor.

JSON
{
  "success": true,
  "lookup": { "id": "canlis-2026-10" },
  "tasks": [
    {
      "engine": "CHATGPT",
      "ask": 1,
      "success": true,
      "task": {
        "id": "…",
        "taskType": "CHATGPT",
        "status": "QUEUED",
        "priority": 1,
        "createdAt": "…",
        "idempotencyKey": "canlis-2026-10:CHATGPT:1"
      }
    },
    { "engine": "CHATGPT", "ask": 2, "…": "…" },
    { "engine": "GEMINI", "ask": 1, "…": "…" }
  ]
}
lookup.idstring
El id de la consulta. Lee el resultado con GET /v1/place-lookup/{id}.
tasksarray
Una entrada por pregunta: engine, ask, success y la task en cola, status: "PENDING" mientras espera sitio, o error con su código. El idempotencyKey de la tarea une el id de la consulta, el motor y el número de pregunta, como en canlis-2026-10:CHATGPT:1.

Recibe el resultado

Lee la consulta por su ID cada 5 a 10 segundos hasta que lookup.status sea COMPLETED. Puedes leerla durante 24 horas después de que terminen sus preguntas.

curl "https://api.querying.ai/v1/place-lookup/$LOOKUP_ID" \
  -H "Authorization: Bearer $QUERYING_API_KEY"

La consulta de Canlis se ve así, recortada. ChatGPT mostró la ficha de Yelp del restaurante, Gemini y Copilot la misma ficha de Google Maps, y la página de resultados de Google respondió sin lugares, así que su found es false.

JSON
{
  "success": true,
  "lookup": {
    "id": "canlis-2026-10",
    "status": "COMPLETED",
    "country": "US",
    "engines": [
      {
        "engine": "CHATGPT",
        "status": "COMPLETED",
        "found": true,
        "via": [{ "…": "…" }],
        "record": {
          "name": "Canlis",
          "source": "yelp",
          "provider": "yelp-feed",
          "phone": "+1 206-283-3313",
          "website": "https://canlis.com/",
          "rating": 4,
          "reviewCount": 1935,
          "match": {
            "same": true,
            "by": ["phone", "website", "location", "address", "name"],
            "nameScore": 1,
            "distanceMeters": 5
          },
          "…": "…"
        }
      },
      {
        "engine": "GEMINI",
        "status": "COMPLETED",
        "found": true,
        "via": [{ "…": "…" }],
        "record": {
          "name": "Canlis",
          "source": "google_maps",
          "placeId": "ChIJRXCfNwUVkFQRxraD8U-dANE",
          "phone": "+1 206-283-3313",
          "rating": 4.6,
          "reviewCount": 2892,
          "…": "…"
        }
      },
      {
        "engine": "GOOGLE",
        "status": "COMPLETED",
        "found": false,
        "…": "…"
      },
      {
        "engine": "BING_COPILOT",
        "status": "COMPLETED",
        "found": true,
        "…": "…"
      }
    ],
    "summary": {
      "foundIn": ["CHATGPT", "GEMINI", "BING_COPILOT"],
      "notFoundIn": ["GOOGLE"],
      "failed": [],
      "pending": [],
      "differences": []
    },
    "credits": 10
  }
}
lookup.statusstring
PROCESSING hasta que terminan todos los motores; después, COMPLETED.
lookup.engines[].foundboolean
true en cuanto una respuesta muestra la tienda, false cuando las dos preguntas terminaron sin ella y null mientras una pregunta sigue en curso o si fallaron las dos.
lookup.engines[].recordobject
La ficha de la tienda en ese motor: de los lugares de las dos respuestas, el que mejor coincide con la tienda, con el nombre, la dirección, el teléfono, el sitio web y la valoración que muestra el motor.
lookup.engines[].record.sourcestring
La base de mapas de la ficha: google_maps, naver_place, yelp, tripadvisor o unknown. placeId y url son su ID y su página allí.
lookup.engines[].record.matchobject
Por qué la ficha es la tienda. by enumera los datos que coinciden, nameScore es la similitud del nombre de 0 a 1 y distanceMeters, la distancia desde place.location.
lookup.engines[].issuesarray
Lo que está mal en la ficha, cuando hay algo: phone_mismatch, website_mismatch, location_mismatch, other_business_record, closed_permanently o closed_temporarily.
lookup.summaryobject
Los motores por resultado en foundIn, notFoundIn, failed y pending, y differences: cada nombre, teléfono, sitio web o pin que difiere entre motores, con los motores de cada valor.
lookup.creditsnumber
Créditos cobrados hasta ahora por las preguntas de la consulta.

Errores

Si se rechazan todas las preguntas, la respuesta es el primer rechazo, como 402 o 403. Si se admiten algunas, la llamada responde 200 y cada pregunta rechazada lleva su error. Mientras las tareas simultáneas de tu plan están ocupadas, las preguntas restantes quedan en PENDING y empiezan solas a medida que terminan las tareas en curso, así que en el plan gratuito, que ejecuta 2 tareas a la vez, una sola solicitud ejecuta la consulta entera.

VALIDATION_ERRORHTTP 400
Falta un campo o su valor está fuera de rango. details indica el campo.
INSUFFICIENT_CREDITSHTTP 402
El saldo es menor que el precio de la tarea. Añade créditos o mejora el plan y vuelve a enviarla.
KEY_SCOPE_DENIEDHTTP 403
El motor queda fuera de los Motores permitidos de la clave. Usa otra clave o añade el motor en Gestionar clave.
RESOURCE_ALREADY_EXISTSHTTP 409
El idempotencyKey ya nombra una consulta de otra tienda, otro país u otra lista de motores. Un idempotencyKey nuevo inicia una consulta nueva.

Precio

Una consulta a los motores predeterminados del país cuesta 10 créditos: 1 por pregunta en las 10 preguntas de KR y 1,25 en cada una de las 8 de otros países. Una consulta con menos motores paga las preguntas que envía, y una pregunta fallida cuesta 0. Los precios de cada plan están en https://querying.ai/pricing .

Más novedades

Recibe las novedades

Recibe las actualizaciones por correo.

Feed RSS