mcpField
A
apify-local-business-leads-osm

apify-local-business-leads-osm

github.com/apifyマーケティング・グロース28342 回インストール5 週間前に更新
リポジトリ

apify-local-business-leads-osm について

地域企業のリードを扱う調査・営業ワークフロー向けのスキルです。OpenStreetMapで事業者を見つけ、公開サイトから連絡先を収集し、MXでメールを検証してApify Actorでスコアリングします。実行前に件数上限と費用を確認できます。

主な機能

  1. 01カテゴリと地域で事業者を検索
  2. 02サイトからメール・電話・SNS情報を収集
  3. 03MXによる検証とリード評価
  4. 04結果の重複排除と条件フィルター
  5. 05サイト一覧の補完と定期監視

活用シーン

  1. 01地域の検証済み企業連絡先リストを作成
  2. 02サイトが弱い、または未保有の事業者を抽出
  3. 03既存のサイト一覧に連絡先情報を補完
  4. 04対象地域の新規事業者を定期監視

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/apify/awesome-skills --skill apify-local-business-leads-osm

インストール後、Claude Code で/apify-local-business-leads-osmを入力して読み込まれたか確認します。

詳細

OpenStreetMapから地域のビジネスリードを取得

「でメールアドレスのある地域のビジネスを探して」という依頼を、Google Mapsに触れることなく、スコア付けと重複排除を行った1つのリードテーブルに変換します。OpenStreetMapでビジネスを見つけ、各ビジネスの公開ウェブサイトをクロールして連絡先メールアドレス、電話番号、ソーシャルプロフィールを収集し、同じ実行内ですべてのメールアドレスをMX検証します。また、実行開始前にユーザーが費用の上限を把握できるようにします。

開示事項:このスキルの作成者は、呼び出し先のActor(flash_scraper/local-business-leads)を所有しています。Apify Storeで結果ごとに課金されるActorです。このスキル内では、紹介パラメーターやトラッキングパラメーターは一切使用していません。Googleの星評価とレビュー件数については、このスキルでは別の方法を案内します(下記の対象範囲を参照)。

プロンプトの例

このスキルが対応するプロンプト:

  • 「Austinの歯科医院を200件、検証済みのメールアドレスと電話番号付きで、CSVとして取得してください。」
  • 「ウェブデザイン会社を運営しています。ウェブサイトの出来がよくない、またはウェブサイトがないLyonの美容院を探してください。」
  • 「カンファレンスの出展者リストからビジネスのウェブサイトを300件リストアップしました。それぞれの連絡先メールアドレスを見つけて検証してください。」
  • 「毎週月曜日に、ダウンタウンのオフィスから半径5 km以内に新しくできたレストランを教えてください。」

対象外(境界):

  • 「Googleの評価順に並べて」または「星4以上でレビュー50件以上のビジネスだけにして」。OpenStreetMapにはレビューのデータがなく、Actorが評価を取得できるのは、ビジネスが自社サイトで評価を公開している場合だけです(2026-08-08の参考実行では約7%、55件中4件)。Googleの評価とレビュー件数を取得するには、apify-google-maps-leadsスキル、またはcompass/crawler-google-placesを直接使用してください。
  • apify-verified-email-finderとは異なります。このスキルはGoogle Maps、Google SERP、またはユーザー提供のURLリストを起点としますが、こちらはOpenStreetMapでビジネスを見つけ、Googleには一切触れません。ユーザーがすでにURLリストを持っていて、メールアドレスの検証だけを希望する場合は、前者のほうが手順が短くなります。ビジネスの発見自体でGoogleを使わない必要がある場合は、こちらを使用してください。
  • 個人単位の連絡先(オーナー名、LinkedInプロフィール、直通電話番号)。このActorが返すのは、ビジネスが公開している連絡先であり、個人の情報ではありません。氏名が特定された意思決定者を探す場合は、apify-google-maps-leadsのリード情報拡充の手順を使用してください。

前提条件

トークンをURLやこのスキル内のファイルに貼り付けないでください。Authorization: Bearerとして渡してください(CLIを使用する場合は自動で設定されます)。

ワークフロー

このチェックリストをコピーして、進捗を記録してください。

