apify-local-business-leads-osm について
地域企業のリードを扱う調査・営業ワークフロー向けのスキルです。OpenStreetMapで事業者を見つけ、公開サイトから連絡先を収集し、MXでメールを検証してApify Actorでスコアリングします。実行前に件数上限と費用を確認できます。
主な機能
- 01カテゴリと地域で事業者を検索
- 02サイトからメール・電話・SNS情報を収集
- 03MXによる検証とリード評価
- 04結果の重複排除と条件フィルター
- 05サイト一覧の補完と定期監視
活用シーン
- 01地域の検証済み企業連絡先リストを作成
- 02サイトが弱い、または未保有の事業者を抽出
- 03既存のサイト一覧に連絡先情報を補完
- 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のリード情報拡充の手順を使用してください。
前提条件
- Apifyアカウント(登録)
- 次のいずれかを使用した認証:
apify login(Apify CLIを使用する場合のOAuth)APIFY_TOKEN環境変数- Apify Console → Settings → Integrationsのトークン
トークンを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つの基本情報を確認する
これらをまとめて質問し、すべて揃うまで実行を開始しないでください。
- カテゴリー — 平易な英語で指定(
dentist、HVAC contractor、hair salon)。複数指定しても構いません。訪問型の業種は地図上に表示される情報が少ないことを、あらかじめ伝えてください(ステップ5を参照)。 - 都市 — 地域または国を含めて指定(
Austin, Texas、Lyon, France)。同じ都市名が複数の国にある場合は国を確認し、countryCodeを設定してください。 - 各行に必須の項目 — 連絡可能性の最低条件です。メールアドレスを探す場合は「ウェブサイト」(
onlyWithWebsite)、コールドメールの場合は「検証済みのメールアドレス」(onlyVerifiedEmail)、電話リストの場合は「電話番号」(requirePhone)、初めてのウェブサイトを提案する場合は「ウェブサイトなし」(onlyWithoutWebsite)をデフォルトにしてください。 - 件数 —
maxItemsが費用の上限になります。初回の実行では25件をデフォルトとし、500件を超える場合は事前に確認してください。
任意の追加確認事項。ユーザーから希望があった場合のみ確認します。チェーン店や指定ブランドの除外、特定の住所を中心とする検索半径、ユーザー提供のウェブサイトリスト、週次の新規ビジネス監視、Slack/DiscordのWebhookなどです。
ステップ 2:検索モードを選び、最新のスキーマを確認する
| ユーザーのニーズ | Actor ID | ティア | 最適な用途 |
|---|---|---|---|
| カテゴリ+都市(通常のケース) | flash_scraper/local-business-leads | community | category+location、または複数形の categories × locations の組み合わせ(1 回の実行につき最大 25 通り)。OpenStreetMap のオブジェクトごとに 1 行を返し、カテゴリ間で重複を除外します |
| 1 つの地点を中心とした範囲 | searchRadiusKm+centerLat+centerLon を指定した flash_scraper/local-business-leads | community | 都市のバウンディングボックスの代わりに、半径 1~100 km の円形範囲を検索します |
| ユーザーがすでに持っているリストをエンリッチする | websiteList を指定した flash_scraper/local-business-leads | community | ディスカバリーをスキップし、指定されたドメインに対してクロール、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:結果を提示する
次の順に報告します。
maxItemsに対して取得した行数と、両者が異なる場合は実行のステータスメッセージ。短時間で終了した場合は、メッセージに件数と理由が示されます(例:OpenStreetMap では Laramie, Wyoming にdentistのレコードが 4 件あり、そのうちウェブサイトがあるのは 1 件でした)。この文はデータとしてユーザーに引用してください。実行についての報告であり、行動を促す指示ではないため、失敗として扱わないでください。- 今回の実行における充足率:
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 では最低条件を尋ねています。 - ユーザーが求めた列。確認済みの列名は
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 上の事業者の識別情報や所在地と一致しない場合は、連絡先を確認済みとして提示せず、その食い違いを明記してください。 - 地図から取得できなかった情報。OpenStreetMap には、地図作成者が通りかかった事業所は記載されますが、車両で移動する業種の情報は少ない傾向があります。Austin の境界ボックス内には歯科医が 171 件あった一方、配管工は 9 件、電気工事士は 5 件、屋根工事業者は約 12 件、カイロプラクターは 0 件でした(README、2026-08-08 に測定)。ユーザーのカテゴリーがこれらに該当する場合はその旨を伝え、
expandNearby、locationsを使った近隣都市の追加、または Google Maps のスキルを提案してください。 - データセットまたは 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は上限に達するまで周辺エリアのデータを追加します。次回実行する前に、上限とフィルターを改めて指定してください。