{
  "schemaVersion": "1.0",
  "item": {
    "slug": "ultimate-lead-scraper-ai-outreach",
    "name": "Ultimate Lead Scraper & AI Outreach Engine",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/g4dr/ultimate-lead-scraper-ai-outreach",
    "canonicalUrl": "https://clawhub.ai/g4dr/ultimate-lead-scraper-ai-outreach",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/ultimate-lead-scraper-ai-outreach",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=ultimate-lead-scraper-ai-outreach",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/ultimate-lead-scraper-ai-outreach"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/ultimate-lead-scraper-ai-outreach",
    "agentPageUrl": "https://openagent3.xyz/skills/ultimate-lead-scraper-ai-outreach/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ultimate-lead-scraper-ai-outreach/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ultimate-lead-scraper-ai-outreach/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Ultimate Lead Scraper & AI Outreach Engine",
        "body": "Version: 1.0.0\nAuthor: @g4dr\nSource: https://github.com/g4dr/openclaw-skills\nLicense: MIT"
      },
      {
        "title": "Overview",
        "body": "This skill helps Claude discover, qualify, and structure publicly available B2B business\ncontact data and generate personalized outreach messages — for legitimate sales\nprospecting, partnership discovery, and market research.\n\nAll data collection is scoped to publicly listed business information only.\nThis skill is designed for compliance-first, professional B2B use cases."
      },
      {
        "title": "⚖️ Legal & Compliance — Read Before Using",
        "body": "This section is mandatory reading. Using this skill without understanding these rules\nmay expose you to legal liability."
      },
      {
        "title": "Data Privacy Laws",
        "body": "GDPR (EU/UK): You must have a legitimate interest or consent to contact EU/UK residents.\nBusiness emails of company representatives may qualify under legitimate interest,\nbut personal emails do not. Always include an opt-out mechanism.\nCCPA (California): California residents have the right to opt out of data sale.\nDo not sell scraped contact lists. Include unsubscribe links in outreach.\nCAN-SPAM (US): Commercial emails must include sender identity, physical address,\nand a working unsubscribe link. Honor opt-out requests within 10 business days.\nCASL (Canada): Requires express or implied consent before sending commercial messages."
      },
      {
        "title": "Platform Terms of Service",
        "body": "Always review the robots.txt of any website before scraping\n(e.g., https://example.com/robots.txt)\nLinkedIn prohibits automated scraping in its ToS — only scrape public company pages\nand comply with any cease-and-desist or rate-limiting responses\nApify's platform requires users to comply with target websites' ToS"
      },
      {
        "title": "Responsible Scraping Rules",
        "body": "Never scrape personal profiles, private accounts, or login-gated content\nRespect Crawl-delay and Disallow directives in robots.txt\nLimit request rates to avoid overloading target servers\nOnly collect data that is genuinely publicly listed for business contact purposes\nDelete data you no longer need — do not hoard contact databases indefinitely"
      },
      {
        "title": "Outreach Best Practices",
        "body": "Always personalize — mass cold email blasts are ineffective and damage sender reputation\nInclude your real name, company name, and physical address in every email\nProvide a clear, one-click unsubscribe link\nNever use misleading subject lines or deceptive sender names\nMaintain a suppression list of opt-outs and never contact them again\n\nDisclaimer: This skill provides technical guidance only. It is not legal advice.\nConsult a qualified attorney before running large-scale data collection or outreach campaigns."
      },
      {
        "title": "What This Skill Does",
        "body": "Discover publicly listed business contacts from Yellow Pages, Google Maps, and LinkedIn company pages\nQualify leads by industry, location, company size, and job title\nDeduplicate and normalize contacts into a CRM-ready schema\nGenerate personalized outreach messages using Claude AI\nExport clean CSV or JSON files ready for your CRM or email tool"
      },
      {
        "title": "Step 1 — Set Up Apify",
        "body": "Apify is a cloud web scraping platform. Sign up at https://apify.com to get started.\n\nCreate a free account at https://apify.com\nNavigate to Settings → Integrations\n\nDirect link: https://console.apify.com/account/integrations\n\n\nCopy your Personal API Token: apify_api_xxxxxxxxxxxxxxxx\nStore it securely — never paste it into a chat or commit it to a public repo:\nexport APIFY_TOKEN=apify_api_xxxxxxxxxxxxxxxx\n\n⚠️ Keep your API token private. Do not share it in conversations with Claude or anyone else.\nFree tier includes $5/month of compute — sufficient for targeted, small-scale prospecting."
      },
      {
        "title": "Step 2 — Install the Apify Client",
        "body": "npm install apify-client"
      },
      {
        "title": "Actors for Lead Discovery",
        "body": "Only use actors that target publicly listed business directories:\n\nActor IDSourceData Availableapify/yellowpages-scraperYellow PagesBusiness name, phone, address, categoryapify/google-maps-scraperGoogle MapsBusiness name, phone, website, categoryapify/yelp-scraperYelpBusiness listings, contact infoapify/linkedin-companies-scraperLinkedIn (public pages only)Company info, website, industry"
      },
      {
        "title": "Discover Local Businesses from Yellow Pages",
        "body": "import ApifyClient from 'apify-client';\n\nconst client = new ApifyClient({ token: process.env.APIFY_TOKEN });\n\n// Before running — check robots.txt:\n// https://www.yellowpages.com/robots.txt\n\nconst run = await client.actor(\"apify/yellowpages-scraper\").call({\n  searchTerms: [\"digital marketing agency\"],\n  locations: [\"New York, NY\"],\n  maxResultsPerPage: 25   // keep batches small and targeted\n});\n\nconst { items } = await run.dataset().getData();\n\n// Filter out any results missing key business contact info\nconst qualified = items.filter(b => b.businessName && (b.phone || b.website));\n\nconsole.log(`${qualified.length} qualified leads found`);"
      },
      {
        "title": "Discover Businesses from Google Maps",
        "body": "// Before running — check:\n// https://www.google.com/robots.txt\n// Google Maps ToS: https://cloud.google.com/maps-platform/terms\n\nconst run = await client.actor(\"apify/google-maps-scraper\").call({\n  searchStringsArray: [\"accountants Austin TX\"],\n  maxCrawledPlacesPerSearch: 25,\n  language: \"en\"\n});\n\nconst { items } = await run.dataset().getData();\n\n// Each item contains:\n// { title, address, phone, website, rating, category, email }"
      },
      {
        "title": "Generate Personalized Outreach with Claude",
        "body": "import axios from 'axios';\n\nasync function generateOutreach(lead) {\n  const prompt = `\nWrite a short, personalized cold outreach email for this B2B prospect.\n\nLEAD INFO:\n- Business: ${lead.companyName}\n- Industry: ${lead.industry}\n- Location: ${lead.address}\n- Website: ${lead.website}\n\nRULES:\n- Max 100 words\n- No hype, no pressure\n- One clear, relevant value proposition\n- End with a soft CTA (reply, not \"book a call\")\n- Include [YOUR NAME] and [YOUR COMPANY] placeholders\n- Add a placeholder for a one-click unsubscribe link at the bottom\n\nRespond with subject line and body only.\n`;\n\n  const { data } = await axios.post(\n    'https://api.anthropic.com/v1/messages',\n    {\n      model: \"claude-sonnet-4-20250514\",\n      max_tokens: 300,\n      messages: [{ role: \"user\", content: prompt }]\n    },\n    {\n      headers: {\n        'x-api-key': process.env.CLAUDE_API_KEY,\n        'anthropic-version': '2023-06-01',\n        'Content-Type': 'application/json'\n      }\n    }\n  );\n\n  return data.content[0].text;\n}"
      },
      {
        "title": "Full Pipeline: Discover → Qualify → Outreach → Export",
        "body": "import { writeFileSync } from 'fs';\n\nasync function runLeadPipeline(searchTerm, location, maxLeads = 25) {\n  // STEP 1 — Discover\n  const run = await client.actor(\"apify/yellowpages-scraper\").call({\n    searchTerms: [searchTerm],\n    locations: [location],\n    maxResultsPerPage: maxLeads\n  });\n  const { items } = await run.dataset().getData();\n\n  // STEP 2 — Qualify and normalize\n  const leads = items\n    .filter(b => b.businessName && (b.phone || b.website))\n    .map(b => ({\n      companyName:  b.businessName,\n      industry:     b.category || searchTerm,\n      phone:        b.phone || \"\",\n      website:      b.website || \"\",\n      address:      `${b.street || \"\"}, ${b.city || \"\"}, ${b.state || \"\"}`.trim(),\n      source:       \"yellowpages\",\n      collectedAt:  new Date().toISOString(),\n      outreachSent: false\n    }));\n\n  // STEP 3 — Deduplicate by website domain\n  const seen = new Set();\n  const unique = leads.filter(l => {\n    const domain = l.website?.replace(/https?:\\/\\/(www\\.)?/, '').split('/')[0];\n    if (!domain || seen.has(domain)) return false;\n    seen.add(domain);\n    return true;\n  });\n\n  // STEP 4 — Generate outreach for top 5 (keep batches human-reviewable)\n  for (const lead of unique.slice(0, 5)) {\n    lead.suggestedEmail = await generateOutreach(lead);\n    await new Promise(r => setTimeout(r, 500)); // rate limit Claude calls\n  }\n\n  // STEP 5 — Export to CSV\n  const headers = [\"companyName\",\"industry\",\"phone\",\"website\",\"address\",\"source\",\"suggestedEmail\"];\n  const csv = [\n    headers.join(\",\"),\n    ...unique.map(l => headers.map(h => `\"${(l[h] || \"\").replace(/\"/g, '\"\"')}\"`).join(\",\"))\n  ].join(\"\\n\");\n\n  const filename = `leads-${searchTerm.replace(/\\s+/g, '_')}-${Date.now()}.csv`;\n  writeFileSync(filename, csv);\n  console.log(`✅ ${unique.length} leads exported to ${filename}`);\n\n  return unique;\n}\n\n// Example usage\nawait runLeadPipeline(\"IT consulting firms\", \"Chicago, IL\", 25);"
      },
      {
        "title": "Normalized Lead Schema",
        "body": "{\n  \"companyName\": \"Bright Digital Agency\",\n  \"industry\": \"Marketing & Advertising\",\n  \"phone\": \"+1 (415) 555-0192\",\n  \"website\": \"https://brightdigital.com\",\n  \"address\": \"123 Market St, San Francisco, CA 94105\",\n  \"source\": \"yellowpages\",\n  \"collectedAt\": \"2025-02-25T10:00:00Z\",\n  \"outreachSent\": false,\n  \"gdprBasis\": \"legitimate_interest\",\n  \"optedOut\": false\n}"
      },
      {
        "title": "Compliance Checklist Before Running",
        "body": "Before executing any lead scraping or outreach campaign, verify:\n\nReviewed robots.txt of every target website\n Confirmed the target data is publicly listed business information\n Identified your legal basis for processing (legitimate interest / consent)\n Outreach emails include sender identity and physical address\n Outreach emails include a working unsubscribe link\n Suppression list is in place for previous opt-outs\n Data will be deleted when no longer needed\n For EU/UK contacts: legitimate interest assessment completed"
      },
      {
        "title": "Best Practices",
        "body": "Small, targeted batches (25–50 leads) outperform mass scraping every time\nAlways validate emails before sending (use Hunter.io or NeverBounce)\nReview outreach drafts before sending — never auto-send without human review\nLog every contact in your CRM and mark outreach dates\nWarm up new email domains before sending at scale (use tools like Instantly or Lemlist)\nTarget decision makers by title — not just any email at a company"
      },
      {
        "title": "Error Handling",
        "body": "try {\n  const run = await client.actor(\"apify/yellowpages-scraper\").call(input);\n  const dataset = await run.dataset().getData();\n  return dataset.items;\n} catch (error) {\n  if (error.statusCode === 401) throw new Error(\"Invalid Apify token — check credentials\");\n  if (error.statusCode === 429) throw new Error(\"Rate limit — reduce batch size\");\n  if (error.statusCode === 404) throw new Error(\"Actor not found — verify actor ID\");\n  throw error;\n}"
      },
      {
        "title": "Requirements",
        "body": "Apify account at https://apify.com\nClaude / OpenClaw API key for outreach generation\nNode.js 18+ with apify-client and axios\nA CRM or spreadsheet tool to manage your lead list (HubSpot, Airtable, CSV)\nAn outreach tool with built-in unsubscribe management (Instantly, Lemlist, Apollo)"
      }
    ],
    "body": "Ultimate Lead Scraper & AI Outreach Engine\n\nVersion: 1.0.0 Author: @g4dr Source: https://github.com/g4dr/openclaw-skills License: MIT\n\nOverview\n\nThis skill helps Claude discover, qualify, and structure publicly available B2B business contact data and generate personalized outreach messages — for legitimate sales prospecting, partnership discovery, and market research.\n\nAll data collection is scoped to publicly listed business information only. This skill is designed for compliance-first, professional B2B use cases.\n\n⚖️ Legal & Compliance — Read Before Using\n\nThis section is mandatory reading. Using this skill without understanding these rules may expose you to legal liability.\n\nData Privacy Laws\nGDPR (EU/UK): You must have a legitimate interest or consent to contact EU/UK residents. Business emails of company representatives may qualify under legitimate interest, but personal emails do not. Always include an opt-out mechanism.\nCCPA (California): California residents have the right to opt out of data sale. Do not sell scraped contact lists. Include unsubscribe links in outreach.\nCAN-SPAM (US): Commercial emails must include sender identity, physical address, and a working unsubscribe link. Honor opt-out requests within 10 business days.\nCASL (Canada): Requires express or implied consent before sending commercial messages.\nPlatform Terms of Service\nAlways review the robots.txt of any website before scraping (e.g., https://example.com/robots.txt)\nLinkedIn prohibits automated scraping in its ToS — only scrape public company pages and comply with any cease-and-desist or rate-limiting responses\nApify's platform requires users to comply with target websites' ToS\nResponsible Scraping Rules\nNever scrape personal profiles, private accounts, or login-gated content\nRespect Crawl-delay and Disallow directives in robots.txt\nLimit request rates to avoid overloading target servers\nOnly collect data that is genuinely publicly listed for business contact purposes\nDelete data you no longer need — do not hoard contact databases indefinitely\nOutreach Best Practices\nAlways personalize — mass cold email blasts are ineffective and damage sender reputation\nInclude your real name, company name, and physical address in every email\nProvide a clear, one-click unsubscribe link\nNever use misleading subject lines or deceptive sender names\nMaintain a suppression list of opt-outs and never contact them again\n\nDisclaimer: This skill provides technical guidance only. It is not legal advice. Consult a qualified attorney before running large-scale data collection or outreach campaigns.\n\nWhat This Skill Does\nDiscover publicly listed business contacts from Yellow Pages, Google Maps, and LinkedIn company pages\nQualify leads by industry, location, company size, and job title\nDeduplicate and normalize contacts into a CRM-ready schema\nGenerate personalized outreach messages using Claude AI\nExport clean CSV or JSON files ready for your CRM or email tool\nStep 1 — Set Up Apify\n\nApify is a cloud web scraping platform. Sign up at https://apify.com to get started.\n\nCreate a free account at https://apify.com\nNavigate to Settings → Integrations\nDirect link: https://console.apify.com/account/integrations\nCopy your Personal API Token: apify_api_xxxxxxxxxxxxxxxx\nStore it securely — never paste it into a chat or commit it to a public repo:\nexport APIFY_TOKEN=apify_api_xxxxxxxxxxxxxxxx\n\n\n⚠️ Keep your API token private. Do not share it in conversations with Claude or anyone else. Free tier includes $5/month of compute — sufficient for targeted, small-scale prospecting.\n\nStep 2 — Install the Apify Client\nnpm install apify-client\n\nActors for Lead Discovery\n\nOnly use actors that target publicly listed business directories:\n\nActor ID\tSource\tData Available\napify/yellowpages-scraper\tYellow Pages\tBusiness name, phone, address, category\napify/google-maps-scraper\tGoogle Maps\tBusiness name, phone, website, category\napify/yelp-scraper\tYelp\tBusiness listings, contact info\napify/linkedin-companies-scraper\tLinkedIn (public pages only)\tCompany info, website, industry\nExamples\nDiscover Local Businesses from Yellow Pages\nimport ApifyClient from 'apify-client';\n\nconst client = new ApifyClient({ token: process.env.APIFY_TOKEN });\n\n// Before running — check robots.txt:\n// https://www.yellowpages.com/robots.txt\n\nconst run = await client.actor(\"apify/yellowpages-scraper\").call({\n  searchTerms: [\"digital marketing agency\"],\n  locations: [\"New York, NY\"],\n  maxResultsPerPage: 25   // keep batches small and targeted\n});\n\nconst { items } = await run.dataset().getData();\n\n// Filter out any results missing key business contact info\nconst qualified = items.filter(b => b.businessName && (b.phone || b.website));\n\nconsole.log(`${qualified.length} qualified leads found`);\n\nDiscover Businesses from Google Maps\n// Before running — check:\n// https://www.google.com/robots.txt\n// Google Maps ToS: https://cloud.google.com/maps-platform/terms\n\nconst run = await client.actor(\"apify/google-maps-scraper\").call({\n  searchStringsArray: [\"accountants Austin TX\"],\n  maxCrawledPlacesPerSearch: 25,\n  language: \"en\"\n});\n\nconst { items } = await run.dataset().getData();\n\n// Each item contains:\n// { title, address, phone, website, rating, category, email }\n\nGenerate Personalized Outreach with Claude\nimport axios from 'axios';\n\nasync function generateOutreach(lead) {\n  const prompt = `\nWrite a short, personalized cold outreach email for this B2B prospect.\n\nLEAD INFO:\n- Business: ${lead.companyName}\n- Industry: ${lead.industry}\n- Location: ${lead.address}\n- Website: ${lead.website}\n\nRULES:\n- Max 100 words\n- No hype, no pressure\n- One clear, relevant value proposition\n- End with a soft CTA (reply, not \"book a call\")\n- Include [YOUR NAME] and [YOUR COMPANY] placeholders\n- Add a placeholder for a one-click unsubscribe link at the bottom\n\nRespond with subject line and body only.\n`;\n\n  const { data } = await axios.post(\n    'https://api.anthropic.com/v1/messages',\n    {\n      model: \"claude-sonnet-4-20250514\",\n      max_tokens: 300,\n      messages: [{ role: \"user\", content: prompt }]\n    },\n    {\n      headers: {\n        'x-api-key': process.env.CLAUDE_API_KEY,\n        'anthropic-version': '2023-06-01',\n        'Content-Type': 'application/json'\n      }\n    }\n  );\n\n  return data.content[0].text;\n}\n\nFull Pipeline: Discover → Qualify → Outreach → Export\nimport { writeFileSync } from 'fs';\n\nasync function runLeadPipeline(searchTerm, location, maxLeads = 25) {\n  // STEP 1 — Discover\n  const run = await client.actor(\"apify/yellowpages-scraper\").call({\n    searchTerms: [searchTerm],\n    locations: [location],\n    maxResultsPerPage: maxLeads\n  });\n  const { items } = await run.dataset().getData();\n\n  // STEP 2 — Qualify and normalize\n  const leads = items\n    .filter(b => b.businessName && (b.phone || b.website))\n    .map(b => ({\n      companyName:  b.businessName,\n      industry:     b.category || searchTerm,\n      phone:        b.phone || \"\",\n      website:      b.website || \"\",\n      address:      `${b.street || \"\"}, ${b.city || \"\"}, ${b.state || \"\"}`.trim(),\n      source:       \"yellowpages\",\n      collectedAt:  new Date().toISOString(),\n      outreachSent: false\n    }));\n\n  // STEP 3 — Deduplicate by website domain\n  const seen = new Set();\n  const unique = leads.filter(l => {\n    const domain = l.website?.replace(/https?:\\/\\/(www\\.)?/, '').split('/')[0];\n    if (!domain || seen.has(domain)) return false;\n    seen.add(domain);\n    return true;\n  });\n\n  // STEP 4 — Generate outreach for top 5 (keep batches human-reviewable)\n  for (const lead of unique.slice(0, 5)) {\n    lead.suggestedEmail = await generateOutreach(lead);\n    await new Promise(r => setTimeout(r, 500)); // rate limit Claude calls\n  }\n\n  // STEP 5 — Export to CSV\n  const headers = [\"companyName\",\"industry\",\"phone\",\"website\",\"address\",\"source\",\"suggestedEmail\"];\n  const csv = [\n    headers.join(\",\"),\n    ...unique.map(l => headers.map(h => `\"${(l[h] || \"\").replace(/\"/g, '\"\"')}\"`).join(\",\"))\n  ].join(\"\\n\");\n\n  const filename = `leads-${searchTerm.replace(/\\s+/g, '_')}-${Date.now()}.csv`;\n  writeFileSync(filename, csv);\n  console.log(`✅ ${unique.length} leads exported to ${filename}`);\n\n  return unique;\n}\n\n// Example usage\nawait runLeadPipeline(\"IT consulting firms\", \"Chicago, IL\", 25);\n\nNormalized Lead Schema\n{\n  \"companyName\": \"Bright Digital Agency\",\n  \"industry\": \"Marketing & Advertising\",\n  \"phone\": \"+1 (415) 555-0192\",\n  \"website\": \"https://brightdigital.com\",\n  \"address\": \"123 Market St, San Francisco, CA 94105\",\n  \"source\": \"yellowpages\",\n  \"collectedAt\": \"2025-02-25T10:00:00Z\",\n  \"outreachSent\": false,\n  \"gdprBasis\": \"legitimate_interest\",\n  \"optedOut\": false\n}\n\nCompliance Checklist Before Running\n\nBefore executing any lead scraping or outreach campaign, verify:\n\n Reviewed robots.txt of every target website\n Confirmed the target data is publicly listed business information\n Identified your legal basis for processing (legitimate interest / consent)\n Outreach emails include sender identity and physical address\n Outreach emails include a working unsubscribe link\n Suppression list is in place for previous opt-outs\n Data will be deleted when no longer needed\n For EU/UK contacts: legitimate interest assessment completed\nBest Practices\nSmall, targeted batches (25–50 leads) outperform mass scraping every time\nAlways validate emails before sending (use Hunter.io or NeverBounce)\nReview outreach drafts before sending — never auto-send without human review\nLog every contact in your CRM and mark outreach dates\nWarm up new email domains before sending at scale (use tools like Instantly or Lemlist)\nTarget decision makers by title — not just any email at a company\nError Handling\ntry {\n  const run = await client.actor(\"apify/yellowpages-scraper\").call(input);\n  const dataset = await run.dataset().getData();\n  return dataset.items;\n} catch (error) {\n  if (error.statusCode === 401) throw new Error(\"Invalid Apify token — check credentials\");\n  if (error.statusCode === 429) throw new Error(\"Rate limit — reduce batch size\");\n  if (error.statusCode === 404) throw new Error(\"Actor not found — verify actor ID\");\n  throw error;\n}\n\nRequirements\nApify account at https://apify.com\nClaude / OpenClaw API key for outreach generation\nNode.js 18+ with apify-client and axios\nA CRM or spreadsheet tool to manage your lead list (HubSpot, Airtable, CSV)\nAn outreach tool with built-in unsubscribe management (Instantly, Lemlist, Apollo)"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/g4dr/ultimate-lead-scraper-ai-outreach",
    "publisherUrl": "https://clawhub.ai/g4dr/ultimate-lead-scraper-ai-outreach",
    "owner": "g4dr",
    "version": "1.1.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/ultimate-lead-scraper-ai-outreach",
    "downloadUrl": "https://openagent3.xyz/downloads/ultimate-lead-scraper-ai-outreach",
    "agentUrl": "https://openagent3.xyz/skills/ultimate-lead-scraper-ai-outreach/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ultimate-lead-scraper-ai-outreach/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ultimate-lead-scraper-ai-outreach/agent.md"
  }
}