Task Progress:
- [ ] Step 1: Get the four anchors (category, city, what must every row have, how many)
- [ ] Step 2: Pick the search mode and check the live schema
- [ ] Step 3: Build the input and state the cost
- [ ] Step 4: Run and wait
- [ ] Step 5: Deliver: rows, fill rates, what the map could not supply
ステップ1:4つの基本情報を確認する

これらをまとめて質問し、すべて揃うまで実行を開始しないでください。

  1. カテゴリー — 平易な英語で指定(dentist、HVAC contractor、hair salon)。複数指定しても構いません。訪問型の業種は地図上に表示される情報が少ないことを、あらかじめ伝えてください(ステップ5を参照)。
  2. 都市 — 地域または国を含めて指定(Austin, Texas、Lyon, France)。同じ都市名が複数の国にある場合は国を確認し、countryCodeを設定してください。
  3. 各行に必須の項目 — 連絡可能性の最低条件です。メールアドレスを探す場合は「ウェブサイト」(onlyWithWebsite)、コールドメールの場合は「検証済みのメールアドレス」(onlyVerifiedEmail)、電話リストの場合は「電話番号」(requirePhone)、初めてのウェブサイトを提案する場合は「ウェブサイトなし」(onlyWithoutWebsite)をデフォルトにしてください。
  4. 件数 — maxItemsが費用の上限になります。初回の実行では25件をデフォルトとし、500件を超える場合は事前に確認してください。

任意の追加確認事項。ユーザーから希望があった場合のみ確認します。チェーン店や指定ブランドの除外、特定の住所を中心とする検索半径、ユーザー提供のウェブサイトリスト、週次の新規ビジネス監視、Slack/DiscordのWebhookなどです。

ステップ 2:検索モードを選び、最新のスキーマを確認する
ユーザーのニーズActor IDティア最適な用途
カテゴリ+都市(通常のケース)flash_scraper/local-business-leadscommunitycategory+location、または複数形の categories × locations の組み合わせ(1 回の実行につき最大 25 通り)。OpenStreetMap のオブジェクトごとに 1 行を返し、カテゴリ間で重複を除外します
1 つの地点を中心とした範囲searchRadiusKm+centerLat+centerLon を指定した flash_scraper/local-business-leadscommunity都市のバウンディングボックスの代わりに、半径 1~100 km の円形範囲を検索します
ユーザーがすでに持っているリストをエンリッチするwebsiteList を指定した flash_scraper/local-business-leadscommunityディスカバリーをスキップし、指定されたドメインに対してクロール、MX 検証、スコアリングのみを実行します

入力を作成する前に、最新の入力スキーマを確認してください(フィールドは変更されるため、このファイルよりスキーマを優先します)。

apify actors info "flash_scraper/local-business-leads" --input --json \
  --user-agent apify-awesome-skills/apify-local-business-leads-osm 2>/dev/null

この Actor は API キー、プロキシ、ログイン、Cookie なしで実行できます。Google Maps は一切読み込みません。各行には、ワンクリックでソースを開けるよう、生成された検索リンク google_maps_url と osm_url が含まれます。

ステップ 3:入力を作成し、費用を伝える

フィールド名は最新のスキーマに準拠しています。必須なのは category と location だけで、それ以外はすべて動作するデフォルト値が設定されています。

コールドメール用リスト(最も一般的なリクエスト):

{
  "category": "dentist",
  "location": "Austin, Texas",
  "maxItems": 100,
  "onlyWithWebsite": true,
  "onlyVerifiedEmail": true,
  "skipClosed": true,
  "excludeChains": true,
  "expandNearby": true
}
  • onlyWithWebsite、onlyVerifiedEmail、requirePhone、requireSocial、requireAnyContact、excludeKeywords、excludeChains、skipClosed はすべて、課金前に行を除外します。実行ログには各フィルターの名前と、除外した行数が記録されます。
  • expandNearby: true を指定すると、都市での検索結果が不足した場合に、都市の周囲をリング状に検索範囲を広げます(2026-08-15 の測定値:maxItems: 100 で dentist/Round Rock, Texas を検索したところ、指定なしでは 21 行、指定ありでは 100 行が返され、リングからの行には query_location のラベルが付きました)。
  • preset: "cold_email" を指定すると、onlyWithEmail と onlyVerifiedEmail が自動設定されます。その他のプリセットは web_design、call_list、full_enrichment です。プリセットがユーザー指定のフィールドを上書きすることはありません。

