Submit a lookup
GET /v1/place-lookup/{id} until lookup.status is COMPLETED. Most lookups
finish within two minutes, so poll every 5 to 10 seconds. A lookup sends no webhook. The request schema is
in the API reference.
Request fields
Other fields,
webhook included, return 400 VALIDATION_ERROR.
How a lookup asks
Each engine gets two questions. ChatGPT, Gemini and Copilot are asked to show the store on a map, the second time with its address. Google’s results page is searched for the store’s location, then for its name from the store’s own pin. Naver AI Tab is asked for the store’s location, then for its name.
For
KR stores the questions are in Korean, and ChatGPT’s second question is Show {name} on a map in
English, because ChatGPT shows a Korean store’s place card more often when asked in English. Without
place.address, an engine whose second question adds the address asks the first one twice. Without
place.location, Google’s second search adds the address outside KR. via[] in the result shows each
question as it was sent.
Read the result
The Canlis lookup reads like this, trimmed to the main fields:found is false.
engines[]
record
issues
A number that every branch of a chain lists, such as a toll-free number, is not compared.
summary and credits
lookup.status is PROCESSING until every engine ends, then COMPLETED. The result is judged from the
stored answers on every read, and a lookup can be read for 24 hours after its tasks complete.
Send a lookup again
Each question is a task whose key is{lookup id}:{engine}:{ask}, such as canlis-2026-10:GEMINI:2.
Send the same request under the same idempotencyKey, and the lookup returns the tasks it has and sends
the questions that have no task yet, such as ones refused for want of credits. The same id with another
store, country or engine list returns 409 RESOURCE_ALREADY_EXISTS and creates nothing. To look the store
up again later, use a new idempotencyKey.
Plan concurrency
Each question counts as one task toward your plan’s concurrency limit. A lookup starts the questions your plan has room for, and the rest wait intasks[] with status: "PENDING":
FAILED with
API_KEY_INACTIVE and cost 0. See Credits and limits.
Errors and billing
A lookup of the country’s default engines costs 10 credits. Each question is priced as its share: 1 credit for each of the 10 questions inKR, and 1.25 for each of the 8 elsewhere. A lookup that names
fewer engines pays for the questions it sends. Each question’s price is held at submit and charged when
it completes, and a failed question costs 0. See Credits and limits.
Rejected at submit
When every question is refused, the first refusal is the response with its own status, such as
402 INSUFFICIENT_CREDITS or 403 KEY_SCOPE_DENIED, and nothing is
created. When some questions are admitted, the response is 200, and each refused question carries its
error in tasks[]:
Reading a lookup
GET /v1/place-lookup/{id} returns 404 RESOURCE_NOT_FOUND for an id your account has not used, and
for a lookup whose tasks are past the 24-hour window. A failed question shows status: "FAILED" in
via[] and an error that starts with its code, such as ENGINE_NO_RESULT. The codes are those of the
engine’s tasks, and a waiting question that ends before it starts carries API_KEY_INACTIVE or
INSUFFICIENT_CREDITS. See Errors.
Next steps
ChatGPT
The place cards ChatGPT shows, in
map.Batches and grids
Ask one prompt from every point of a grid around a store.