체인지로그새 기능

Place Lookup을 소개해요

Place Lookup
시애틀 지도에서 음식점 Canlis의 핀이 엔진 카드 네 장으로 이어지는 화면. ChatGPT는 Yelp 장소 정보를, Gemini와 Copilot은 같은 Google 지도 장소 정보를 찾았고, Google 카드에는 Not found가 표시됩니다

매장 하나를 ChatGPT, Gemini, Google, Copilot, 한국에서는 네이버에도 한 번에 묻고, 엔진마다 보여 주는 장소 정보와 그 출처, 공식 정보와 다른 점을 받아요.

받는 결과

  • POST /v1/place-lookup은 매장 하나의 이름과 주소 또는 지도 좌표를 받고, 있으면 전화번호, 웹사이트, 장소 ID도 받아 CHATGPT, GEMINI, GOOGLE, BING_COPILOT에, KR 매장은 NAVER_AI_TAB에도 묻습니다.
  • GET /v1/place-lookup/{id}는 엔진마다 그 매장의 record를 돌려줍니다. google_maps, naver_place, yelp 같은 source, placeId와 페이지, 엔진이 보여 주는 이름, 주소, 전화번호, 웹사이트, 별점이 담깁니다.
  • issues는 장소 정보의 문제를 짚습니다. phone_mismatch, website_mismatch, location_mismatch, other_business_record, 폐업 표시가 있습니다.
  • summary는 매장을 보여 준 엔진과 엔진 사이에 다른 값(differences)을, credits는 지금까지 차감된 크레딧을 보여 줍니다.

동작 방식

엔진마다 Show Canlis on a map과 주소를 더한 같은 질문처럼 두 번 묻고, 질문마다 그 엔진의 일반 태스크로 실행합니다. KR 매장은 한국어로 묻고, ChatGPT의 두 번째 질문만 영어로 묻습니다. 답변에 나온 장소 중 장소 ID, 전화번호, 웹사이트, 좌표, 주소, 이름이 매장과 가장 잘 맞는 것을 그 매장의 장소 정보로 고르고, 맞은 항목은 match에 나옵니다. 조회 결과는 읽을 때마다 저장된 답변으로 다시 판정하며, 대부분 2분 안에 끝납니다.

이렇게 활용하세요

  • 틀린 전화번호가 어느 장소 정보에서 왔는지 찾습니다. Google 지도 장소 정보 하나의 오류는 그 정보를 읽는 엔진 모두에 나오고, 조회가 그 장소 정보를 짚어 줍니다.
  • 시장마다 엔진이 어느 지도 데이터를 읽는지 확인합니다. 미국 매장 20곳을 시험한 결과 ChatGPT는 15곳에서 Yelp 장소 정보를 보여 줬습니다.
  • 지역 캠페인 전에 체인의 모든 지점을 지점마다 한 번씩 조회합니다.

요청 보내기

API 키를 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"
  }'

요청 필드

place.namestring필수
매장 이름, 1~200자. 체인은 지점명까지 넣습니다.
place.addressstring
주소, 최대 500자. 조회에는 이 값이나 place.location, 또는 둘 다 필요합니다.
place.locationobject
매장 핀 좌표(latitude, longitude). 보내면 장소 정보마다 매장까지의 거리가 붙고, 300m 넘게 떨어진 핀을 알려 줍니다.
place.phonestring
공식 전화번호, 형식 자유. 장소 정보의 전화번호를 이 번호와 비교합니다.
place.websitestring
공식 웹사이트, http 또는 https URL. 장소 정보의 웹사이트를 사이트 단위로 비교합니다.
place.googlePlaceIdstring
매장의 Google Place ID. 이 ID의 장소 정보는 그 매장입니다.
place.naverPlaceIdstring
매장의 네이버 플레이스 ID, 또는 그 장소의 map.naver.com, place.naver.com 페이지. 이 ID의 장소 정보는 그 매장입니다.
place.yelpUrlstring
매장의 yelp.com/biz/… 페이지. 이 업체의 장소 정보는 그 매장입니다.
countrystring필수
매장이 있는 국가의 ISO 3166-1 alpha-2 코드. 예: US, KR.
enginesarray
물을 엔진. 중복 없이 CHATGPT, GEMINI, GOOGLE, BING_COPILOT, KR에서는 NAVER_AI_TAB까지 고릅니다. 기본값은 KR이면 다섯 개 모두, 그 밖의 국가는 앞의 네 개입니다.
idempotencyKeystring
조회 id, 1~200자. 기본값은 서버가 만든 UUID입니다. 같은 요청을 이 값으로 다시 보내면 빠진 질문을 더합니다.