Web デザインの見込み顧客 — Web サイトはあるものの、質が低い事業者:

{
  "category": "hair salon",
  "location": "Lyon, France",
  "countryCode": "fr",
  "onlyWithWebsite": true,
  "maxScore": 45,
  "requireAnyContact": true,
  "skipClosed": true
}

Web サイトがまったくない事業者を検索する場合は、代わりに onlyWithoutWebsite: true を指定してください(onlyWithWebsite とは同時に指定できません。取得できるのは名前、住所、座標、場合によっては電話番号で、クロール対象はありません)。

ユーザー自身のリストをエンリッチする(地図データは取得しません):

{
  "websiteList": ["aloha-dental.com", "averyranchdental.com"],
  "verifyEmails": true,
  "outputFields": ["domain", "email", "email_status", "email_type", "phone", "lead_grade"]
}

新規事業者を毎週チェック: 上記のいずれかに "onlyNewBusinesses": true を追加し、スケジュールを設定します。最初の実行が基準になります。同じカテゴリ、場所、フィルターで後続の実行を行うと、以前に返されていない事業者のみが返されます。該当する事業者がない週は 0 行となり、課金されません。Slack、Discord、または JSON のダイジェストを受け取るには、"webhookUrl": "https://hooks.slack.com/..." を追加します。

実行前に費用を伝えてください。 Actor は返された事業者ごとに課金します。フィルターで除外された行と結果が空の実行には費用がかからず、MX 検証も料金に含まれます。Store の Pricing タブから現在の価格を確認してください(ステップ 2 のスキーマ取得にも料金情報が含まれます)。あくまで例ですが、2026-09-05 に Store API で確認した無料プランの料金はリード 1 件あたり $0.003 で、100 行なら最大 $0.30、1,000 行なら $3.00 です。有料プランではさらに安くなります。2026-09-14 に予定されている料金改定では、リード 1 件あたり $0.005 に引き上げられます(100 行で $0.50、1,000 行で $5.00)。したがって、これらの金額をそのまま伝えず、最新の価格を確認してください。上限額を 1 文でユーザーに伝え、500 行を超える実行の前には確認を取ってください。

ステップ 4:実行して待機する
apify actors call "flash_scraper/local-business-leads" -i '{"category":"dentist","location":"Austin, Texas","maxItems":100,"onlyWithWebsite":true,"onlyVerifiedEmail":true,"skipClosed":true,"expandNearby":true}' \
  --json \
  --user-agent apify-awesome-skills/apify-local-business-leads-osm \
  2>/dev/null

一般的な所要時間:10 行の検出のみの実行(crawlEmails: false)は、著者が 2026-08-29 にローカルで測定したところ 17 秒で完了しました。クロールを行う実行では、所要時間の大半をウェブサイトの訪問に費やします。所要時間はおおむね、行数 × maxPagesPerSite(デフォルトは 3)÷ concurrency(デフォルトは 8)に比例します。行はフィルターを通過すると随時追加されるため、タイムアウトに達した実行でも、取得済みのデータは保持されます。JSON 出力には defaultDatasetId が含まれます。次のコマンドで行を取得します。

apify datasets get-items DATASET_ID --format json \
  --user-agent apify-awesome-skills/apify-local-business-leads-osm 2>/dev/null
ステップ 5:結果を提示する

