/api/v4/listings/scanslistings scanを作成
任意のビジネスがディレクトリネットワーク全体でどのように掲載されているかの監査を開始し、完了Webhookを待機できるようにスキャンを即座に返します。
パラメーター
ボディ
| 名前 | 型 | 必須 | 説明 |
|---|---|---|---|
| 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[]にはレポートに表示するディレクトリごとの詳細が含まれます。
使用例:管理中の事業者の状態確認。 自分のアカウント内の拠点の事業者情報をスキャンします。スキャンはその拠点を認識し、再検索する代わりに、その拠点の実際の掲載情報から結果を生成します(再利用と無料スキャンを参照)。
スキャンが終了するまでの流れ
スキャンはQUEUED、IN_PROGRESSの順に進み、COMPLETEDまたはFAILEDで終了します。ほとんどのスキャンは1〜7分で完了します。約15分経過してもディレクトリから応答がない場合、そのディレクトリの結果はUNAVAILABLEに設定され、他の結果を含めてスキャンが完了します。
- Webhookの使用を推奨します。
listing_scan.completedイベントとlisting_scan.failedイベントはスキャンごとに1回配信され、GET /listings/scans/{scanId}が返すものと同じスキャンオブジェクトが結果を含めて渡されます。これらのイベントは、Webhookが有効で、Webhook URLが検証済みのアカウントに、他のすべてのイベントと同様に署名付きで送信されます。listing_scan.completedを参照してください。 - 代替手段としてポーリングを使用します。 Webhookを受信できない場合は、
statusがCOMPLETEDまたはFAILEDになるまで、15秒ごとにスキャンを取得してください。これより短い間隔でポーリングしても効果はなく、リクエストの割り当てを消費します。
必須フィールド
name、street、city、countryIso、phoneは常に必須です。次の2つのフィールドは、国によって必須かどうかが異なります。
値が欠落しているか形式が不正な場合はSY83003で拒否され、エラーにフィールド名が示されます。phoneは6〜15桁の数字、countryIsoは2文字の英字である必要があります。
再利用と無料スキャン
スキャンで常に新しい検索が実行されるわけではありません。返されたスキャンのsourceフィールドは、結果の取得元を示します。
7日以内に同じ事業者を再度スキャンすると、新しいスキャンの代わりにアカウント内の既存のスキャンが返され、レスポンスにはreused: trueが含まれます。新しいスキャンは開始されず、新しいWebhookも送信されないため、別のイベントを待つのではなく、返されたスキャンを確認してください(まだ実行中の場合もあります)。再利用期間内に自分のアカウント内の拠点を再度スキャンした場合も、同じ動作になります。
月間利用枠
Listings scans は有料プランに含まれ、月間利用枠はプランによって異なります。無料のサンドボックス用デイパスでは利用できません。利用枠を消費するのは、新規の 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が返されます。 - 電話番号はスキャンの実行前に正規化され、書式、大文字と小文字、または空白だけが異なる 2 つのリクエストは、同じビジネスとして扱われます。
- 作成リクエストは、スキャンで確認するディレクトリの数にかかわらず、レート制限に対して 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" } }'