응답

응답입니다. 길이를 줄여 보여 드립니다.

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
조회 id. GET /v1/place-lookup/{id}로 결과를 읽습니다.
tasksarray
질문마다 하나씩 engine, ask, success와 대기열에 들어간 task, 자리를 기다리는 동안의 status: "PENDING", 또는 코드가 담긴 error가 옵니다. 태스크의 idempotencyKey는 조회 id, 엔진, 질문 번호를 이은 값입니다. 예: canlis-2026-10:CHATGPT:1.

결과 받기

조회는 id로 5~10초마다 읽고, lookup.status가 COMPLETED가 되면 끝난 것입니다. 질문이 끝난 뒤 24시간 동안 읽을 수 있습니다.

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

Canlis 조회 결과를 줄이면 다음과 같습니다. ChatGPT는 음식점의 Yelp 장소 정보를, Gemini와 Copilot은 같은 Google 지도 장소 정보를 보여 줬고, Google 결과 페이지는 장소 없이 답해 found가 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, 끝나면 COMPLETED입니다.
lookup.engines[].foundboolean
답변이 매장을 보여 주면 true, 두 질문이 끝났는데 매장이 없으면 false, 질문이 실행 중이거나 둘 다 실패하면 null입니다.
lookup.engines[].recordobject
그 엔진의 매장 장소 정보. 두 답변의 장소 중 매장과 가장 잘 맞는 것이며, 엔진이 보여 주는 이름, 주소, 전화번호, 웹사이트, 별점이 담깁니다.
lookup.engines[].record.sourcestring
장소 정보의 출처 지도 DB. google_maps, naver_place, yelp, tripadvisor, unknown 중 하나이고, placeId와 url은 그 출처에서의 ID와 페이지입니다.
lookup.engines[].record.matchobject
이 장소 정보가 매장인 근거. by는 일치한 항목, nameScore는 0~1의 이름 유사도, distanceMeters는 place.location에서의 거리입니다.
lookup.engines[].issuesarray
장소 정보에서 틀린 점이 있을 때 붙습니다. phone_mismatch, website_mismatch, location_mismatch, other_business_record, closed_permanently, closed_temporarily가 있습니다.
lookup.summaryobject
결과별 엔진 목록(foundIn, notFoundIn, failed, pending)과, 엔진 사이에 다른 이름, 전화번호, 웹사이트, 핀을 값마다 그 엔진과 함께 담은 differences입니다.
lookup.creditsnumber
지금까지 이 조회의 질문에 청구된 크레딧입니다.

오류

모든 질문이 거절되면 402나 403 같은 첫 거절이 응답입니다. 일부만 접수되면 200으로 응답하고, 거절된 질문마다 error가 붙습니다. 요금제의 동시 실행 자리가 모두 차 있으면 남은 질문은 PENDING으로 기다렸다가 실행 중인 태스크가 끝나는 대로 저절로 시작합니다. 그래서 태스크를 동시에 2개 실행하는 무료 플랜에서도 요청 한 번으로 조회 전체가 실행됩니다.

VALIDATION_ERRORHTTP 400
필드가 빠졌거나 허용 범위를 벗어났습니다. details에 해당 필드가 나옵니다.
INSUFFICIENT_CREDITSHTTP 402
잔액이 태스크 가격보다 적습니다. 크레딧을 충전하거나 플랜을 올린 뒤 다시 보내세요.
KEY_SCOPE_DENIEDHTTP 403
키의 허용 엔진 밖의 엔진입니다. 다른 키를 쓰거나 키 관리에서 엔진을 추가하세요.
RESOURCE_ALREADY_EXISTSHTTP 409
idempotencyKey가 이미 다른 매장, 국가, 엔진 목록의 조회를 가리킵니다. 새 idempotencyKey로 보내면 새 조회가 됩니다.

요금

국가 기본 엔진에 모두 묻는 조회는 10크레딧입니다. KR은 질문 10개에 1씩, 그 밖의 국가는 질문 8개에 1.25씩입니다. 엔진을 일부만 고르면 보낸 질문만큼 내고, 실패한 질문은 0크레딧입니다. 플랜별 가격은 https://querying.ai/pricing 에서 볼 수 있습니다.

다른 업데이트

새 소식을 받아보세요

제품 업데이트를 이메일로 보내드립니다.

RSS 구독