POST/api/v4/listings/scans

listings scanを作成

任意のビジネスがディレクトリネットワーク全体でどのように掲載されているかの監査を開始し、完了Webhookを待機できるようにスキャンを即座に返します。

API キーが必要です。ヘッダーの形式とキーのローテーションについては認証を参照してください。

パラメーター

ボディ

名前型必須説明
inputobject必須Wrapper object. The entire request body must be nested under `input`.
input.namestring必須Business name, up to 150 characters.
input.streetstring必須Street address, up to 200 characters.
input.citystring必須City, up to 100 characters.
input.stateIsostring任意State or province code, up to 50 characters. Required for every country except `GB`.
input.postalCodestring任意Postal code, up to 20 characters. Required for every country except `NG` and `AE`.
input.countryIsostring必須Two-letter ISO 3166-1 country code, for example `US`.
input.phonestring必須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 と値をご自身のものに置き換えてください。

Request body
{  "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.
Response
{  "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.
Response
{  "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つのフィールドは、国によって必須かどうかが異なります。

フィールド必須例外
stateIsoはいGBでは必須ではありません。
postalCodeはいNGとAEでは必須ではありません。

値が欠落しているか形式が不正な場合はSY83003で拒否され、エラーにフィールド名が示されます。phoneは6〜15桁の数字、countryIsoは2文字の英字である必要があります。

再利用と無料スキャン

スキャンで常に新しい検索が実行されるわけではありません。返されたスキャンのsourceフィールドは、結果の取得元を示します。

source返される条件
DIRECTORY_SEARCHディレクトリを新たに検索します。月間利用枠を消費するのは、この種類のみです。
RECENT_SCAN過去7日以内に誰かが同じ事業者をスキャンしているため、その結果がコピーされています。resultsAsOfはデータの収集日時を示します。すでにCOMPLETEDの状態で返されます。
LOCATION_LISTINGS電話番号、郵便番号、国が、自分のアカウント内の拠点のいずれかと一致しています。結果はその拠点の実際の掲載情報から取得され、locationIdが設定され、各結果にsyncStatusが含まれます。

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 が返されます。

コード意味対処方法
SY83001ご利用のプランでは Listings scans を利用できません。有料プランのアカウントを使用してください。デイパスではスキャンを実行できません。
SY83002月間利用枠を使い切っています。メッセージには上限とリセット時刻が含まれ、quota が返されます。quota.resetsAt を待つか、利用枠の拡大についてお問い合わせください。最近のスキャンの再利用は無料です。
SY83003フィールドが不足しているか、無効です。contextInfo の field に該当するフィールド名が示されます。該当するフィールドを修正して再送信してください。
SY83004その国ではスキャンを利用できません。countryIso を確認してください。メッセージには拒否されたコードが示されます。
SY83010スキャンは一時的に利用できません。後でもう一度お試しください。

コードの全一覧はエラーコードにあります。

注意事項。

  • リクエストボディは、input オブジェクトで囲む必要があります。
  • HTTP ステータスではなく errors を確認してください。 作成リクエストが拒否されると、HTTP 200 が返されます。
  • 電話番号はスキャンの実行前に正規化され、書式、大文字と小文字、または空白だけが異なる 2 つのリクエストは、同じビジネスとして扱われます。
  • 作成リクエストは、スキャンで確認するディレクトリの数にかかわらず、レート制限に対して 1 リクエストとしてカウントされます。
  • スキャンは 90 日間保持されます。その後は、スキャンの読み取りで SY83005 を含む 404 が返されます。
  • この呼び出しには Write(書き込み)キーが必要です。
Request
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"    }  }'