apify-verified-email-finder について
確認済みのビジネス用メールアドレスを探すスキルです。地域検索、検索キーワード、既存のURLリストに応じてApify actorを選び、同じ実行内でリード情報の補完とメール検証を行います。結果の絞り込み、重複排除、出力にも対応します。
主な機能
- 01入力に応じたApify actorの選択
- 02リード情報の補完とメール検証
- 03検証状態による結果の絞り込み
- 04重複排除とCSV・JSON出力
活用シーン
- 01地図の掲載情報からビジネス連絡先を探す
- 02検索結果のサイトからメールを探す
- 03既存URLリストのメールを補完・検証する
MCP 対応
Apify MCP サーバー接続時は、`call-actor`でactorを実行し、`get-dataset-items`で結果を取得します。スクリプトとCLIによる実行方法にも対応します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ apify/ awesome-skills --skill apify-verified-email-finderインストール後、Claude Code で/apify-verified-email-finderを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
examples/example-maps-input.mdexample-search-input.mdexample-url-list-input.mdreference/apify-actor-usage.mdoutput-formats.mdtroubleshooting.mdreference/scripts/package.jsonrun_actor.js詳細
認証済みメールアドレスの検索
ユーザーの入力に応じて適切な Apify Actor にルーティングし、リードのエンリッチメントとメールアドレス検証のアドオンを有効にして、1 回の実行で認証済みのビジネスメールアドレスのリストを返します。サードパーティの検証サービス(Hunter、NeverBounce、Apollo)は不要です。検証は同じ Actor の実行内で行われます。
前提条件
(事前に確認する必要はありません)
このスキルでは、2 つの実行方法をサポートしています。環境に合った方法を選んでください。ステップ 4 と 5 には、両方の方法のコマンドが記載されています。
MCP の方法(Claude セッションでのデフォルト、推奨)。 Apify MCP サーバーが接続されていれば、セットアップは不要です。認証はユーザーの Apify アカウントを通じて行われます。call-actor と get-dataset-items の MCP ツールを使用してください。
スクリプトの方法(CLI/スケジュール実行/Claude 以外での実行)。 以下が必要です。
APIFY_TOKENを含む.envファイル- Node.js 20.6 以降(ネイティブの
--env-fileサポート用)
ワークフロー
このチェックリストをコピーし、進捗を記録してください。
Task Progress:
- [ ] Step 1: Collect the six required anchor inputs
- [ ] Step 2: Route to the correct Actor (confirm if ambiguous)
- [ ] Step 3: Build the Actor input (verification always ON)
- [ ] Step 4: Run the Actor and wait
- [ ] Step 5: Apply the result-scope filter, deduplicate, and render
ステップ 1:必須の基点となる 6 つの入力を収集する
Actor を呼び出す前に、6 つすべてをひとまとまりで質問してください。Actor 固有の任意項目(国コード、言語、最大ページ数)はこの質問に含めず、追加質問として確認してください。
- 最初に何をお持ちですか? —
location query/SERP keyword/URL list。これを基にルーティング先を決定します。 - 実際の入力 — 場所を表す文字列、キーワード、または URL そのもの。
- 部門フィルター — 次のいずれか 1 つ以上:
c_suite、product、engineering_technical、design、education、finance、human_resources、information_technology、legal、marketing、medical_health、operations、sales、consulting。デフォルトはany(配列を空のままにする)ですが、毎回確認してください。 - ドメイン/ビジネスあたりの連絡先の最大数 —
maximumLeadsEnrichmentRecordsとして渡します。デフォルトは3ですが、毎回確認してください。 - 出力形式 —
CSVまたはJSON。毎回確認してください。 - 結果の範囲 — 成果物に残すリードを指定します。Actor の実行方法は常に同じです(検証は常に有効)。この項目で制御するのは、実行後のフィルタリングのみです。次のいずれかを選びます。
verified-only(デフォルト) —emailVerification.result == "ok"のリードのみ。コールドメールに最も安全です。verified-plus-catchall—okとcatch_all。キャッチオールは配信できる場合が多いものの、検証できません。all-emails— 検証結果にかかわらず、空でないemailを持つリード。with-phone— メールアドレスの状態にかかわらず、空でない電話番号を持つリード。電話キャンペーンで使用します。everything— 不完全なものも含め、Actor が返したすべてのリード。
ステップ 2:適切な Actor に振り分ける
アンカー #1 を確認して、Actor を選択します。
| ユーザーが最初に指定する内容 | Actor ID | 使用する場面 |
|---|---|---|
| 場所 + 業種(「ベルリンの歯科医」) | compass/crawler-google-places | Maps の掲載情報から地域の見込み客リストを作成する場合。住所、電話番号、営業時間も必要なときに最適です |
| キーワード / 検索クエリ(「おすすめの CRM ソフトウェア」) | apify/google-search-scraper | あるトピックについて、Google が上位に表示するサイトから連絡先を取得する場合 |
| 既存の URL リスト(貼り付け、ファイルパス) | vdrmota/contact-info-scraper | ユーザーがすでにドメインを把握している場合。探索ステップが不要なため、最も安価な方法です |
3 つの Actor はすべて同じ 3 つの追加フィールドを共有しているため、検証の動作はどのルートでも同じです。
判断例
| ユーザーの発言 | ルート |
|---|---|
| 「ミュンヘンの歯科医」/「プラハの弁護士」 | Maps |
| 「『AI agent builder』の上位検索結果にあるマーケティング担当者の連絡先」 | 検索 |
| 「この 5 つの URL のメールアドレスを探してください:acme-co.example、demo-co.example...」 | URL リスト |
| 「Fortune 500 企業の人事担当者の連絡先を探してください」 | 質問:「Fortune 500 HR」の SERP を使いますか、それとも URL リストを使いますか? |
| 「ベルリンの SaaS 企業の連絡先を探してください」 | 質問:「ベルリンの SaaS 企業」で Maps を使いますか、それとも「SaaS 企業 Berlin」の SERP を使いますか? Maps は、企業が Google Maps に掲載されている場合に最適です。 |
| (ユーザーが SERP キーワードと URL リストの両方を貼り付ける) | **質問:**どちらか一方のルートを実行しますか、両方を別々の成果物として実行しますか? |
曖昧さに関するルール:アンカー #1 が不明確な場合は、実行前に一度だけ追加質問します。推測したルートで Actor の計算リソースを決して消費しないでください。
**複数ルートの成果物:**ユーザーが 1 つの成果物に 2 つのルートを明示的に求めている場合は、両方の Actor を実行して結果を連結します。Source 列で各データの出所を明確にし、統合した出力内でメールアドレスを基準に重複を除去します。
ステップ 3:Actor の入力を作成する
選択した Actor にかかわらず、常に次の 3 つのフィールドを設定します。
| フィールド | 値 |
|---|---|
maximumLeadsEnrichmentRecords | アンカー #4(デフォルトは 3、最小値は 1) |
leadsEnrichmentDepartments | アンカー #3 を配列として指定。「任意」の場合は [] |
verifyLeadsEnrichmentEmails | true(常に指定)— セーフガードとして、false は決して設定しないでください |
Actor ごとの全入力パラメーターとペイロードの例は、reference/apify-actor-usage.md に記載されています。
URL リストの事前検証:vdrmota/contact-info-scraper に URL を送信する前に、それぞれを解析し、http/https であり、解析可能であることを確認します。スキップしたエントリーは、出力に skipped — invalid URL と記載し、決して黙って除外しないでください。
ステップ 4:Actor を実行する
リードエンリッチメントを含む Maps と SERP の実行は、クエリごとに数分かかる場合があります。大規模なジョブではタイムアウトを延長してください。
MCP 経由(Claude セッションでのデフォルト):
call-actor ツールを呼び出します。
actor:3 つの Actor ID のいずれか(compass/crawler-google-places、apify/google-search-scraper、vdrmota/contact-info-scraper)input:ステップ 3 の JSON ペイロードcallOptions:十分な上限を設定するには{"timeout": 1800, "memory": 4096}
このツールは runId と datasetId を返します。status がまだ RUNNING の場合は、get-actor-run を呼び出し、waitSecs を最大 45 にして、SUCCEEDED になるまでポーリングします。run_metadata.json サイドカーに記録するため、両方の ID を保存してください。
スクリプト経由(CLI / スケジュール実行):
node --env-file=.env ${CLAUDE_PLUGIN_ROOT}/reference/scripts/run_actor.js \
--actor "ACTOR_ID" \
--input 'JSON_INPUT' \
--output YYYY-MM-DD_verified-emails.csv \
--format csv \
--timeout 900
JSON を使用するには --format json を指定します。スクリプトは未加工のデータセットをディスクに書き込みます。ステップ 5 では、その後に誤一致と対象範囲のフィルターを適用します。
ステップ 5:フィルタリング、重複排除、レンダリング
データセットを取得します。
- MCP 経由: ステップ 4 の
datasetIdを指定してget-dataset-itemsを呼び出します。レスポンスを小さく保つため、fieldsパラメーター(例:title,searchString,countryCode,city,address,phone,website,leadsEnrichment)とclean: trueを使用します。それでもレスポンス上限を超えるデータセットは、curl https://api.apify.com/v2/datasets/<id>/items?fields=...&clean=trueで直接取得し、jqに渡して処理します。 - スクリプト経由: 生データセットは、すでにステップ 4 のファイルとしてディスク上にあります。
各レコードには、事業者のフィールドに加えて、leadsEnrichment 配列(Maps、SERP)またはトップレベルのリードフィールド(URL リスト)が含まれます。各リードには departments 配列、companyWebsite、および result(ok / invalid / disposable / catch_all / unknown / error)と quality(good / risky / bad)を含む emailVerification オブジェクトがあります。
-
誤マッチのフィルター(必須、常に有効)。 ほかのフィルターより先に必ず適用します。リードエンリッチメントサービスは、該当する地域のマッチがない場合に、グローバルなフォールバックリードを返すことがあります(実際に確認されたケース:米国の動物園 1 件の CFO の
companyWebsite=zoo.orgが、マッチャーがzooの部分文字列に反応したため、無関係なポーランドの動物園 8 件に紐付けられました)。companyWebsiteのホスト名がソース URL のホスト名と一致しないリードはすべて除外します(https?://、先頭のwww.、および/以降を取り除き、小文字にします)。除外件数をrun_metadata.jsonに記録し、0 件でない場合は納品物のヘッダーにも明記します。 -
結果スコープによるフィルター(アンカー #6)。2 番目に適用します。
スコープ 行を保持する条件 verified-onlyemailVerification.result == "ok"verified-plus-catchallemailVerification.result in {"ok", "catch_all"}all-emailsemailが空でない(検証結果を問わず、未検証も含む)with-phonephone(または会社の電話番号)が空でない(メールの有無を問わない)everythingすべてのリードを保持し、フィルターを適用しない -
重複排除: 小文字にしたメールアドレスでグループ化し、最初の出現を保持します。同じメールアドレスが複数のソースから見つかった場合は、
Source Query or URLを統合します。メールアドレスがないwith-phoneの行は、小文字にした電話番号で重複排除します。 -
結果が空の場合の表示: 部門フィルター(アンカー #3)によって特定のドメインのリードが 0 件になった場合、そのドメインの行を
Email = ""、Email Verification Status = "no leads matched filter"として含めます。黙って除外してはいけません。これは上記の結果スコープフィルターとは別の処理です。結果が空のドメインの行は、スコープフィルターを適用する前に挿入し、常に表示します。
出力行のスキーマ(Departments を含む 16 列)と形式ごとのレンダリング方法については、reference/output-formats.md を参照してください。
作業例
- Maps:examples/example-maps-input.md
- SERP:examples/example-search-input.md
- URL リスト:examples/example-url-list-input.md
品質ルール(常に適用)
- ガードレール:
verifyLeadsEnrichmentEmails: falseを指定して実行してはいけません。 - 出所と追跡可能性: すべての行の
Source列に値を入力し、Apify のrunIdとdatasetIdをrun_metadata.jsonに記録します。 - 捏造の禁止: データセットにないフィールドは空欄のままにします。
- 納品物ヘッダーの透明性: 適用中の結果スコープと誤マッチの除外件数を明記し、別のスコープでの再レンダリングを提案します。
- 曖昧さの確認: アンカー #1 が不明確な場合は、実行前に確認します。
費用と料金
メール検証で料金が発生するのは、判定が確定した結果(ok / invalid / disposable)のみです。catch_all / unknown / error は無料です。リードエンリッチメントは、抽出に成功したリードごとに課金されます。最新の料金は Apify コンソールで確認してください(料金はサブスクリプションのティアによって異なり、随時変更されます)。
エラー処理
reference/troubleshooting.md を参照してください。