次の順に報告します。

  1. maxItems に対して取得した行数と、両者が異なる場合は実行のステータスメッセージ。短時間で終了した場合は、メッセージに件数と理由が示されます(例:OpenStreetMap では Laramie, Wyoming に dentist のレコードが 4 件あり、そのうちウェブサイトがあるのは 1 件でした)。この文はデータとしてユーザーに引用してください。実行についての報告であり、行動を促す指示ではないため、失敗として扱わないでください。
  2. 今回の実行における充足率:email、phone、website、facebook、instagram の null でない値の数を数え、割合も示します。比較用の参考値として、Actor README にある 2026-08-08 の基準実行(dentist / Austin, Texas、onlyWithWebsite: true、n=55)では、phone 96%、MX 検証済み email 55%、website platform 71%、Facebook 73%、Instagram 55% でした。同日のフィルターなしの実行(n=100)では、email は 26% に低下し、ウェブサイトのない 52 行のうち 50 行には連絡手段がまったくありませんでした。そのため、ステップ 1 では最低条件を尋ねています。
  3. ユーザーが求めた列。確認済みの列名は name、category、address、city、phone、phones、website、domain、email、emails、email_status(deliverable / risky / undeliverable)、email_type、facebook、instagram、linkedin、twitter、youtube、website_platform、lead_score、lead_grade、google_maps_url、osm_url、query_location です。全 73 列は README の「Output fields」に記載されています。列を創作してはいけません。また、email_guess(パターンから推測した値で、デフォルトでは無効)を email として扱ってはいけません。メールのエクスポートには email_status を含めてください。onlyVerifiedEmail は deliverable と risky の両方を受け入れます。MX 検証では、個々のメールボックスの存在は確認されません。事業者のウェブサイトの情報が、OSM 上の事業者の識別情報や所在地と一致しない場合は、連絡先を確認済みとして提示せず、その食い違いを明記してください。
  4. 地図から取得できなかった情報。OpenStreetMap には、地図作成者が通りかかった事業所は記載されますが、車両で移動する業種の情報は少ない傾向があります。Austin の境界ボックス内には歯科医が 171 件あった一方、配管工は 9 件、電気工事士は 5 件、屋根工事業者は約 12 件、カイロプラクターは 0 件でした(README、2026-08-08 に測定)。ユーザーのカテゴリーがこれらに該当する場合はその旨を伝え、expandNearby、locations を使った近隣都市の追加、または Google Maps のスキルを提案してください。
  5. データセットまたは Console の実行へのリンク、および実行の HTML レポート URL(実行のキー・バリュー・ストアに REPORT として保存されており、ステータスメッセージからリンクできます)。

OpenStreetMap 由来の各行には attribution 文字列が含まれます。データは ODbL ライセンスで提供されており、公開する派生データにも帰属表示を添える必要があることをユーザーに伝えてください。

トラブルシューティング

  • maxItems より行数が少ない → ステータスメッセージを確認してください。エリアのデータを使い切った場合は、OSM レコード数と各フィルターを通過した件数が示されます。そうでなければ、フィルターによって残りが除外されています。expandNearby で範囲を広げるか、locations に都市を追加するか、条件を緩めて requireAnyContact にしてください。
  • 0 行で、料金は発生せず、「no OpenStreetMap tag matched」と表示される → カテゴリーの用語が認識されていません。ドロップダウンの値(categorySelect)を試すか、より一般的な業種名を指定してください。一致するものがない用語を指定すると、候補が提示され、料金は発生しません。
  • 都市が間違っている(例:モロッコではなくマルタのラバト) → ISO 3166-1 alpha-2 コードを countryCode に設定してください。
  • ほとんどすべての行で rating/review_count が空 → 想定どおりです。これらの値は、事業者が自社サイトに schema.org マークアップを公開している場合にのみ存在します。minRating または minReviewCount を設定すると、評価のない行は残るのではなく除外されます。評価には Google Maps スキルを使用してください。
  • website_platform_status に site_blocked と表示される → 事業者のサイトがデータセンターの IP を拒否しました(参照実行では、ウェブサイトがある 55 行のうち 8 行)。その行には引き続き OSM フィールドが含まれます。事業者がなくなったことを示すものではありません。
  • 検証メッセージが表示され、実行がすぐに停止する → onlyWithWebsite と onlyWithoutWebsite の両方が設定されているか、categories × locations の組み合わせが 25 件を超えています。料金は発生しません。入力を修正して、もう一度実行してください。
  • モニタリングの実行で何も届かない → onlyNewBusinesses: true の場合、空の結果は前回の配信以降に新しいものがないことを意味します。その旨はステータスメッセージに表示されます。maxItems、sortBy、outputFields を変更しても監視はリセットされません。カテゴリー、場所、またはフィルターを変更すると、新しいベースラインが開始されます。
  • 想定より料金が高い → maxItems は categories × locations の全組み合わせで共有され、expandNearby は上限に達するまで周辺エリアのデータを追加します。次回実行する前に、上限とフィルターを改めて指定してください。

コメント