/api/v4/listings/scanslistings scan 생성
어떤 업체든 대상으로 디렉터리 네트워크 전반의 등록 정보 현황에 대한 감사를 시작하고, 완료 웹훅을 기다릴 수 있도록 스캔을 즉시 반환합니다.
매개변수
본문
| 이름 | 유형 | 필수 | 설명 |
|---|---|---|---|
| input | object | 필수 | Wrapper object. The entire request body must be nested under `input`. |
| input.name | string | 필수 | Business name, up to 150 characters. |
| input.street | string | 필수 | Street address, up to 200 characters. |
| input.city | string | 필수 | City, up to 100 characters. |
| input.stateIso | string | 선택 | State or province code, up to 50 characters. Required for every country except `GB`. |
| input.postalCode | string | 선택 | Postal code, up to 20 characters. Required for every country except `NG` and `AE`. |
| input.countryIso | string | 필수 | Two-letter ISO 3166-1 country code, for example `US`. |
| input.phone | string | 필수 | Business phone number with 6 to 15 digits. Local formats are read in the context of `countryIso`, and an international format with a leading `+` works too. |
요청 예시
바로 붙여 넣을 수 있는 본문입니다. 예시 ID와 값을 실제 값으로 바꾸세요.
{ "input": { "name": "Franklin Barbecue", "street": "900 E 11th St", "city": "Austin", "stateIso": "TX", "postalCode": "78702", "countryIso": "US", "phone": "+15126531187" }}응답
200The scan was accepted and is `QUEUED`. `reused` is `false` and `results` is empty until directories are checked. Wait for the `listing_scan.completed` webhook, or poll the scan.
{ "data": { "createListingScan": { "reused": false, "scan": { "id": "TGlzdGluZ1NjYW46N2MxZTRmNTItOWEzYi00ZDY4LWIwZTEtNWYyYThjOWQzZTQ3", "status": "QUEUED", "source": "DIRECTORY_SEARCH", "locationId": null, "resultsAsOf": null, "createdAt": "2026-11-05T07:00:41Z", "startedAt": null, "completedAt": null, "business": { "name": "Franklin Barbecue", "street": "900 E 11th St", "city": "Austin", "stateIso": "TX", "postalCode": "78702", "countryIso": "US", "phone": "+15126531187" }, "summary": { "total": 0, "found": 0, "accurate": 0, "inaccurate": 0, "notFound": 0, "pending": 0, "unavailable": 0 }, "failure": null, "results": [] }, "quota": { "limit": 50, "used": 6, "remaining": 44, "resetsAt": "2026-11-23T12:38:03Z" }, "errors": [] } }}200The request was rejected, so **no scan was created**. The error is reported in `errors[]` on an `HTTP 200`, `scan` is `null`, and `quota` still returns the current allowance. This example is a phone number with too few digits.
{ "data": { "createListingScan": { "reused": false, "scan": null, "quota": { "limit": 50, "used": 5, "remaining": 45, "resetsAt": "2026-11-23T12:38:03Z" }, "errors": [ { "code": "SY83003", "message": "SY83003: Invalid value for phone", "contextInfo": [ { "key": "field", "value": "phone" } ] } ] } }}400A read-only key was used on this write (`SY90016`). Use a Write key.
401Unauthenticated, missing or invalid API key.
429Rate limit exceeded. Retry after the `Retry-After` header value.
업체 1곳의 스캔을 시작합니다. 스캔은 디렉터리 네트워크 전반에서 업체의 등록 여부와 등록 정보의 정확성을 점검합니다. 여기에는 Google, Bing, Apple Maps, Yelp, Facebook, MapQuest와 같은 지도 및 검색 엔진, 데이터 수집 서비스와 지역 디렉터리, ChatGPT와 Gemini 같은 AI 어시스턴트가 포함됩니다. 국가에 따라 스캔 1회로 최대 약 60개의 디렉터리를 확인합니다. 업체가 계정에 등록된 사업장일 필요는 없으므로, 잠재 고객이나 온보딩 전 고객의 등록 정보를 점검할 수 있습니다.
호출은 QUEUED 상태의 스캔을 즉시 반환합니다. 디렉터리 확인은 백그라운드에서 실행되며, 결과는 GET /listings/scans/{scanId}로 조회합니다.
사용 사례: 잠재 고객의 등록 정보 점검. 영업 도구에서 업체명, 주소, 전화번호를 수집합니다. 스캔을 생성하고 반환된 scan.id를 저장한 다음, listing_scan.completed 이벤트가 도착하면 data.scan에서 완료된 스캔을 조회하세요. summary는 요약 정보(업체를 찾은 디렉터리 수와 그중 정보가 정확한 디렉터리 수)를 제공하고, results[]는 보고서에 표시할 디렉터리별 세부 정보를 제공합니다.
사용 사례: 이미 관리 중인 업체의 상태 점검. 계정에 등록된 사업장 중 1곳의 업체 정보로 스캔하세요. 스캔은 해당 사업장을 인식하고 다시 검색하는 대신 해당 사업장의 실제 등록 정보를 바탕으로 결과를 구성합니다(재사용 및 무료 스캔 참조).
스캔 완료 과정
스캔은 QUEUED, IN_PROGRESS을 거친 다음 COMPLETED 또는 FAILED 상태로 종료됩니다. 대부분의 스캔은 1~7분 안에 완료됩니다. 약 15분이 지나도 디렉터리에서 응답하지 않으면 해당 디렉터리의 결과는 UNAVAILABLE로 설정되고, 나머지 결과로 스캔이 완료됩니다.
- 웹훅을 우선 사용하세요.
listing_scan.completed및listing_scan.failed이벤트는 스캔당 1회 전달되며,GET /listings/scans/{scanId}가 반환하는 것과 동일한 스캔 객체를 결과와 함께 포함합니다. 이 이벤트는 다른 모든 이벤트와 마찬가지로 서명되며, 웹훅이 활성화되어 있고 검증된 웹훅 URL이 있는 계정으로 전송됩니다.listing_scan.completed를 참조하세요. - 대체 방법으로 폴링을 사용하세요. 웹훅을 수신할 수 없다면
status가COMPLETED또는FAILED가 될 때까지 15초마다 스캔을 조회하세요. 더 자주 폴링해도 이점은 없으며 요청 허용량만 소모합니다.
필수 필드
name, street, city, countryIso, phone는 항상 필수입니다. 다음 2개 필드의 필수 여부는 국가에 따라 달라집니다.
값이 누락되거나 형식이 잘못되면 SY83003로 거부되며, 오류에 해당 필드명이 표시됩니다. phone는 6~15자리 숫자여야 하며, countryIso는 영문자 2자여야 합니다.
재사용 및 무료 스캔
스캔이 항상 새 검색을 수행하는 것은 아닙니다. 반환된 스캔의 source 필드는 결과의 출처를 나타냅니다.
7일 이내에 동일한 업체를 다시 스캔하면 새 스캔 대신 계정의 기존 스캔이 반환되며, 응답에 reused: true가 포함됩니다. 새 스캔이 시작되지 않고 새 웹훅도 전송되지 않으므로, 다른 이벤트를 기다리는 대신 반환된 스캔을 조회하세요(아직 실행 중일 수 있습니다). 재사용 기간 내에 본인 계정의 사업장을 다시 스캔하는 경우에도 동일하게 동작합니다.
월간 제공량
Listings scans는 유료 요금제에 포함되며, 월간 제공량은 요금제에 따라 다릅니다. 무료 샌드박스 1일 이용권에서는 사용할 수 없습니다. 새로 실행하는 DIRECTORY_SEARCH 스캔만 제공량에서 차감됩니다. 다음은 무료입니다:
- 7일 이내에 동일한 비즈니스를 다시 스캔하는 경우(
reused: true), RECENT_SCAN사본,LOCATION_LISTINGS스캔,- 실패한 스캔은 제공량에서 차감되지 않습니다.
제공량은 계정의 결제 주기에 맞춰 초기화됩니다. 생성 요청이 거부된 경우를 포함하여 모든 생성 응답에는 limit, used, remaining 및 resetsAt가 담긴 quota가 포함됩니다. 요금제 및 추가 기능을 참조하세요.
오류
생성 요청이 거부되면 scan: null과 errors[]에 담긴 사유가 포함된 HTTP 200가 반환되므로, 상태 코드만 확인하지 말고 errors를 확인하세요. 읽기 전용 키로는 스캔을 생성할 수 없으며, 이것이 유일한 요청 수준의 실패로, SY90016가 포함된 HTTP 400가 반환됩니다.
전체 코드 목록은 오류 코드에 있습니다.
참고 사항.
- 요청 본문은 반드시
input객체로 감싸야 합니다. - HTTP 상태가 아니라
errors를 확인하세요. 생성 요청이 거부되면HTTP 200가 반환됩니다. - 스캔을 실행하기 전에 전화번호를 정규화하며, 형식, 대소문자 또는 공백만 다른 두 요청은 동일한 비즈니스에 대한 요청으로 간주합니다.
- 생성 요청은 스캔에서 확인하는 디렉터리 수에 관계없이 요청 빈도 제한에서 요청 1회로 계산됩니다.
- 스캔은 90일 동안 보관됩니다. 그 이후에는 스캔 조회 시
SY83005가 포함된404가 반환됩니다. - 이 호출에는 Write(쓰기) 키가 필요합니다.
curl -X POST 'https://listingsapi.com/api/v4/listings/scans' \ -H "Authorization: API $LISTINGSAPI_KEY" \ -H 'Content-Type: application/json' \ -d '{ "input": { "name": "Franklin Barbecue", "street": "900 E 11th St", "city": "Austin", "stateIso": "TX", "postalCode": "78702", "countryIso": "US", "phone": "+15126531187" } }'