<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kevin Hall</title>
    <description>The latest articles on DEV Community by Kevin Hall (@kevinhall).</description>
    <link>https://dev.to/kevinhall</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F59661%2F59a833eb-f247-4b59-9054-5a9bc068c139.jpeg</url>
      <title>DEV Community: Kevin Hall</title>
      <link>https://dev.to/kevinhall</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kevinhall"/>
    <language>en</language>
    <item>
      <title>Clay alternative in Claude Code: one ICP, companies, leads and jobs</title>
      <dc:creator>Kevin Hall</dc:creator>
      <pubDate>Tue, 03 Nov 2026 14:52:35 +0000</pubDate>
      <link>https://dev.to/kevinhall/clay-alternative-in-claude-code-one-icp-companies-leads-and-jobs-43n2</link>
      <guid>https://dev.to/kevinhall/clay-alternative-in-claude-code-one-icp-companies-leads-and-jobs-43n2</guid>
      <description>&lt;p&gt;Clay is a spreadsheet that calls data providers for you. A marketing team opens it to do one job most weeks: describe the ideal customer, find the companies that fit, add a signal such as a funding round or a hiring spree, find the people inside, get an address that works, and do it again next week without paying twice for the same person.&lt;/p&gt;

&lt;p&gt;That job has a price tag in three parts: the plan, the credits each enrichment burns, and the afternoon it takes to build the table. I wanted the list-building half of it as one call that Claude Code can make from a sentence. This is what I got, with the inputs and the numbers from 3 November 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  In one paragraph
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/full-icp-search" rel="noopener noreferrer"&gt;Full ICP Search&lt;/a&gt; on Apify takes one ideal customer profile and returns the companies that match, the decision makers inside them with an email that reaches them today, and the job postings that carry the signal, in one run and one dataset. A free preview counts everything first, misses are never charged, and a rerun with &lt;code&gt;excludeDatasets&lt;/code&gt; returns only new accounts. It is an MCP tool, so Claude Code fills the filters from a brief.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does a Clay workflow actually do?
&lt;/h2&gt;

&lt;p&gt;Strip the table away and a typical Clay build for outbound is five columns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column in the table&lt;/th&gt;
&lt;th&gt;What it asks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;find companies&lt;/td&gt;
&lt;td&gt;industry, headcount, HQ country, maybe a city&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;add a signal&lt;/td&gt;
&lt;td&gt;last funding round and its date, open roles, a tool named in a posting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;find people&lt;/td&gt;
&lt;td&gt;the titles or levels you sell to, one or two per account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;get an email&lt;/td&gt;
&lt;td&gt;a work address at the current employer, or a personal one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;refresh&lt;/td&gt;
&lt;td&gt;only the accounts that were not in last week's run&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every column is a provider call with its own credit, and the table is the thing you maintain. Here the five columns are five groups of fields in one input, and the run answers them in order: companies, then people, then contacts, then postings.&lt;/p&gt;

&lt;h2&gt;
  
  
  The wiring, once
&lt;/h2&gt;

&lt;p&gt;Pin the Actor in the server URL so an agent loads only this tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;claude mcp add --transport http apify "https://mcp.apify.com?tools=b2bsearch/full-icp-search" --header "Authorization: Bearer &amp;lt;APIFY_TOKEN&amp;gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any other MCP client (Cursor, Claude Desktop, ChatGPT, LangChain, CrewAI, the OpenAI Agents SDK) takes the same server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apify"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.apify.com?tools=b2bsearch/full-icp-search"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer &amp;lt;APIFY_TOKEN&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tool is called &lt;code&gt;b2bsearch--full-icp-search&lt;/code&gt; (double hyphen). Without an agent, the same input goes to one REST endpoint and the rows come back in the response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST "https://api.apify.com/v2/acts/b2bsearch~full-icp-search/run-sync-get-dataset-items?token=&amp;lt;APIFY_TOKEN&amp;gt;" \
  -H "Content-Type: application/json" \
  -d @input.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every example below is the &lt;code&gt;input.json&lt;/code&gt; for that call, or the arguments of the tool call.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I count the profile before paying for a row?
&lt;/h2&gt;

&lt;p&gt;The profile I used all day: US software companies with 51 to 200 people that raised a seed or Series A round since January 2025 and posted an SDR or account executive job in the last month. The people: the sales or marketing leader at each one, with an email that reaches them today.&lt;/p&gt;

&lt;p&gt;Written as the input, with what each field does:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"find"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"companies_and_people"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;// companies first, then people inside them; also "companies" or "people"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"previewOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;// counts only, nothing charged; flip to false to pull rows&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="c1"&gt;// the company half of the profile&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyCountries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;// HQ country, two-letter codes&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"industries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Software Development"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fundingStages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"seed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"series_a"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;// the latest recorded round&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fundedAfter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="c1"&gt;// ...dated on or after this day&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hiringJobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"sdr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales development"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"account executive"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;// posted a job with any of these in the title&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hiringPostedWithin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"month"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="c1"&gt;// week, month or 3months; needs a country next to it&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="c1"&gt;// the people half&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"vp sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"head of sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chief revenue officer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"head of marketing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp marketing"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requireEmail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="c1"&gt;// only people with a work address at the current company or a personal one&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emailType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"any"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="c1"&gt;// "work" = current-company address only, fewer people&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="c1"&gt;// how much to deliver when previewOnly is off&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"peoplePerCompany"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobsPerCompany"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="c1"&gt;// the postings that matched the hiring filter, as rows&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three free rows came back in about ten seconds:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Preview row&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;companies that fit and posted a matching job in the last 30 days&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;job postings behind that hiring filter&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;people matching the titles at companies of that industry, size and country, before the email test&lt;/td&gt;
&lt;td&gt;1,981&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The people count is wide on purpose: it is taken before funding, hiring and the email requirement cut it down, and the note row says so. The company count is the one that sizes the pull.&lt;/p&gt;

&lt;p&gt;I dropped the two hiring fields and previewed again. Same companies, no hiring signal: 171. So the SDR posting is what turns a long list into a short one, and the preview told me that before I paid for anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  What comes back when I pull it?
&lt;/h2&gt;

&lt;p&gt;Same input, &lt;code&gt;previewOnly&lt;/code&gt; off, five companies to start:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"find"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"companies_and_people"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyCountries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"industries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Software Development"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fundingStages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"seed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"series_a"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fundedAfter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hiringJobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"sdr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales development"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"account executive"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hiringPostedWithin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"month"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"vp sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"head of sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chief revenue officer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"head of marketing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp marketing"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requireEmail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emailType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"any"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxCompanies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"peoplePerCompany"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobsPerCompany"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fifteen seconds. One dataset, and &lt;code&gt;_type&lt;/code&gt; on every row says what it is:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;code&gt;_type&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Rows&lt;/th&gt;
&lt;th&gt;Charged&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;company&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;yes, per company&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;person&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;yes, per lead with a live email&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;job&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;yes, per posting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;note: companies read but nobody matched with an email&lt;/td&gt;
&lt;td&gt;1 row, 4 companies&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The company rows, without names:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Round dated&lt;/th&gt;
&lt;th&gt;Open jobs&lt;/th&gt;
&lt;th&gt;Matching postings&lt;/th&gt;
&lt;th&gt;Leaders delivered&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;76&lt;/td&gt;
&lt;td&gt;Series A&lt;/td&gt;
&lt;td&gt;Nov 2025&lt;/td&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;86&lt;/td&gt;
&lt;td&gt;Series A&lt;/td&gt;
&lt;td&gt;Jul 2025&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;td&gt;Series A&lt;/td&gt;
&lt;td&gt;Mar 2025&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;Series A&lt;/td&gt;
&lt;td&gt;Jul 2025&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;119&lt;/td&gt;
&lt;td&gt;Series A&lt;/td&gt;
&lt;td&gt;Jun 2025&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The people rows: a head of sales, a head of marketing, a VP of sales, another head of sales, a chief revenue officer and a head of marketing, every one with a work address at the company in the row above. The job rows carry the title, the posting URL, when it was posted, the location and the applicant band, so the opener can name the role they are hiring for.&lt;/p&gt;

&lt;p&gt;What each row holds, the fields you will actually read:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Row&lt;/th&gt;
&lt;th&gt;Fields&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;company&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;companyName&lt;/code&gt;, &lt;code&gt;companyDomain&lt;/code&gt;, &lt;code&gt;companyWebsite&lt;/code&gt;, &lt;code&gt;companyLinkedinUrl&lt;/code&gt;, &lt;code&gt;companyIndustry&lt;/code&gt;, &lt;code&gt;companySize&lt;/code&gt;, &lt;code&gt;companyCountry&lt;/code&gt;, &lt;code&gt;companyCity&lt;/code&gt;, &lt;code&gt;companyFounded&lt;/code&gt;, &lt;code&gt;companyDescription&lt;/code&gt;, &lt;code&gt;fundingStage&lt;/code&gt;, &lt;code&gt;lastFundingDate&lt;/code&gt;, &lt;code&gt;lastFundingAmountUsd&lt;/code&gt;, &lt;code&gt;openJobs&lt;/code&gt;, &lt;code&gt;jobsLast30Days&lt;/code&gt;, &lt;code&gt;matchingJobs&lt;/code&gt;, &lt;code&gt;matchingJobTitles&lt;/code&gt;, &lt;code&gt;topJobTitles30d&lt;/code&gt;, &lt;code&gt;peopleFound&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;person&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;fullName&lt;/code&gt;, &lt;code&gt;firstName&lt;/code&gt;, &lt;code&gt;lastName&lt;/code&gt;, &lt;code&gt;jobTitle&lt;/code&gt;, &lt;code&gt;seniority&lt;/code&gt;, &lt;code&gt;headline&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;emailType&lt;/code&gt;, &lt;code&gt;workEmail&lt;/code&gt;, &lt;code&gt;personalEmail&lt;/code&gt;, &lt;code&gt;linkedinUrl&lt;/code&gt;, &lt;code&gt;location&lt;/code&gt;, &lt;code&gt;countryCode&lt;/code&gt;, &lt;code&gt;phoneOnRecord&lt;/code&gt;, plus the employer's company columns and &lt;code&gt;companyId&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;job&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;jobTitle&lt;/code&gt;, &lt;code&gt;jobUrl&lt;/code&gt;, &lt;code&gt;jobPostedAt&lt;/code&gt;, &lt;code&gt;jobLocation&lt;/code&gt;, &lt;code&gt;jobCountry&lt;/code&gt;, &lt;code&gt;jobSeniority&lt;/code&gt;, &lt;code&gt;employmentType&lt;/code&gt;, &lt;code&gt;applicantRange&lt;/code&gt;, &lt;code&gt;companyName&lt;/code&gt;, &lt;code&gt;jobsDataAsOf&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Company, person and job rows share &lt;code&gt;companyId&lt;/code&gt;, so they join in a spreadsheet, and the dataset has a view called "Emails for outreach tools" with the columns a sequencer imports.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I get only the new accounts next week?
&lt;/h2&gt;

&lt;p&gt;Add the dataset id of the first run to &lt;code&gt;excludeDatasets&lt;/code&gt; and run the same profile again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"the same profile as above"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxCompanies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"excludeDatasets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;dataset id of last week's run&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ten seconds:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;Companies&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;already in last week's dataset, skipped free&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;read, nobody matching with an email, skipped free&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;new, delivered with a leader and their postings&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That is the "only new rows" column of the table, as one field. On a schedule it is a weekly feed of funded companies that started hiring sellers, with the person to write to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can I start from the people instead of the companies?
&lt;/h2&gt;

&lt;p&gt;Yes. &lt;code&gt;find: "people"&lt;/code&gt; searches people directly, with the company fields applied to their current employer. The profile I tried: revenue operations and sales operations leaders in the UK at companies of 51 to 500, who started the current job after July 2025, because a new operations leader is the one reviewing the stack.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"find"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"people"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"personCountries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"gb"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"revenue operations"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"revops"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales operations"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"seniority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"director"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cxo"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"startedCurrentRoleAfter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-07-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requireEmail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxPeople"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The preview counted 51 before the email test. The pull delivered 8 in six seconds and skipped 6 for having no address on record, free. Of the eight, three came with a work address and five with a personal one, which is normal for people in a new seat: the new company's address is not on record yet. Two things the row does not carry in this mode: &lt;code&gt;seniority&lt;/code&gt; is blank, because the people search matches on the title rather than a roster level, and the start date that the filter used is not printed. The filter does the work; the row shows the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  I already have an account list. Does it take domains?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;companyDomains&lt;/code&gt; turns the same input into an account-based pull: each domain is one company, the one that owns the website. I gave it six sales-technology vendors and asked for one marketing leader at C-level or VP with an email:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"find"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"companies_and_people"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyDomains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"gong.io"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"clari.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"outreach.io"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"salesloft.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lusha.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cognism.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"seniority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"cxo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"marketing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"demand"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"growth"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requireEmail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"peoplePerCompany"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eight seconds. Three companies came back with a chief marketing officer or a VP of product marketing and a work address. Three were read and skipped free because nobody at those levels with those words in the title had an address on record. Two more people were skipped free with a separate note: the record named a company they had already left. Nothing was guessed and nothing dead was sold.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about the list I already have in a CSV?
&lt;/h2&gt;

&lt;p&gt;That is the other half of a Clay table: the rows exist, the columns are empty. Its twin in the same family is &lt;a href="https://apify.com/b2bsearch/waterfall-lead-enrichment" rel="noopener noreferrer"&gt;Waterfall Lead Enrichment&lt;/a&gt;. It reads whatever columns the file has and resolves each row by the strongest key it carries: email, then profile URL, then a social handle, then full name plus company website, and a row with only a website is treated as a company.&lt;/p&gt;

&lt;p&gt;I built a six-row file from the people above, deliberately messy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"csv"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"email,full_name,company_website&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;jane@acme.example,,&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;,,&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;,Jane Doe,acme.example&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;,,&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;,,gong.io&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;,,clari.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="c1"&gt;// two rows with only an address, two with only a name and a website, two with only a company website&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contacts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;// add the addresses and phones that reach the person today&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;// a 2 KB row per person instead of 10 KB, same price; made for agents&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Paste a real file or a link to one; the inline string is the same thing.) Seven seconds, six rows, all found:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key the row had&lt;/th&gt;
&lt;th&gt;What came back&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;an email address, two rows&lt;/td&gt;
&lt;td&gt;the person's profile, at the profile tier: the only address on record was the one I had sent, so there was no new contact to charge for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a name and a company website, two rows&lt;/td&gt;
&lt;td&gt;the person with contacts: one of them with five addresses on record, work and personal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a company website, two rows&lt;/td&gt;
&lt;td&gt;the company card: headcount band, industry, HQ country, founding year, last round and its date&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Misses in that Actor are free rows that say why: &lt;code&gt;not_found&lt;/code&gt;, &lt;code&gt;ambiguous&lt;/code&gt; when a name is shared or a website is claimed by unrelated pages, &lt;code&gt;invalid&lt;/code&gt;, &lt;code&gt;duplicate&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What did the agent do on its own?
&lt;/h2&gt;

&lt;p&gt;I gave a Claude Code session the Actor pinned and the brief a marketing lead would write: we sell sales coaching, the ideal customer is a US software company of 51 to 200 people that raised seed or Series A since January 2025 and is hiring SDRs or account executives, I want the sales or marketing leader with an email and the posting that proves it.&lt;/p&gt;

&lt;p&gt;The rules in the brief: preview first, tighten above 30 companies, loosen under 5, then one paid pull of 5 companies with a spend cap, and report without names. Shell and file tools were denied; it had a short saved note of mine about these Actors.&lt;/p&gt;

&lt;p&gt;Nine turns, about two minutes, two Actor runs. What it did without being told:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wrote the people half as words plus levels, &lt;code&gt;jobTitles&lt;/code&gt; sales, marketing, revenue, cmo, cro with &lt;code&gt;seniority&lt;/code&gt; cxo, vp, director, instead of my five exact titles. Same 23 companies in the preview; the people count before the email test went from 1,981 to 11,002, which is the gap between a title list and a word list&lt;/li&gt;
&lt;li&gt;kept the profile as it was, because 23 sat inside the window the brief allowed&lt;/li&gt;
&lt;li&gt;passed the spend cap in the call options, then wrote in its report that the field is not in the Actor's schema and it could not confirm the cap had applied. True on both counts&lt;/li&gt;
&lt;li&gt;read the rows with a &lt;code&gt;fields&lt;/code&gt; list of 25 columns, left out the names and addresses it was told not to print, and read the dataset a second time when the run record showed 16 rows where the first read had shown 6&lt;/li&gt;
&lt;li&gt;noticed what I had not: all five companies in California or New York, all Series A and no seed, five sales leaders and no marketing one, two work addresses and three personal, one person with a mobile on record&lt;/li&gt;
&lt;li&gt;flagged that the postings were dated 17 to 21 October against a jobs snapshot of 21 October, so "last month" counts from the snapshot and not from today&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Its verdict: the rows are good, the profile is too narrow for a hundred-company pull, so widen it with a three-month hiring window, two more industries or a 2024 funding date, preview again and aim for 120 to 150 companies to leave room for the ones where nobody matches. That is the afternoon in the table, done in two minutes, with a number in front of every decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not do
&lt;/h2&gt;

&lt;p&gt;It is not a table. Clay also writes AI columns, syncs to a CRM and chains dozens of providers; this is the list-building and enrichment part, priced per row and callable from an agent.&lt;/p&gt;

&lt;p&gt;Addresses are on record, not verified at run time, and never guessed from a name pattern. Run your verifier before a big send.&lt;/p&gt;

&lt;p&gt;Job postings follow the jobs data's own date, printed on every job row as &lt;code&gt;jobsDataAsOf&lt;/code&gt;, which can sit a few days behind today. Funding is the latest recorded round: &lt;code&gt;seed&lt;/code&gt; means the company has not raised past seed on record, and records of large, older companies are often stale, so pair an early stage with a size cap.&lt;/p&gt;

&lt;p&gt;Mobile numbers, with &lt;code&gt;includePhones&lt;/code&gt;, are US-centric. And the free Apify plan caps a run at a hundred rows from the Console and twenty-five through the API, and an account at five hundred rows a month on this Actor; previews stay outside the cap, and any paid plan lifts it.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is this Clay?&lt;/strong&gt; No. It is an independent Actor on Apify that covers the list-building and enrichment steps of a Clay workflow. It is not affiliated with Clay.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need Claude Code?&lt;/strong&gt; No. The input is JSON, so the form on the Actor page, a schedule, n8n, Make, Zapier or a curl call all work. Claude Code makes it fast to describe a profile in words and compare two segments by their free counts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where do the emails come from?&lt;/strong&gt; From the contact block of the person's record: a work address at the current employer, or a personal one. Addresses at earlier employers never count, and people without one are skipped free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I keep an agent from overspending?&lt;/strong&gt; Run &lt;code&gt;previewOnly&lt;/code&gt; first, cap with &lt;code&gt;maxCompanies&lt;/code&gt; and &lt;code&gt;maxPeople&lt;/code&gt;, set &lt;code&gt;maxTotalChargeUsd&lt;/code&gt; on the run, and pass last week's dataset in &lt;code&gt;excludeDatasets&lt;/code&gt; so nobody is bought twice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the fastest way to try it?&lt;/strong&gt; The Actor page has ready-made examples that open with the input filled in: funded startups hiring their first sales reps, and recently funded US startups with the founders' emails. Press Try for free and change the filters.&lt;/p&gt;

&lt;h2&gt;
  
  
  For AI agents reading this
&lt;/h2&gt;

&lt;p&gt;The Actor runs as the tool &lt;code&gt;b2bsearch--full-icp-search&lt;/code&gt; on the hosted Apify MCP server with the tool pinned in the URL (the wiring block above). The workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;call with &lt;code&gt;previewOnly: true&lt;/code&gt; to size the profile; the free rows have &lt;code&gt;_status: "preview"&lt;/code&gt; and &lt;code&gt;_type&lt;/code&gt; &lt;code&gt;company&lt;/code&gt;, &lt;code&gt;person&lt;/code&gt; or &lt;code&gt;job&lt;/code&gt; with &lt;code&gt;_total&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;tune the company half (&lt;code&gt;companyCountries&lt;/code&gt;, &lt;code&gt;industries&lt;/code&gt;, &lt;code&gt;companySizeMin&lt;/code&gt;, &lt;code&gt;companySizeMax&lt;/code&gt;, &lt;code&gt;fundingStages&lt;/code&gt;, &lt;code&gt;fundedAfter&lt;/code&gt;, &lt;code&gt;hiringJobTitles&lt;/code&gt;, &lt;code&gt;hiringPostedWithin&lt;/code&gt;, &lt;code&gt;companyDomains&lt;/code&gt;) and the people half (&lt;code&gt;seniority&lt;/code&gt;, &lt;code&gt;jobTitles&lt;/code&gt;, &lt;code&gt;excludeJobTitles&lt;/code&gt;, &lt;code&gt;keywords&lt;/code&gt;, &lt;code&gt;startedCurrentRoleAfter&lt;/code&gt;, &lt;code&gt;pastCompanyDomains&lt;/code&gt;, &lt;code&gt;requireEmail&lt;/code&gt;, &lt;code&gt;emailType&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;pull with &lt;code&gt;maxCompanies&lt;/code&gt;, &lt;code&gt;peoplePerCompany&lt;/code&gt;, &lt;code&gt;jobsPerCompany&lt;/code&gt; or &lt;code&gt;maxPeople&lt;/code&gt;, and &lt;code&gt;callOptions.maxTotalChargeUsd&lt;/code&gt; set&lt;/li&gt;
&lt;li&gt;read rows with &lt;code&gt;get-dataset-items&lt;/code&gt; and a &lt;code&gt;fields&lt;/code&gt; list; filter on &lt;code&gt;_type&lt;/code&gt;; rows with a &lt;code&gt;_status&lt;/code&gt; other than &lt;code&gt;found&lt;/code&gt; are free notes that say why&lt;/li&gt;
&lt;li&gt;rerun with &lt;code&gt;excludeDatasets&lt;/code&gt; for new rows only&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a file you already hold, &lt;code&gt;b2bsearch--waterfall-lead-enrichment&lt;/code&gt; with &lt;code&gt;csv&lt;/code&gt;, &lt;code&gt;contacts&lt;/code&gt; and &lt;code&gt;compact: true&lt;/code&gt;. Platform docs: &lt;a href="https://docs.apify.com/mcp" rel="noopener noreferrer"&gt;Apify MCP server&lt;/a&gt; and &lt;a href="https://apify.com/agents.md" rel="noopener noreferrer"&gt;apify.com/agents.md&lt;/a&gt;. Per-plan pricing is on each Actor page.&lt;/p&gt;

&lt;p&gt;Related posts in this series: &lt;a href="https://dev.to/kevinhall/apollo-alternative-in-claude-code-7-lead-lists-from-one-apify-actor-2a8f"&gt;Apollo alternative in Claude Code: 7 lead lists from one Apify Actor&lt;/a&gt;, &lt;a href="https://dev.to/kevinhall/b2b-data-api-for-ai-agents-7-apify-actors-one-database-no-scraping-2an"&gt;B2B data API for AI agents: 7 Apify Actors&lt;/a&gt; and &lt;a href="https://dev.to/kevinhall/243-of-417-leads-in-a-typical-icp-box-were-dead-before-the-first-email-epo"&gt;243 of 417 leads in a typical ICP box were dead before the first email&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>leadgeneration</category>
      <category>sales</category>
      <category>claudecode</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Champion tracking in Claude Code: who in my CRM changed jobs</title>
      <dc:creator>Kevin Hall</dc:creator>
      <pubDate>Tue, 03 Nov 2026 14:12:50 +0000</pubDate>
      <link>https://dev.to/kevinhall/champion-tracking-in-claude-code-who-in-my-crm-changed-jobs-132o</link>
      <guid>https://dev.to/kevinhall/champion-tracking-in-claude-code-who-in-my-crm-changed-jobs-132o</guid>
      <description>&lt;p&gt;Every CRM goes stale the same way. The record says she runs sales ops at Acme. She left last spring. The sequence still writes to her old address, and her new company, where she already knows your product, never hears from anyone.&lt;/p&gt;

&lt;p&gt;Champion tracking tools sell the fix as a subscription that watches your contacts. Most of the value is in a one-off check: the profile URLs you already have, one Apify Actor and a comparison that does not lie to you. The comparison is the part people get wrong, so most of this post is about it.&lt;/p&gt;

&lt;p&gt;I tested it on a list where I already knew the answer. Eighty people from four sales-software companies, the kind of accounts a vendor keeps in its CRM. Half were still listed at the company and half had left it since 2024, half and half on purpose, so nothing below says how fast a real CRM decays. A list with a known answer lets you check the check before you trust it on the real thing. Rows below show roles and dates only, no names and no addresses.&lt;/p&gt;

&lt;p&gt;In one paragraph: export the profile URL and the company domain from the CRM, run &lt;a href="https://apify.com/b2bsearch/profile-lookup" rel="noopener noreferrer"&gt;Profile Lookup&lt;/a&gt; on the URLs, turn the domains into company records with &lt;a href="https://apify.com/b2bsearch/domain-to-company" rel="noopener noreferrer"&gt;Domain to Company&lt;/a&gt;, and call someone moved only when none of their open positions is at that company. Then get the movers' new work address and find out who took the seat they left.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Who still works where the CRM says
&lt;/h2&gt;

&lt;p&gt;The input is the list. Full links, bare handles and mobile links all work.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"profileUrls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://www.linkedin.com/in/jane-doe-example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"john-roe-example"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contacts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eighty profiles came back in seconds. Each row is the whole career record, and the part that matters here is &lt;code&gt;experience.work&lt;/code&gt;: every position with a start date and an end date. An open position has no end date.&lt;/p&gt;

&lt;p&gt;Your CRM stores the company as a name and maybe a domain. A name is a bad key (Acme, Acme Inc, Acme Software), so resolve the domain first. Domain to Company takes &lt;code&gt;{"domains": [...]}&lt;/code&gt;, and the &lt;code&gt;linkedinUrl&lt;/code&gt; on its row ends with the company slug. The same slug sits in &lt;code&gt;companyId.publicId&lt;/code&gt; on every position of the profile. After that the check is a few lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;verdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;crm_slug&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;_status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;_status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;            &lt;span class="c1"&gt;# not_found, profile_removed: free rows
&lt;/span&gt;    &lt;span class="n"&gt;open_jobs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;experience&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;work&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;endDate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;open_jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no_open_job&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;slugs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;companyId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;publicId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;open_jobs&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;still_there&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;crm_slug&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;slugs&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;moved&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;crm_slug&lt;/code&gt; is &lt;code&gt;row["linkedinUrl"].rstrip("/").split("/")[-1]&lt;/code&gt; from the Domain to Company row.&lt;/p&gt;

&lt;p&gt;On my test list it got every leaver right, except one person whose profile had been removed. That comes back as a free row and is a contact to archive anyway. On the half that was supposed to still be there it found two people with no open job at all: their position at the company had ended in spring 2025. The roster I built the test list from was behind their profiles. Which is the whole reason to check the profile and not a list of employees.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trap: companyName is not the employer
&lt;/h2&gt;

&lt;p&gt;Every row also has a &lt;code&gt;companyName&lt;/code&gt; column, and it is tempting to compare that with the CRM. Don't. It holds the first open position on the profile, and people keep plenty of open positions that are not their job: a board seat, "Member" of a sales community, an advisor title, their own consulting shop, a founder title on a meetup they started years ago.&lt;/p&gt;

&lt;p&gt;On my list about a quarter of the people who never left would have been marked as moved by that one column. A real row, names replaced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A sales community"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"experience"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"work"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"company"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A sales community"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"companyId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"publicId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"a-sales-community"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Member"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"startDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-12-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"endDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"company"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Acme"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"companyId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"publicId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"acme"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Senior Director, Account Development"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"startDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2022-05-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"endDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It goes the other way too. Some people never close the old job when they start a new one, so the profile shows the CRM company and a newer company, both open. My check calls that "still there". Look at the start dates and the headline: if the newest open job is somewhere else and the headline names it, they moved.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. They moved: a warm account and a new address
&lt;/h2&gt;

&lt;p&gt;The new company is the interesting part. Someone there already used your product and liked it enough to be your contact. That is the warmest cold account you will ever get.&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;contacts: true&lt;/code&gt; the row also says what is on record for reaching them. About a third of my movers had an address at the new company (&lt;code&gt;employerMatch: true&lt;/code&gt;), most of the rest only a personal one, and the others an old work address or nothing. For the ones without a work address, &lt;a href="https://apify.com/b2bsearch/work-email-finder" rel="noopener noreferrer"&gt;Work Email Finder&lt;/a&gt; takes the name and the new company's domain.&lt;/p&gt;

&lt;p&gt;The uncomfortable bit: for almost half of the movers the address at the old company was still on record. That is the address sitting in your CRM, the one the sequence keeps sending to. Fix those before the next campaign, not after the bounce report.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The CRM only has emails
&lt;/h2&gt;

&lt;p&gt;Plenty of CRMs never stored a profile URL. &lt;a href="https://apify.com/b2bsearch/reverse-email-lookup" rel="noopener noreferrer"&gt;Reverse Email Lookup&lt;/a&gt; starts from the address you have, including an old work address that would bounce today:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"emails"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"jane.doe@acme.example"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I gave it the old company addresses of the movers. All but one came back as the same person, with the new job on the row. The one that didn't was a different person with the same first name. Compare the name on the row with the name in the CRM before acting on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The account lost its champion
&lt;/h2&gt;

&lt;p&gt;The old account matters too. Your contact left, someone else sits in that seat now, and they have never heard of you. &lt;a href="https://apify.com/b2bsearch/company-employees" rel="noopener noreferrer"&gt;Company Employees&lt;/a&gt; on the account's domain with a word from the old title:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"acme.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"titleContains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"revenue operations"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"director"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxRows"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each row has &lt;code&gt;positionStartYear&lt;/code&gt;. A revenue operations director left one of my accounts in 2024, and the roster showed a couple of revenue operations leaders who started in 2025. That is who to write to. A VP of inside sales left another account, and nobody holds that title there now, only a manager. The seat was folded or renamed, which is good to know before you write "congrats on the new role".&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The same check from Claude Code
&lt;/h2&gt;

&lt;p&gt;Every Actor here is also an MCP tool. I pinned only the one I needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http apify &lt;span class="s2"&gt;"https://mcp.apify.com?tools=b2bsearch/profile-lookup"&lt;/span&gt; &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &amp;lt;APIFY_TOKEN&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then a Claude Code session with that one tool, shell and file tools switched off, and twenty rows of the test list as CSV: profile URL, company, domain. The prompt without the CSV:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;This is an export from our CRM: contacts we sold to or talked to in 2024, with the company we have on file for each.

Before we start sequences again I need to know who still works at the company on file and who moved, and for the ones who moved, where they work now. Use only the Apify MCP tools you have. One paid pass over the list is fine, do not run the same lookup twice. Give me a short table: contact number, still there / moved / unclear, current company, and anything I should double-check by hand.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It ran one lookup over the twenty, read the dataset twice and answered in under two minutes. All ten leavers came back as moved, with the new company and, for most, the month they started there. It did not fall for &lt;code&gt;companyName&lt;/code&gt;: it pointed out on its own that the board seat, the community and the advisor title were not the employer. It caught the person with two open jobs and marked them "probably moved", because the headline named the new company. And it flagged two contacts whose job at the company on file had ended before 2024 or right at its start. In a real CRM that means the record was probably wrong the day it was entered.&lt;/p&gt;

&lt;p&gt;Three people it left as unclear, and the reason is worth knowing. It asked for compact rows, and a compact row carries a shortened list of positions, so for those three the job at the CRM company was not in it. It said so and asked before paying for a second pass, as the prompt told it to. Next time "use full rows, not compact" goes into the prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things that bit me
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dates.&lt;/strong&gt; Every row has &lt;code&gt;updatedAt&lt;/code&gt;, the day the record was last refreshed, and on my list most were from this spring. A move after that date does not show up. Compare it with the day the contact entered your CRM: old CRM rows are where this check pays off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A cost cap on the call.&lt;/strong&gt; My first API run stopped partway with "stopped at your maximum charge limit" in the status line. The call had a default cap below what the list needed. Set &lt;code&gt;maxTotalChargeUsd&lt;/code&gt; yourself or split the list. Nothing past the cap is charged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A domain that matches two companies.&lt;/strong&gt; One domain I tried came back &lt;code&gt;ambiguous&lt;/code&gt; from Domain to Company. Pick the company by hand, or keep the slug in the CRM next to the domain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two open jobs.&lt;/strong&gt; Covered above, and it happens more than you would think. The start dates decide.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The recipe
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Export profile URL (or email), company and company domain from the CRM.&lt;/li&gt;
&lt;li&gt;Domain to Company on the domains, keep the slug.&lt;/li&gt;
&lt;li&gt;Profile Lookup on the URLs with &lt;code&gt;contacts: true&lt;/code&gt; and full rows. Reverse Email Lookup if the address is all you have.&lt;/li&gt;
&lt;li&gt;Moved means no open position at the CRM company's slug. Not a different &lt;code&gt;companyName&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For movers: update the record, add the new work address, open the new company as an account.&lt;/li&gt;
&lt;li&gt;For the old accounts: Company Employees with the old title, newest &lt;code&gt;positionStartYear&lt;/code&gt; first.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Run it before a big campaign, on contacts older than the dates on the rows.&lt;/p&gt;

&lt;p&gt;If you want the people who left a customer as a list, rather than checking the CRM you have, &lt;a href="https://apify.com/b2bsearch/former-employees-finder" rel="noopener noreferrer"&gt;Former Employees Finder&lt;/a&gt; does it from the domain, and the &lt;a href="https://dev.to/kevinhall/the-warmest-cold-list-1803-people-who-left-hubspot-since-2025-23lp"&gt;alumni post&lt;/a&gt; shows how. The address side for a list of profile URLs is in the &lt;a href="https://dev.to/kevinhall/bulk-email-finder-in-claude-code-200-profile-urls-64-still-current-n93"&gt;bulk email finder post&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is this a job-change tracker?&lt;/strong&gt; No. It checks a list against the profiles as they are on record. Run it again in a few months and you get whatever changed on those records since.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I pay for misses?&lt;/strong&gt; No. A URL that matches nobody comes back as a free &lt;code&gt;not_found&lt;/code&gt; row, a removed profile as a free &lt;code&gt;profile_removed&lt;/code&gt; row.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it need my login or a browser extension?&lt;/strong&gt; No. The answers come from a database, so there are no cookies, sessions or proxies on your side.&lt;/p&gt;

&lt;p&gt;If your CRM keeps something I did not cover here, a title history or a deal stage, tell me in the comments and I will try the check on it.&lt;/p&gt;

</description>
      <category>leadgeneration</category>
      <category>sales</category>
      <category>crm</category>
      <category>ai</category>
    </item>
    <item>
      <title>30 ready-made B2B data tasks on Apify, from lead lists to call lists</title>
      <dc:creator>Kevin Hall</dc:creator>
      <pubDate>Sat, 31 Oct 2026 05:55:46 +0000</pubDate>
      <link>https://dev.to/kevinhall/30-ready-made-b2b-data-tasks-on-apify-from-lead-lists-to-call-lists-4e21</link>
      <guid>https://dev.to/kevinhall/30-ready-made-b2b-data-tasks-on-apify-from-lead-lists-to-call-lists-4e21</guid>
      <description>&lt;p&gt;Every B2B data Actor I use on Apify has thirty or forty input fields. That is great for an agent and terrible for a person who opens the page for the first time and just wants a list of HR directors in Ohio&lt;/p&gt;

&lt;p&gt;So I saved the combinations people actually ask for as ready-made tasks. A task page shows the input already filled in, the columns you will get and a Try for free button. The button copies the task into your Apify account, you change a field or two and press start&lt;/p&gt;

&lt;p&gt;Below are thirty of those jobs, grouped by the problem you walk in with. For each one: the link, the input, what comes back and what to run next. The counts were taken with free previews on 31 October 2026&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use a task
&lt;/h2&gt;

&lt;p&gt;Open the link, press Try for free, change what you need, press Start. The input on the page is plain JSON, so the same object works from the API, from Make or n8n, and from an agent over MCP.&lt;/p&gt;

&lt;p&gt;Two habits save most of the budget. Count first wherever the Actor has a free count or preview. And cap the run with &lt;code&gt;maxResults&lt;/code&gt; or &lt;code&gt;maxRows&lt;/code&gt; until you like what comes back.&lt;/p&gt;

&lt;h2&gt;
  
  
  You have an ICP and no list
&lt;/h2&gt;

&lt;p&gt;This is where &lt;a href="https://apify.com/b2bsearch/b2b-leads-finder" rel="noopener noreferrer"&gt;B2B Leads Finder&lt;/a&gt; lives. You describe the people, it returns one row per person, and every row has a live email.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Sales leaders at mid-size US companies.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/b2b-leads-finder/examples/us-sales-leaders-with-emails" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"vp sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"head of sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chief revenue officer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"emailType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"any"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each row brings &lt;code&gt;fullName&lt;/code&gt;, &lt;code&gt;jobTitle&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt; with &lt;code&gt;emailType&lt;/code&gt; set to &lt;code&gt;work&lt;/code&gt; or &lt;code&gt;personal&lt;/code&gt;, the company name, domain, size and industry, location and the profile link. &lt;code&gt;phoneOnRecord&lt;/code&gt; tells you for free whether a mobile number exists. People with no live email are skipped and counted in a note row, not charged.&lt;/p&gt;

&lt;p&gt;Two fields worth knowing here. &lt;code&gt;maxPerCompany&lt;/code&gt; stops one big employer from eating the list. &lt;code&gt;excludeDatasets&lt;/code&gt; takes the dataset of last week's run and leaves those people out, so a weekly rerun only brings new names.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Small business owners.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/b2b-leads-finder/examples/small-business-owners-us-with-emails" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt;. The trick is in one field: "owner" also matches product owners and process owners, so the task excludes them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"founder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ceo"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"excludeJobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"product owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"process owner"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"emailType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"any"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Managing directors in Germany.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/b2b-leads-finder/examples/geschaeftsfuehrer-germany-with-emails" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt;. Local markets write titles in the local language, so search in it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"geschäftsführer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"inhaber"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"managing director"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ceo"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"de"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"emailType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"any"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. HR and talent leaders, or procurement managers.&lt;/strong&gt; Same Actor, different titles. The &lt;a href="https://apify.com/b2bsearch/b2b-leads-finder/examples/hr-and-talent-leaders-with-work-emails" rel="noopener noreferrer"&gt;HR task&lt;/a&gt; asks for work addresses only with &lt;code&gt;"emailType": "work"&lt;/code&gt;, which is what you want when you sell to a company and not to a person. The &lt;a href="https://apify.com/b2bsearch/b2b-leads-finder/examples/procurement-managers-manufacturing-with-emails" rel="noopener noreferrer"&gt;procurement task&lt;/a&gt; adds &lt;code&gt;"industries": ["Manufacturing"]&lt;/code&gt; and a seniority floor so buyers come without interns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. You already built the search in Apollo.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/b2b-leads-finder/examples/apollo-search-url-to-leads" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt;. Paste the people-search URL into &lt;code&gt;apolloUrl&lt;/code&gt; and the Actor reads the filters out of it. No Apollo login and no credits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. You need people you can call, not just email.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/b2b-leads-with-phones" rel="noopener noreferrer"&gt;Leads with Phones&lt;/a&gt; takes the same filters and only returns people who have both a verified mobile and a live email. &lt;a href="https://apify.com/b2bsearch/b2b-leads-with-phones/examples/us-sales-leaders-mobile-numbers" rel="noopener noreferrer"&gt;Sales leaders with mobiles&lt;/a&gt; and &lt;a href="https://apify.com/b2bsearch/b2b-leads-with-phones/examples/real-estate-agents-mobile-numbers" rel="noopener noreferrer"&gt;real estate agents and brokers&lt;/a&gt; are ready to run.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"realtor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"real estate agent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"real estate broker"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"broker associate"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"industries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Real Estate"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rows carry &lt;code&gt;phone&lt;/code&gt; in E.164, every number in &lt;code&gt;phones&lt;/code&gt;, the email and the company. A &lt;code&gt;skipped_no_contact&lt;/code&gt; note row says how many matching people had no mobile or no email. Those cost nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Count before you pay for a single row
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/people-database-search" rel="noopener noreferrer"&gt;People Search&lt;/a&gt; has a &lt;code&gt;count&lt;/code&gt; mode and a &lt;code&gt;market&lt;/code&gt; mode. Neither charges per row, and they answer the question you should ask before any list: how big is this, really.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. How many software engineers per country.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/people-database-search/examples/software-engineers-by-country-free-count" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"titleKeywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"software engineer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"software developer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"segments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"United Kingdom"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"gb"&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Germany"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"de"&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Canada"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ca"&lt;/span&gt;&lt;span class="p"&gt;]}]}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One row per segment with &lt;code&gt;_total&lt;/code&gt;. Today the UK came back with about 186 thousand, Canada 166 thousand and Germany 116 thousand. The US and India stop at the count ceiling of a million, which tells you to narrow before you pull.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Compare sales team size across companies.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/people-database-search/examples/sales-team-size-by-company-free-count" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt;. Each segment is a company domain, the titles are account executives, SDRs and sales managers. Handy for sizing a territory or for a competitor slide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Count a Sales Navigator search before exporting it.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/sales-navigator-search/examples/count-sales-navigator-search-free" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt;. Paste the search URL, get the count, then run the &lt;a href="https://apify.com/b2bsearch/sales-navigator-search/examples/head-of-growth-us-export" rel="noopener noreferrer"&gt;export task&lt;/a&gt; with the same URL. The sample search for US heads of growth counted 1,278 people. No seat and no cookies.&lt;/p&gt;

&lt;p&gt;Then switch &lt;code&gt;mode&lt;/code&gt; to &lt;code&gt;people&lt;/code&gt; and you get rows. Two filters people rarely find on their own: &lt;code&gt;onlyBetweenJobs&lt;/code&gt; for &lt;a href="https://apify.com/b2bsearch/people-database-search/examples/professionals-between-jobs" rel="noopener noreferrer"&gt;people with no current position&lt;/a&gt;, and &lt;code&gt;careerStartYearMin&lt;/code&gt; for &lt;a href="https://apify.com/b2bsearch/people-database-search/examples/early-career-software-engineers" rel="noopener noreferrer"&gt;engineers early in their career&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  You hold profile URLs or emails
&lt;/h2&gt;

&lt;p&gt;The two most used Actors in the family live here. The tasks use placeholder inputs, so replace them with your own list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Profile URLs to mobile numbers.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/linkedin-to-phone/examples/linkedin-urls-to-mobile-numbers" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt; on &lt;a href="https://apify.com/b2bsearch/linkedin-to-phone" rel="noopener noreferrer"&gt;Phone Number Finder&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"profileUrls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"https://www.linkedin.com/in/jane-doe-example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jane.example@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jane Example, example.com"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The field takes profile links, email addresses and "Name, domain" lines in one list, mixed freely. A found row has &lt;code&gt;primaryPhone&lt;/code&gt;, all numbers in &lt;code&gt;phones&lt;/code&gt;, &lt;code&gt;phoneCount&lt;/code&gt;, the name, title, company and location. &lt;code&gt;no_phone&lt;/code&gt;, &lt;code&gt;not_found&lt;/code&gt; and &lt;code&gt;profile_removed&lt;/code&gt; are free rows that tell you why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;11. CRM contacts with an email and no number.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/linkedin-to-phone/examples/crm-emails-to-mobile-numbers" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt;. Same Actor, the list is just emails. Export the column from the CRM and paste it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12. Profile URLs to work emails.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/linkedin-email-finder/examples/linkedin-urls-to-work-emails" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt; on &lt;a href="https://apify.com/b2bsearch/linkedin-email-finder" rel="noopener noreferrer"&gt;Email Finder&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"profileUrls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"https://www.linkedin.com/in/jane-doe-example"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"includePersonalEmails"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The row gives &lt;code&gt;email&lt;/code&gt;, every company address on record in &lt;code&gt;workEmails&lt;/code&gt;, and &lt;code&gt;emailType&lt;/code&gt;. That last field is the one to read. &lt;code&gt;work_current&lt;/code&gt; is an address at today's employer. &lt;code&gt;work_other&lt;/code&gt; is an address from somewhere else, usually an old job.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;13. Find the CRM contacts who will bounce.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/linkedin-email-finder/examples/crm-contacts-with-past-employer-emails" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt;. Same input, different reading. Every &lt;code&gt;work_other&lt;/code&gt; row is a contact whose address in your CRM probably points at a former employer. Fix those before the next sequence, not after the bounce report.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;14. Personal emails for recruiting.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/linkedin-email-finder/examples/personal-emails-for-recruiting" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt;. Flip &lt;code&gt;includePersonalEmails&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; and gmail or outlook addresses come back too, which is what a recruiter needs for someone who should not get a job offer at their work address.&lt;/p&gt;

&lt;h2&gt;
  
  
  You have a list of companies
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/company-employees" rel="noopener noreferrer"&gt;Company Employees&lt;/a&gt; and &lt;a href="https://apify.com/b2bsearch/domain-to-decision-makers" rel="noopener noreferrer"&gt;Decision Maker Email Finder by Domain&lt;/a&gt; both start from a website domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;15. The leadership team of one company.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/company-employees/examples/leadership-team-by-company-domain" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"companies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"hubspot.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"roles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"cxo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"director"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"titleExcludes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"assistant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"office of"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"executive operations"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chief of staff"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"excludeLowSignal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxRows"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rows carry &lt;code&gt;fullName&lt;/code&gt;, &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;seniority&lt;/code&gt;, location, &lt;code&gt;positionStartYear&lt;/code&gt;, &lt;code&gt;hasWorkEmail&lt;/code&gt;, &lt;code&gt;hasPersonalEmail&lt;/code&gt; and the profile link. The &lt;code&gt;titleExcludes&lt;/code&gt; list is there because executive assistants love titles like "Office of the CEO".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;16. Every employee, then contacts only for the ones you need.&lt;/strong&gt; The &lt;a href="https://apify.com/b2bsearch/company-employees/examples/all-employees-by-company-domain" rel="noopener noreferrer"&gt;roster task&lt;/a&gt; uses &lt;code&gt;"profileDetail": "roster"&lt;/code&gt;, the light tier, to list the whole company. The &lt;a href="https://apify.com/b2bsearch/company-employees/examples/employee-emails-by-company-domain" rel="noopener noreferrer"&gt;contacts task&lt;/a&gt; switches to &lt;code&gt;"profileDetail": "contacts"&lt;/code&gt; with &lt;code&gt;"mustHave": ["email"]&lt;/code&gt;, so anyone without an address is skipped for free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;17. Engineers at a company you recruit from.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/company-employees/examples/engineers-at-a-company" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt;. &lt;code&gt;titleContains&lt;/code&gt; takes engineer and developer, &lt;code&gt;titleExcludes&lt;/code&gt; drops sales engineers and solutions engineers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;18. The CEO and founders of a list of companies.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/domain-to-decision-makers/examples/ceo-and-founders-by-company-domain" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"domains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"linear.app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vercel.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"supabase.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"posthog.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"retool.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"roles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"founder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cxo"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxPerCompany"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rows come ranked per company in &lt;code&gt;_rank&lt;/code&gt;, with the title, seniority, profile link and an &lt;code&gt;email&lt;/code&gt; that reaches the person today. That means an address on the company domain, else a personal one, never one at a past employer. There are ready versions for &lt;a href="https://apify.com/b2bsearch/domain-to-decision-makers/examples/marketing-leaders-by-company-domain" rel="noopener noreferrer"&gt;marketing leaders&lt;/a&gt; and &lt;a href="https://apify.com/b2bsearch/domain-to-decision-makers/examples/cto-and-engineering-leaders-by-domain" rel="noopener noreferrer"&gt;CTOs and engineering leaders&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;19. The email format of a domain.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/company-email-format-finder/examples/email-format-of-company-domains" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt; on Company Email Format Finder. Send domains and get &lt;code&gt;pattern&lt;/code&gt; like &lt;code&gt;first.last&lt;/code&gt;, how many real addresses confirm it, how strongly they agree, and a few masked samples. Useful when you have a name and a company and nothing else.&lt;/p&gt;

&lt;h2&gt;
  
  
  You want a reason to reach out
&lt;/h2&gt;

&lt;p&gt;A list is cold until something happens at the company. These tasks start from the something.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;20. Companies hiring account executives right now.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/hiring-companies-finder/examples/companies-hiring-account-executives-us" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt; on &lt;a href="https://apify.com/b2bsearch/hiring-companies-finder" rel="noopener noreferrer"&gt;Companies Hiring Now&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"account executive"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"locations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"United States"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"postedLimit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"month"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"excludeAgencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxCompanies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"decisionMakers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"decisionMakerTitleKeywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"chief revenue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"head of sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp sales"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"decisionMakersPerCompany"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The free preview counted 3,344 employers with 12,279 matching postings in the last month. Each company row carries &lt;code&gt;matchingJobs&lt;/code&gt;, the job &lt;code&gt;titles&lt;/code&gt;, &lt;code&gt;jobs30d&lt;/code&gt; and &lt;code&gt;jobs90d&lt;/code&gt; for the hiring pace, and the company card. With &lt;code&gt;decisionMakers&lt;/code&gt; on, the people who own the hire follow as rows of &lt;code&gt;_type&lt;/code&gt; &lt;code&gt;decision_maker&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A team hiring five AEs is probably shopping for sales tools too. The &lt;a href="https://apify.com/b2bsearch/hiring-companies-finder/examples/companies-hiring-engineers-germany-with-ctos" rel="noopener noreferrer"&gt;engineering version&lt;/a&gt; does the same for German companies hiring developers, with the CTO.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;21. New senior hires at your target accounts.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/new-hires-finder/examples/new-hires-at-target-accounts" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt; on New Hires Finder. New leaders tend to pick their vendors in the first months.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"companyDomains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"hubspot.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"zendesk.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"asana.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sinceMonths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"seniority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"director"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cxo"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxPerCompany"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rows bring &lt;code&gt;startedAt&lt;/code&gt;, &lt;code&gt;previousCompany&lt;/code&gt; and &lt;code&gt;previousTitle&lt;/code&gt;, which is the opening line of the email.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;22. Former employees of a company and where they are now.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/former-employees-finder/examples/former-employees-of-a-company" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt; on Former Employees Finder. Point it at a customer and you find champions who moved to new companies. Point it at a competitor and you find people who already know the problem. &lt;code&gt;leftAfterYear&lt;/code&gt; keeps it recent, and each row has &lt;code&gt;currentCompany&lt;/code&gt;, &lt;code&gt;currentTitle&lt;/code&gt; and &lt;code&gt;currentRoleStartYear&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;23. New VPs of sales since last October.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/people-database-search/examples/new-sales-leaders-since-october-2025" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt;. People Search with &lt;code&gt;currentRoleStartedAfterDate&lt;/code&gt; set to &lt;code&gt;2025-10&lt;/code&gt;. Change the titles and you have new CFOs, new heads of people, new anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;24. Who hires for Kubernetes in Berlin.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/linkedin-job-search-api/examples/kubernetes-jobs-berlin-hiring-companies" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt; on Jobs Database API. It searches the job description, not the title, so a platform engineer posting that mentions Kubernetes counts. Today: 96 open postings at 65 employers, data through 21 October.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"titleSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"devops engineer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"platform engineer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"site reliability engineer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"descriptionSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"kubernetes"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"locationSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Berlin, Germany"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"timeRange"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"30d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"removeAgency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"previewOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Write the city with its country. A bare "Berlin" is refused, "Berlin, Germany" works.&lt;/p&gt;

&lt;h2&gt;
  
  
  You need companies, not people
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;25. Seed startups in Europe funded since 2025.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/company-database-search/examples/seed-startups-europe-funded-since-2025" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt; on &lt;a href="https://apify.com/b2bsearch/company-database-search" rel="noopener noreferrer"&gt;Company Search&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"countryGroups"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"eu"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"hasFunding"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"fundingRounds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"pre_seed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"seed"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"fundedAfter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"employeesMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"previewOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The preview counted 1,650 companies. Turn &lt;code&gt;previewOnly&lt;/code&gt; off and each row is a company card: name, domain, headcount, industry, HQ and a &lt;code&gt;funding&lt;/code&gt; block with the last round type and date. The &lt;a href="https://apify.com/b2bsearch/company-database-search/examples/us-series-a-b-software-companies" rel="noopener noreferrer"&gt;Series A and B task&lt;/a&gt; and &lt;a href="https://apify.com/b2bsearch/company-database-search/examples/manufacturing-companies-germany-50-500" rel="noopener noreferrer"&gt;German manufacturers&lt;/a&gt; work the same way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;26. Companies like your best customers.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/lookalike-company-finder/examples/companies-similar-to-your-best-customers" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt; on Lookalike Company Finder. Give it two or three customer domains in &lt;code&gt;seedDomains&lt;/code&gt;. Every row says what it matched on in &lt;code&gt;matchedOn&lt;/code&gt;, so you can see why a company is there instead of trusting a score.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;27. Clean up a column of messy domains.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/domain-to-company/examples/domain-to-company-name" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt; on Company Enrichment by Domain. It takes &lt;code&gt;https://www.notion.so/product&lt;/code&gt;, &lt;code&gt;WWW.GONG.IO&lt;/code&gt; and &lt;code&gt;linear.app/features&lt;/code&gt; as they come from a spreadsheet and returns one card per domain. When two companies claim a domain, the row says so and costs nothing instead of guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  You have a mess to clean
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;28. Qualify inbound sign-ups by email.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/reverse-email-lookup/examples/qualify-inbound-signups-by-email" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt; on Reverse Email Lookup. Paste the emails from your sign-up form and get back the person, title and company with &lt;code&gt;"compact": true&lt;/code&gt;. Now you know which trial is a VP at a real company and which is a student.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;29. Where do your customer contacts work now.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/profile-lookup/examples/where-do-my-contacts-work-now" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt; on Profile Lookup. Feed it the profile URLs of the people who signed your contracts. A changed &lt;code&gt;companyName&lt;/code&gt; is either a churn risk or a new account, sometimes both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;30. A CRM export with a bit of everything.&lt;/strong&gt; &lt;a href="https://apify.com/b2bsearch/waterfall-lead-enrichment/examples/crm-export-to-emails-and-phones" rel="noopener noreferrer"&gt;Open the task&lt;/a&gt; on Waterfall Lead Enrichment. Each row of the CSV can carry a different key: an email, a profile URL, a name with a company. The Actor resolves whatever is there to a profile and adds contacts with &lt;code&gt;"contacts": true&lt;/code&gt;. For people files there is also &lt;a href="https://apify.com/b2bsearch/bulk-people-enrichment/examples/enrich-csv-of-emails-urls-and-names" rel="noopener noreferrer"&gt;Bulk People Enrichment&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chains that work
&lt;/h2&gt;

&lt;p&gt;One task rarely finishes the job. These are the chains I run most:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Companies Hiring Now for the employers, then the domain column into Decision Maker Email Finder, then the profile links into Phone Number Finder for the ones worth a call.&lt;/li&gt;
&lt;li&gt;People Search in &lt;code&gt;count&lt;/code&gt; mode to size the box, B2B Leads Finder to pull it, and the same input every Monday with &lt;code&gt;excludeDatasets&lt;/code&gt; pointing at last week.&lt;/li&gt;
&lt;li&gt;Former Employees Finder on your best customer, then Email Finder on the profile links, and keep only &lt;code&gt;work_current&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Reverse Email Lookup on a new sign-up, Company Enrichment by Domain on the company, Decision Maker Email Finder for the person who signs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Running them from an agent
&lt;/h2&gt;

&lt;p&gt;Every Actor here is also an MCP tool. Pin the ones you need so the agent does not load the whole Store:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http apify &lt;span class="s2"&gt;"https://mcp.apify.com?tools=b2bsearch/b2b-leads-finder,b2bsearch/people-database-search,b2bsearch/company-employees,b2bsearch/linkedin-to-phone"&lt;/span&gt; &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &amp;lt;APIFY_TOKEN&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The task inputs above are exactly what the agent sends. Ask it to count first and to cap each call with &lt;code&gt;maxResults&lt;/code&gt;, and it will usually do both.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What does Try for free do?&lt;/strong&gt; It copies the task into your Apify account with the input filled in. You run it on your own account and can change any field first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I pay for misses?&lt;/strong&gt; No. A person with no email, a domain nobody claims or a profile that was removed comes back as a free row with a &lt;code&gt;_status&lt;/code&gt; that says why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it scrape anything or need my login?&lt;/strong&gt; No. The answers come from a database, so there are no cookies, sessions or proxies on your side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use these from the API?&lt;/strong&gt; Yes. POST the same JSON to the Actor's run endpoint, or run the task by its id.&lt;/p&gt;

&lt;p&gt;If the job you have is not on this list, tell me in the comments. The good ones become task number thirty-one.&lt;/p&gt;

</description>
      <category>leadgeneration</category>
      <category>sales</category>
      <category>apify</category>
      <category>ai</category>
    </item>
    <item>
      <title>What $10 buys on Apify in B2B data</title>
      <dc:creator>Kevin Hall</dc:creator>
      <pubDate>Fri, 30 Oct 2026 10:07:19 +0000</pubDate>
      <link>https://dev.to/kevinhall/what-10-buys-on-apify-in-b2b-data-every-enriched-search-actor-in-and-out-37hh</link>
      <guid>https://dev.to/kevinhall/what-10-buys-on-apify-in-b2b-data-every-enriched-search-actor-in-and-out-37hh</guid>
      <description>&lt;p&gt;Apify's free plan comes with five dollars of usage a month and no card; the Starter plan folds nineteen into its fee. Most people spend that on a scraper: minutes of compute, a login, a proxy, a few hundred rows if nothing breaks. Spent on pay-per-result Actors it buys something else: rows, and only rows that answer the question.&lt;/p&gt;

&lt;p&gt;This is the map of what $10 buys in B2B data with the b2bsearch Actors, and then, for each one, what you send, what comes back, why the columns matter and which Actor to run next.&lt;/p&gt;

&lt;p&gt;The quantities are Starter-plan prices rounded down; on the free plan the same ten dollars is two months of credit and buys about as much, a little less on the leads and phone finders. No hit rates and no benchmarks today; those are in the posts linked along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  In one paragraph
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch" rel="noopener noreferrer"&gt;b2bsearch on Apify&lt;/a&gt; is a family of pay-per-row Actors over one database: 1B+ professional profiles, 115M companies, 50M+ job postings.&lt;/p&gt;

&lt;p&gt;A filter, a list of domains, profile URLs, emails or a CSV goes in; a flat table comes out, with emails and phones where they are on record. Misses, counts and repeats are free. No cookies, no login, no proxies, and every Actor is an MCP tool for Claude Code and other agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  What $10 buys
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/b2b-leads-finder" rel="noopener noreferrer"&gt;B2B Leads Finder&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;4,000 leads&lt;/strong&gt;, each with a live email&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/company-employees" rel="noopener noreferrer"&gt;Company Employees&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;1,100+ employees&lt;/strong&gt; of your target accounts, with emails and phones&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/domain-to-decision-makers" rel="noopener noreferrer"&gt;Decision Maker Email Finder by Domain&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;3,100 founders&lt;/strong&gt;, C-level and VPs with their emails&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/company-database-search" rel="noopener noreferrer"&gt;Company Search&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;6,600 companies&lt;/strong&gt; by industry, headcount, HQ and last round&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/domain-to-company" rel="noopener noreferrer"&gt;Company Enrichment by Domain&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;1,800 company cards&lt;/strong&gt; for a list of domains&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/people-database-search" rel="noopener noreferrer"&gt;People Search&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;5,000 people rows&lt;/strong&gt; from 35+ filters, count and market shape free&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/linkedin-email-finder" rel="noopener noreferrer"&gt;Email Finder&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;1,250 emails&lt;/strong&gt; at the current employer for profile URLs you hold&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/linkedin-to-phone" rel="noopener noreferrer"&gt;Phone Number Finder&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;900 verified US mobile numbers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/profile-lookup" rel="noopener noreferrer"&gt;Profile Lookup&lt;/a&gt; and &lt;a href="https://apify.com/b2bsearch/bulk-people-enrichment" rel="noopener noreferrer"&gt;Bulk People Enrichment&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;3,100 full career records&lt;/strong&gt;, or rows of a CSV resolved by any key&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/reverse-email-lookup" rel="noopener noreferrer"&gt;Reverse Email Lookup&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;3,100 people&lt;/strong&gt; behind email addresses&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/hiring-companies-finder" rel="noopener noreferrer"&gt;Companies Hiring Now&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;4,100 employers&lt;/strong&gt; hiring for a role, with their hiring pace&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/linkedin-jobs-scraper" rel="noopener noreferrer"&gt;Jobs Scraper&lt;/a&gt; and &lt;a href="https://apify.com/b2bsearch/linkedin-job-search-api" rel="noopener noreferrer"&gt;Jobs Database API&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;12,500 job postings&lt;/strong&gt; with the company card, or &lt;strong&gt;6,200&lt;/strong&gt; with the named recruiter and the employer's pace&lt;/p&gt;

&lt;p&gt;Misses are free rows on every one of them, so the budget goes to answers, not attempts.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to make the credit go far
&lt;/h2&gt;

&lt;p&gt;Five habits, all of them free:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Count before you buy.&lt;/strong&gt; Company Search and the jobs Actors have &lt;code&gt;previewOnly&lt;/code&gt;; People Search has &lt;code&gt;mode: "count"&lt;/code&gt; and &lt;code&gt;mode: "market"&lt;/code&gt;. A count tells you the size of a segment, a market run tells you its shape, and neither charges a row.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Let the misses be free.&lt;/strong&gt; A person with no email, a domain nobody claims, a namesake with five holders: each comes back as a row with a &lt;code&gt;_status&lt;/code&gt; and a note, and no charge. Read the notes; they are the autopsy of your list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Say what a row must have.&lt;/strong&gt; &lt;code&gt;mustHave&lt;/code&gt; (&lt;code&gt;currentWorkEmail&lt;/code&gt;, &lt;code&gt;personalEmail&lt;/code&gt;, &lt;code&gt;phone&lt;/code&gt;, &lt;code&gt;github&lt;/code&gt; and so on) means a row without it is skipped free and counted in one note row, instead of delivered and paid for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never pay for the same person twice.&lt;/strong&gt; &lt;code&gt;excludeDatasets&lt;/code&gt; on the search Actors takes the datasets of earlier runs and leaves everyone in them out. A weekly rerun costs only the new people.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cap the run.&lt;/strong&gt; &lt;code&gt;maxResults&lt;/code&gt;, &lt;code&gt;maxRows&lt;/code&gt;, &lt;code&gt;maxPerCompany&lt;/code&gt;, and &lt;code&gt;callOptions.maxTotalChargeUsd&lt;/code&gt; when an agent is doing the calling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The free plan returns up to a hundred results per run, with a monthly allowance per Actor; counts and previews sit outside it, and any paid plan lifts it. The rows themselves are the same on every plan.&lt;/p&gt;
&lt;h2&gt;
  
  
  Start from a filter: you have an ICP, not a list
&lt;/h2&gt;
&lt;h3&gt;
  
  
  B2B Leads Finder
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/b2b-leads-finder" rel="noopener noreferrer"&gt;B2B Leads Finder&lt;/a&gt; is the one to open when the brief reads "VPs of sales at US software companies with 50 to 500 people", and the Apollo alternative in the family.&lt;/p&gt;

&lt;p&gt;Job titles, seniority buckets, countries or regions (&lt;code&gt;dach&lt;/code&gt;, &lt;code&gt;nordics&lt;/code&gt;, &lt;code&gt;latam&lt;/code&gt;), cities, company size, industries, headline keywords, account domains, past employers, a refresh date. Or paste an Apollo people-search URL and let the Actor read the filters out of it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"vp sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"head of sales"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"industries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Software Development"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emailType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"work"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxPerCompany"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every row is a person with a live email: name, title, headline, the address and whether it is &lt;code&gt;work&lt;/code&gt; or &lt;code&gt;personal&lt;/code&gt;, both when both exist, company name, domain, size and industry, location, the profile URL, X, GitHub and Facebook links where on record, a &lt;code&gt;phoneOnRecord&lt;/code&gt; flag (switch on &lt;code&gt;includePhones&lt;/code&gt; for the number itself), a stable &lt;code&gt;personId&lt;/code&gt; and a &lt;code&gt;_freshness&lt;/code&gt; bucket. People without an email are not delivered and not charged; the note rows say how many, and why.&lt;/p&gt;

&lt;p&gt;That is a send-ready list, and the reason the family exists. Next: &lt;code&gt;excludeDatasets&lt;/code&gt; for next week's delta, &lt;a href="https://apify.com/b2bsearch/profile-lookup" rel="noopener noreferrer"&gt;Profile Lookup&lt;/a&gt; when you want the whole career behind a lead, &lt;a href="https://apify.com/b2bsearch/linkedin-to-phone" rel="noopener noreferrer"&gt;Phone Number Finder&lt;/a&gt; for the call list. The deep dive: &lt;a href="https://dev.to/kevinhall/apollo-alternative-in-claude-code-7-lead-lists-from-one-apify-actor-4olo"&gt;Apollo alternative in Claude Code: 7 lead lists from one Apify Actor&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  People Search
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/people-database-search" rel="noopener noreferrer"&gt;People Search&lt;/a&gt; is the same database with every filter exposed, 35+ of them. Title and headline keywords with AND lists, seniority, employer domains, industries and headcount, employer HQ country, past employer and the year they left, past titles, career start year, tenure, city, languages, connection count, people between jobs, records refreshed after a date.&lt;/p&gt;

&lt;p&gt;Three modes. &lt;code&gt;count&lt;/code&gt; answers with one number. &lt;code&gt;market&lt;/code&gt; answers with the shape, countries, seniority, employer size, industries, top titles, top employers, how many have a personal or a work address, one row per bucket; &lt;code&gt;segments&lt;/code&gt; compares up to ten variants in one run. &lt;code&gt;people&lt;/code&gt; returns the rows at the tier you choose: &lt;code&gt;row&lt;/code&gt; (name, title, employer, location, email flags), &lt;code&gt;profile&lt;/code&gt; (the career record) or &lt;code&gt;contacts&lt;/code&gt; (plus emails and phones), with &lt;code&gt;compact&lt;/code&gt; for agents.&lt;/p&gt;

&lt;p&gt;This is where the signals live: who left a competitor since last year (&lt;code&gt;pastEmployerDomains&lt;/code&gt; plus &lt;code&gt;leftPastEmployerAfterYear&lt;/code&gt;), who started a role this quarter (&lt;code&gt;currentRoleStartedAfterDate&lt;/code&gt;), fractional execs by headline. Two worked examples: &lt;a href="https://dev.to/kevinhall/the-warmest-cold-list-1803-people-who-left-hubspot-since-2025-23lp"&gt;the warmest cold list, people who left one company since 2025&lt;/a&gt; and &lt;a href="https://dev.to/kevinhall/5860-fractional-cfos-by-headline-2631-by-title-the-gap-is-the-list-3p88"&gt;fractional CFOs by headline&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Company Search
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/company-database-search" rel="noopener noreferrer"&gt;Company Search&lt;/a&gt; builds the account list: countries or groups, industries (a sector covers everything under it), HQ city or state, founding year, headcount band, and funding: &lt;code&gt;hasFunding&lt;/code&gt;, last round after or before a date, the stage of the last round, the amount. &lt;code&gt;previewOnly: true&lt;/code&gt; first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"gb"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"industries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Financial Services"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hqLocations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"London"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employeesMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"employeesMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fundedAfter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"previewOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A company row: name, primary domain, website, company page URL, headcount, industry with its taxonomy id, last round type, date and amount, founding year, description, country and HQ. Unknown facts are left out, never shipped as empty strings; a company the store holds twice comes back once, the duplicate as a free row.&lt;/p&gt;

&lt;p&gt;The domain column is the handle for everything below: paste it into Company Employees, Decision Makers or Lookalike Company Finder.&lt;/p&gt;

&lt;h3&gt;
  
  
  Companies Hiring Now
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/hiring-companies-finder" rel="noopener noreferrer"&gt;Companies Hiring Now&lt;/a&gt; turns a job search into the employers behind it. Job titles as boolean lines (&lt;code&gt;"account executive" OR "sales development"&lt;/code&gt;), countries, states or cities, how far back, experience level, employment type, industries, agencies out. Turn on &lt;code&gt;decisionMakers&lt;/code&gt; with roles, a per-company cap and title keywords, and each employer comes with the people who own the budget.&lt;/p&gt;

&lt;p&gt;One row per employer: the company card (domain, industry, headcount, country, HQ, funding), how many postings matched and how many are still open, first and last posting dates, open postings in total, postings in the last 7, 30 and 90 days, the seniority mix and the most posted titles of the last month.&lt;/p&gt;

&lt;p&gt;Then one row per decision maker: name, title, seniority, profile URL, freshness.&lt;/p&gt;

&lt;p&gt;A company hiring three account executives this month has a sales budget and a sales leader under pressure. That is a better trigger than any firmographic. Next: Company Employees for the rest of the team, Email Finder for the addresses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Jobs Database API
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/linkedin-job-search-api" rel="noopener noreferrer"&gt;Jobs Database API&lt;/a&gt; is the posting-level search over 50M+ job postings from the last 180 days. Boolean title and description search with exclusions, location, employer size and industry, agencies out.&lt;/p&gt;

&lt;p&gt;Then seniority, employment type, salary stated or above a floor, an applicant-count ceiling, posted after a date, open or expired, and the people behind the job: the named recruiter, the employer's hiring pace, the employer's decision makers. &lt;code&gt;previewOnly&lt;/code&gt; gives the market breakdown free; &lt;code&gt;compact&lt;/code&gt; keeps rows short.&lt;/p&gt;

&lt;p&gt;A job row: title, URL, posted date, the company card, location, seniority, employment type, salary text and parsed range, applicant range, recruiter name and profile URL, the employer's open postings and 7, 30 and 90-day pace with its top titles, whether the posting is still open and until when, the description as text or markdown.&lt;/p&gt;

&lt;p&gt;Recruiters use it for market maps, sales teams for "who just posted for the role my product replaces", developers for a job search without the duplicates. Two posts came out of it: &lt;a href="https://dev.to/kevinhall/job-search-in-claude-code-half-of-us-backend-postings-were-copies-1f9j"&gt;half of US backend postings were copies&lt;/a&gt; and &lt;a href="https://dev.to/kevinhall/ghost-jobs-measured-58-of-uk-backend-postings-came-from-middlemen-nhl"&gt;ghost jobs, measured&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start from domains: you have the accounts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Company Enrichment by Domain
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/domain-to-company" rel="noopener noreferrer"&gt;Company Enrichment by Domain&lt;/a&gt; takes a column of websites in any form (&lt;code&gt;acme.com&lt;/code&gt;, a URL with a path, &lt;code&gt;www&lt;/code&gt;) and returns one card per domain: company name, company page URL, website, industry, headcount and range, country, HQ city and region, founding year, description, last funding round with date and amount.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"domains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"acme-robotics.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.northwind-logistics.co.uk/about"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three statuses. &lt;code&gt;found&lt;/code&gt; is the card. &lt;code&gt;not_found&lt;/code&gt; means no company lists this domain as its site, free. &lt;code&gt;ambiguous&lt;/code&gt; means several unrelated pages claim it, or it is a shared host like &lt;code&gt;github.io&lt;/code&gt;, also free, and never a guess. Use it to qualify inbound (a form fill with a company domain becomes a size, an industry and a funding stage in one call), to clean a CRM, or to feed the two Actors below.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decision Maker Email Finder by Domain
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/domain-to-decision-makers" rel="noopener noreferrer"&gt;Decision Maker Email Finder by Domain&lt;/a&gt; answers the question every account list ends with: who runs this place. Domains in, up to five hundred per run, &lt;code&gt;roles&lt;/code&gt; to pick from founders, C-level, VPs and directors, &lt;code&gt;maxPerCompany&lt;/code&gt; in rank order, &lt;code&gt;titleKeywords&lt;/code&gt; to keep only marketing, finance or engineering.&lt;/p&gt;

&lt;p&gt;A row per person: rank, company name and headcount, full name, job title, seniority bucket, headline, profile URL, location, in-role-since year, email flags, and &lt;code&gt;email&lt;/code&gt; with its type: a work address on the company's own domain when one reaches the person today, else a personal one, at no extra charge. A domain with nobody on record comes back free, with a hint about brand domains.&lt;/p&gt;

&lt;p&gt;This is the ten-accounts-by-Friday Actor. Next: Phone Number Finder on the profile URLs for the call list, Company Employees when you need the layer below the leadership.&lt;/p&gt;

&lt;h3&gt;
  
  
  Company Employees
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/company-employees" rel="noopener noreferrer"&gt;Company Employees&lt;/a&gt; is the org map. Domains in, and &lt;code&gt;profileDetail&lt;/code&gt; decides the depth: &lt;code&gt;roster&lt;/code&gt; for the staff list (name, title, seniority, headline, city, email flags, profile URL, freshness stamps), &lt;code&gt;profile&lt;/code&gt; for the career record of each person, &lt;code&gt;contacts&lt;/code&gt; for emails, phones and social links. &lt;code&gt;roles&lt;/code&gt; keeps seniority buckets, &lt;code&gt;titleContains&lt;/code&gt; and &lt;code&gt;titleExcludes&lt;/code&gt; pick departments, &lt;code&gt;mustHave&lt;/code&gt; keeps only people you can reach, &lt;code&gt;excludeLowSignal&lt;/code&gt; drops self-declared profiles, &lt;code&gt;compact&lt;/code&gt; keeps rows short for agents.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"acme.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"vp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"director"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"titleContains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"revenue"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"profileDetail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"contacts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mustHave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why the roster first: it is the cheapest tier and it carries &lt;code&gt;hasWorkEmail&lt;/code&gt; and &lt;code&gt;hasPersonalEmail&lt;/code&gt; per person, so you can pick the twelve people who matter and send only those to the contacts tier or to the Email Finder.&lt;/p&gt;

&lt;p&gt;A repeat of an employee already delivered never charges, so re-running an account next month costs only the new hires. Full walk-through: &lt;a href="https://dev.to/kevinhall/account-mapping-by-company-domain-leaders-departments-and-work-emails-for-8-target-accounts-from-3agj"&gt;account mapping by company domain&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start from people you already have
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Email Finder
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/linkedin-email-finder" rel="noopener noreferrer"&gt;Email Finder&lt;/a&gt; takes profile URLs or bare handles, up to a thousand per run, and returns the addresses on record, never a pattern guess.&lt;/p&gt;

&lt;p&gt;Each row is labelled: &lt;code&gt;work_current&lt;/code&gt; for the current employer's domain, &lt;code&gt;work_other&lt;/code&gt; for an older company address, &lt;code&gt;personal&lt;/code&gt; when &lt;code&gt;includePersonalEmails&lt;/code&gt; is on, with the whole &lt;code&gt;workEmails&lt;/code&gt; list and a count. A profile with nothing on record is a free &lt;code&gt;no_email&lt;/code&gt; row that still names the person and says when a personal mailbox exists.&lt;/p&gt;

&lt;p&gt;The labels are the product. A list of two hundred URLs becomes three piles, send now, verify first, skip, in one run: &lt;a href="https://dev.to/kevinhall/bulk-email-finder-in-claude-code-200-profile-urls-64-still-current-n93"&gt;bulk email finder in Claude Code&lt;/a&gt;. For the "verify first" pile, &lt;a href="https://apify.com/b2bsearch/work-email-finder" rel="noopener noreferrer"&gt;Work Email Finder&lt;/a&gt; takes name plus domain, ranks candidates and checks the best one against the mail domain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phone Number Finder
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/linkedin-to-phone" rel="noopener noreferrer"&gt;Phone Number Finder&lt;/a&gt; accepts a profile URL, an email, or "Jane Smith, acme.com" per line, up to 20,000 a run, and returns verified mobile numbers: direct dials, never a switchboard, with name, title, company, location and a &lt;code&gt;_freshness&lt;/code&gt; bucket.&lt;/p&gt;

&lt;p&gt;A known profile without a number is a free &lt;code&gt;no_phone&lt;/code&gt; row. It is US-centric by design, so run it on US rows and expect little elsewhere. The call-list recipes: &lt;a href="https://dev.to/kevinhall/lusha-and-zoominfo-alternative-in-claude-code-a-call-list-four-ways-1mod"&gt;Lusha and ZoomInfo alternative in Claude Code&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Profile Lookup and Bulk People Enrichment
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/profile-lookup" rel="noopener noreferrer"&gt;Profile Lookup&lt;/a&gt; is the full record for a list of profile URLs: headline, current title and company, location, industry, connection count, tenure and total experience in years, every position with dates and descriptions, education, skills, languages, certifications, patents and publications when the profile has them, &lt;code&gt;updatedAt&lt;/code&gt; for the record's age, and with &lt;code&gt;contacts&lt;/code&gt; on, the emails and phones.&lt;/p&gt;

&lt;p&gt;It also reads the input names other profile scrapers use (&lt;code&gt;urls&lt;/code&gt;, &lt;code&gt;publicIdentifiers&lt;/code&gt;), so an existing integration only changes the Actor id.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/bulk-people-enrichment" rel="noopener noreferrer"&gt;Bulk People Enrichment&lt;/a&gt; is the same record for a CSV of up to 50,000 rows, each resolved by the strongest key it carries: email, profile URL, GitHub, X or Facebook handle, or a full name with a company domain. Namesakes come back as a free &lt;code&gt;ambiguous&lt;/code&gt; row with the holder count, never a guess, and rows stream into the dataset as they resolve.&lt;/p&gt;

&lt;p&gt;This is the fifty-columns pair, and the reason to pull the full record even when you only need a name: once the table is on your machine you can filter by anything in it. More on that below.&lt;/p&gt;

&lt;h3&gt;
  
  
  From an email, a name or a handle
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/reverse-email-lookup" rel="noopener noreferrer"&gt;Reverse Email Lookup&lt;/a&gt; turns any email into the person's full career row.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/email-to-linkedin" rel="noopener noreferrer"&gt;Email to Profile Finder&lt;/a&gt; is the lighter version: profile URL, name, headline, title, company and location, with a name beside a work address to find more. &lt;a href="https://apify.com/b2bsearch/name-to-profile" rel="noopener noreferrer"&gt;Name to Profile&lt;/a&gt; resolves "Jane Smith, acme.com" to the profile and career.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/social-handle-lookup" rel="noopener noreferrer"&gt;Social Handle Lookup&lt;/a&gt; does the same from a GitHub, X or Facebook handle. All four: an invalid or unmatched entry is a free row that says so.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rest of the family, one line each
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You hold&lt;/th&gt;
&lt;th&gt;Actor&lt;/th&gt;
&lt;th&gt;You get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;a Sales Navigator search URL&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apify.com/b2bsearch/sales-navigator-search" rel="noopener noreferrer"&gt;Sales Navigator Search&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;the people the search describes, count first, no cookies or seat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a filter box and calls to make&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apify.com/b2bsearch/b2b-leads-with-phones" rel="noopener noreferrer"&gt;Leads with Phones&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;leads where every row has a verified mobile and a live email, the Lusha alternative&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a competitor's domain&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apify.com/b2bsearch/former-employees-finder" rel="noopener noreferrer"&gt;Former Employees Finder&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;alumni, when they left, where they are now&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;your target accounts&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apify.com/b2bsearch/new-hires-finder" rel="noopener noreferrer"&gt;New Hires Finder&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;who joined in the last months, with title, start month and seniority&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;three good customers&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apify.com/b2bsearch/lookalike-company-finder" rel="noopener noreferrer"&gt;Lookalike Company Finder&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;similar companies by industry, country and size, each row with its match reason&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a domain and no name&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apify.com/b2bsearch/company-email-format-finder" rel="noopener noreferrer"&gt;Company Email Format Finder&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;the real address pattern, from addresses on record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a messy CSV&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apify.com/b2bsearch/waterfall-lead-enrichment" rel="noopener noreferrer"&gt;Waterfall Lead Enrichment&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;whatever key each row carries, resolved to a profile with contacts, the Clay alternative&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a job search&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apify.com/b2bsearch/linkedin-jobs-scraper" rel="noopener noreferrer"&gt;Jobs Scraper&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;postings in bulk with the full description and the company card&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;personal emails&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apify.com/b2bsearch/email-to-company" rel="noopener noreferrer"&gt;Email to Company&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;the employer and title behind a gmail address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;emails or handles&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://apify.com/b2bsearch/email-to-phone" rel="noopener noreferrer"&gt;Email to Phone&lt;/a&gt;, &lt;a href="https://apify.com/b2bsearch/name-to-phone" rel="noopener noreferrer"&gt;Name to Phone&lt;/a&gt;, the &lt;a href="https://apify.com/b2bsearch/facebook-to-email" rel="noopener noreferrer"&gt;Facebook&lt;/a&gt; and &lt;a href="https://apify.com/b2bsearch/twitter-to-email" rel="noopener noreferrer"&gt;X&lt;/a&gt; doors&lt;/td&gt;
&lt;td&gt;the same person, from the key you have&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Work the table on your machine
&lt;/h2&gt;

&lt;p&gt;Every run writes a dataset, and a dataset exports as JSON, CSV or XLSX from the Console or from one URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.apify.com/v2/datasets/&amp;lt;DATASET_ID&amp;gt;/items?format=csv&amp;amp;clean=true&amp;amp;token=&amp;lt;APIFY_TOKEN&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pull the profile tiers and you have fifty-plus columns per person: every position with dates, the employer card behind each one, education, skills, languages, email flags, freshness. That is where the "exactly the leads you need" part happens, after the pull and for free: people who were at a competitor before this job, who started this year, whose record was refreshed since spring, who list a language your rep speaks. One query over the CSV in DuckDB, a filter in Sheets, a &lt;code&gt;WHERE&lt;/code&gt; in pandas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jobTitle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;companyName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="s1"&gt;'leads.csv'&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;emailType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'work'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;_freshness&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'fresh_90d'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'updated_1y'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Join on &lt;code&gt;companyDomain&lt;/code&gt; to the company cards, dedupe on &lt;code&gt;personId&lt;/code&gt;, and feed the survivors to the next Actor by their profile URL. The database answers in seconds; the thinking happens locally, on columns you paid for once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four combinations worth stealing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hiring signal to inbox.&lt;/strong&gt; Companies Hiring Now (the titles your product serves, agencies out, decision makers on), then Company Employees (&lt;code&gt;roles: ["vp", "director"]&lt;/code&gt;, &lt;code&gt;titleContains&lt;/code&gt; for the function), then Email Finder on the rows you picked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inbound in one minute.&lt;/strong&gt; Email to Profile Finder on the form-fill address, Company Enrichment by Domain on its company domain, Decision Maker Email Finder for the two people above the one who filled the form. &lt;a href="https://dev.to/kevinhall/inbound-lead-qualification-from-the-email-domain-company-record-decision-makers-and-the-gmail-1p5d"&gt;The write-up&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitor alumni.&lt;/strong&gt; People Search with &lt;code&gt;pastEmployerDomains&lt;/code&gt; and &lt;code&gt;leftPastEmployerAfterYear&lt;/code&gt;, &lt;code&gt;market&lt;/code&gt; first to see where they went, then &lt;code&gt;people&lt;/code&gt; with &lt;code&gt;mustHave: ["email"]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CRM refresh.&lt;/strong&gt; Bulk People Enrichment on the CRM export; rows whose current employer no longer matches the CRM, or whose &lt;code&gt;updatedAt&lt;/code&gt; is old, are the ones to re-check, and Company Employees on the old domain tells you who replaced them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wiring: Claude Code, MCP, REST, n8n
&lt;/h2&gt;

&lt;p&gt;Pin the Actors you use in the server URL, so an agent loads only those definitions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;claude mcp add --transport http apify "https://mcp.apify.com?tools=b2bsearch/b2b-leads-finder,b2bsearch/people-database-search,b2bsearch/company-database-search,b2bsearch/domain-to-company,b2bsearch/domain-to-decision-makers,b2bsearch/company-employees,b2bsearch/linkedin-email-finder,b2bsearch/linkedin-to-phone,b2bsearch/hiring-companies-finder,b2bsearch/linkedin-job-search-api" --header "Authorization: Bearer &amp;lt;APIFY_TOKEN&amp;gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apify"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.apify.com?tools=b2bsearch/b2b-leads-finder,b2bsearch/company-employees,b2bsearch/domain-to-company"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer &amp;lt;APIFY_TOKEN&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tool names use a double hyphen (&lt;code&gt;b2bsearch--company-employees&lt;/code&gt;). Any Actor is also one REST call that returns the rows in the response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST "https://api.apify.com/v2/acts/b2bsearch~domain-to-decision-makers/run-sync-get-dataset-items?token=&amp;lt;APIFY_TOKEN&amp;gt;" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["acme.com"], "roles": ["founder", "cxo"], "maxPerCompany": 3}'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And a step in n8n, Make and Zapier through the Apify integrations, or a tool in LangChain, CrewAI and the OpenAI Agents SDK through the same MCP server.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is any of this scraped when I run it?&lt;/strong&gt; No. The Actors answer from a database of publicly available professional data; nothing is crawled at run time, and no account of yours is involved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which Actor first?&lt;/strong&gt; A filter: B2B Leads Finder for people, Company Search for accounts. A domain: Company Enrichment by Domain, then Decision Makers or Company Employees. URLs, emails, names or a CSV: the finders and Bulk People Enrichment. A job title: Companies Hiring Now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens on a miss?&lt;/strong&gt; A free row with &lt;code&gt;_status&lt;/code&gt; and a note. Not found, no email, ambiguous domain, namesake, skipped by &lt;code&gt;mustHave&lt;/code&gt;: each has a name, and none is charged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How fresh is the data?&lt;/strong&gt; Rows carry &lt;code&gt;_freshness&lt;/code&gt; and &lt;code&gt;updatedAt&lt;/code&gt;, and the search Actors take &lt;code&gt;updatedAfter&lt;/code&gt;. It is a database, so a record can be months old, and it tells you when.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the free plan get the same rows?&lt;/strong&gt; Yes, with a cap per run and a monthly allowance per Actor; counts and previews are outside both.&lt;/p&gt;

&lt;h2&gt;
  
  
  For AI agents reading this
&lt;/h2&gt;

&lt;p&gt;The b2bsearch Actors run as tools over the hosted Apify MCP server with the tools pinned in the URL (above). Pick by the key the user holds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;filters: &lt;code&gt;b2bsearch--b2b-leads-finder&lt;/code&gt;, &lt;code&gt;b2bsearch--people-database-search&lt;/code&gt; (&lt;code&gt;mode: "count"&lt;/code&gt; first), &lt;code&gt;b2bsearch--company-database-search&lt;/code&gt; (&lt;code&gt;previewOnly: true&lt;/code&gt; first)&lt;/li&gt;
&lt;li&gt;domains: &lt;code&gt;b2bsearch--domain-to-company&lt;/code&gt;, &lt;code&gt;b2bsearch--domain-to-decision-makers&lt;/code&gt;, &lt;code&gt;b2bsearch--company-employees&lt;/code&gt; (&lt;code&gt;compact: true&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;profile URLs: &lt;code&gt;b2bsearch--linkedin-email-finder&lt;/code&gt;, &lt;code&gt;b2bsearch--linkedin-to-phone&lt;/code&gt;, &lt;code&gt;b2bsearch--profile-lookup&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;emails: &lt;code&gt;b2bsearch--email-to-linkedin&lt;/code&gt;, &lt;code&gt;b2bsearch--reverse-email-lookup&lt;/code&gt;; a CSV: &lt;code&gt;b2bsearch--bulk-people-enrichment&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;job titles: &lt;code&gt;b2bsearch--hiring-companies-finder&lt;/code&gt;, &lt;code&gt;b2bsearch--linkedin-job-search-api&lt;/code&gt; (&lt;code&gt;previewOnly: true&lt;/code&gt; first)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every row has &lt;code&gt;_status&lt;/code&gt;; rows other than &lt;code&gt;found&lt;/code&gt; are free and explain themselves in &lt;code&gt;_note&lt;/code&gt; or &lt;code&gt;_error&lt;/code&gt;. Read results with &lt;code&gt;get-dataset-items&lt;/code&gt; and a &lt;code&gt;fields&lt;/code&gt; list. Set &lt;code&gt;callOptions.maxTotalChargeUsd&lt;/code&gt; on every paid run; per-plan pricing is on each Actor page. Platform docs: &lt;a href="https://docs.apify.com/mcp" rel="noopener noreferrer"&gt;Apify MCP server&lt;/a&gt; and &lt;a href="https://apify.com/agents.md" rel="noopener noreferrer"&gt;apify.com/agents.md&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>leadgeneration</category>
      <category>sales</category>
      <category>api</category>
      <category>mcp</category>
    </item>
    <item>
      <title>B2B data API for AI agents: 7 Apify Actors I use in day-to-day tasks</title>
      <dc:creator>Kevin Hall</dc:creator>
      <pubDate>Fri, 30 Oct 2026 08:45:20 +0000</pubDate>
      <link>https://dev.to/kevinhall/b2b-data-api-for-ai-agents-7-apify-actors-one-database-no-scraping-2an</link>
      <guid>https://dev.to/kevinhall/b2b-data-api-for-ai-agents-7-apify-actors-one-database-no-scraping-2an</guid>
      <description>&lt;p&gt;Most of my week is lists. Someone sends a filter, a pile of domains or a column of profile URLs, and wants people with a working address on the other side. The question that comes with it is always the same: which one do I run.&lt;/p&gt;

&lt;p&gt;This is the answer I now send back. Seven Actors on Apify, all reading one database of professional profiles and companies: links, what each one takes and returns, what I measured on them on 30 October, and how an AI agent calls them over MCP.&lt;/p&gt;

&lt;p&gt;If your last week included a 403 page, a CAPTCHA, or a scraping account that stopped working, start with the next section. It explains why these are lookups and not scrapes.&lt;/p&gt;

&lt;h2&gt;
  
  
  In one paragraph
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://apify.com/b2bsearch" rel="noopener noreferrer"&gt;b2bsearch Actors on Apify&lt;/a&gt; are a B2B data API over a database of 800M+ professional profiles and 115M companies. Filters, domains, profile URLs or emails go in; leads, employees, company cards, emails and phone numbers come out. Nothing is scraped at run time, misses and counts are free, and every Actor is an MCP tool for Claude Code and other agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a database and not a scraper
&lt;/h2&gt;

&lt;p&gt;Most listings in this corner of the Store are live scrapers. They need a session cookie or a login, they run through proxies, a run takes minutes, and when the site answers 403 or 429 the scraper retries or stops. The account carrying the risk is yours.&lt;/p&gt;

&lt;p&gt;Pricing follows the same logic. Many charge per returned row whether or not the row has what you asked for. Some add a start fee per run, a minimum budget per run, or a lifetime run cap for free accounts.&lt;/p&gt;

&lt;p&gt;I read 86 listings in this category in October: about a third have a hard limit for free users and 16 charge a start fee of a cent or more.&lt;/p&gt;

&lt;p&gt;The seven Actors below answer from a database. No cookies, no login, no proxies, and a run finishes in seconds. The things that are never charged are the part I would defend anywhere:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Never charged&lt;/th&gt;
&lt;th&gt;How you see it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;a miss&lt;/td&gt;
&lt;td&gt;a free row with &lt;code&gt;_status&lt;/code&gt; and a note saying why&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a count or a market breakdown&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;previewOnly&lt;/code&gt; or &lt;code&gt;mode: "count"&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a repeat of a person already delivered&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;excludeDatasets&lt;/code&gt;, or inside the same run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a row that fails your &lt;code&gt;mustHave&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;one free note row with the number skipped&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two honest limits. A database lags a live page: rows about people carry a refreshed-on stamp and a &lt;code&gt;_freshness&lt;/code&gt; bucket, and the people and leads searches take &lt;code&gt;updatedAfter&lt;/code&gt;, so you can insist on fresh records and pay only for those.&lt;/p&gt;

&lt;p&gt;And on price I will not claim the cheapest in every niche. In some of them a listing with more users charges less per row; on company search and company employees these sit below the category leader on every plan. The list of what is never charged is where they differ most.&lt;/p&gt;

&lt;h2&gt;
  
  
  The seven, by what you hold
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You hold&lt;/th&gt;
&lt;th&gt;Run&lt;/th&gt;
&lt;th&gt;You get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;a filter box (industry, country, size, funding)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apify.com/b2bsearch/company-database-search" rel="noopener noreferrer"&gt;Company Search&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;companies, with a free count first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a website domain&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apify.com/b2bsearch/domain-to-company" rel="noopener noreferrer"&gt;Company Enrichment by Domain&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;the company card&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a website domain&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apify.com/b2bsearch/company-employees" rel="noopener noreferrer"&gt;Company Employees&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;the roster, full profiles, or people with contacts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a filter box or an Apollo URL&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apify.com/b2bsearch/b2b-leads-finder" rel="noopener noreferrer"&gt;B2B Leads Finder&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;people with a live email&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;profile URLs&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apify.com/b2bsearch/linkedin-email-finder" rel="noopener noreferrer"&gt;Email Finder&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;addresses on record, labelled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;profile URLs, emails or names&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apify.com/b2bsearch/linkedin-to-phone" rel="noopener noreferrer"&gt;Phone Number Finder&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;verified mobile numbers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;email addresses&lt;/td&gt;
&lt;td&gt;&lt;a href="https://apify.com/b2bsearch/email-to-linkedin" rel="noopener noreferrer"&gt;Email to Profile Finder&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;the person and their profile&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How to read the sections below
&lt;/h2&gt;

&lt;p&gt;Every section starts the same way: the Actor link, a short overview, what it takes (the filters that matter) and what it returns. Then come scenarios you can repeat, each with the exact input and a table of the fields that come back.&lt;/p&gt;

&lt;p&gt;All runs are from 30 October 2026. They go through the same three addresses, so one example is enough to learn the pattern:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Address&lt;/th&gt;
&lt;th&gt;Looks like&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Store page&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://apify.com/b2bsearch/&amp;lt;slug&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;REST endpoint&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;https://api.apify.com/v2/acts/b2bsearch~&amp;lt;slug&amp;gt;/run-sync-get-dataset-items?token=&amp;lt;APIFY_TOKEN&amp;gt;&lt;/code&gt;, POST the input JSON as the body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP tool&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;b2bsearch--&amp;lt;slug&amp;gt;&lt;/code&gt; on &lt;code&gt;https://mcp.apify.com?tools=b2bsearch/&amp;lt;slug&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The slug is the last part of the link in each section's first line. The headline segment, where I use one, is fintech companies in London with 51 to 200 employees that raised a round since January 2024. Everything else is a fresh example you can paste.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Company Search: filters to companies, count first
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/company-database-search" rel="noopener noreferrer"&gt;Company Search&lt;/a&gt; · slug &lt;code&gt;company-database-search&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You give it a filter box and it returns company rows. The first call should always be a free count: &lt;code&gt;previewOnly: true&lt;/code&gt; answers with the size of the segment and charges nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takes&lt;/strong&gt; (the filters that matter):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;countries&lt;/code&gt;, or &lt;code&gt;countryGroups&lt;/code&gt; such as &lt;code&gt;dach&lt;/code&gt;, &lt;code&gt;nordics&lt;/code&gt;, &lt;code&gt;eu&lt;/code&gt;, &lt;code&gt;gcc&lt;/code&gt;, &lt;code&gt;latam&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;industries&lt;/code&gt; and &lt;code&gt;hqLocations&lt;/code&gt; (city or state)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;employeesMin&lt;/code&gt; and &lt;code&gt;employeesMax&lt;/code&gt;, &lt;code&gt;foundedFrom&lt;/code&gt; and &lt;code&gt;foundedTo&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hasFunding&lt;/code&gt;, &lt;code&gt;fundingRounds&lt;/code&gt; (&lt;code&gt;seed&lt;/code&gt;, &lt;code&gt;series_a&lt;/code&gt; and on), &lt;code&gt;fundedAfter&lt;/code&gt;, &lt;code&gt;fundingAmountMin&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;companyDomains&lt;/code&gt; to look up a known list, &lt;code&gt;previewOnly&lt;/code&gt;, &lt;code&gt;maxResults&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Returns:&lt;/strong&gt; one row per company.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;What it holds&lt;/th&gt;
&lt;th&gt;Why it helps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;name&lt;/code&gt;, &lt;code&gt;domain&lt;/code&gt;, &lt;code&gt;website&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;the company and where it lives online&lt;/td&gt;
&lt;td&gt;the key you feed into every other Actor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;linkedinUrl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the company page URL&lt;/td&gt;
&lt;td&gt;a stable id for joins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;employeeCount&lt;/code&gt;, &lt;code&gt;industry&lt;/code&gt;, &lt;code&gt;founded&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;size, sector, founding year&lt;/td&gt;
&lt;td&gt;segment and prioritise offline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;hq&lt;/code&gt;, &lt;code&gt;countryCode&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;headquarters place&lt;/td&gt;
&lt;td&gt;route by region&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;funding&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;last round type, date and amount&lt;/td&gt;
&lt;td&gt;"raised a Series A in 2025" is a filter, not research&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;what the company says it does&lt;/td&gt;
&lt;td&gt;a line for an opener or an LLM prompt&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Scenario A: Series A software companies in Germany
&lt;/h3&gt;

&lt;p&gt;Count first, free:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"de"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"industries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Software Development"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fundingRounds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"series_a"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fundedAfter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employeesMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employeesMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"previewOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One row back in 4 seconds: 16 companies match. Swap &lt;code&gt;previewOnly&lt;/code&gt; for &lt;code&gt;"maxResults": 5&lt;/code&gt; and the same call returns five company rows in 5 seconds, each with its round type, date and, when it is public, the amount.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario B: a whole region with one word
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;countryGroups: ["dach"]&lt;/code&gt; stands for Germany, Austria and Switzerland, so one input covers three markets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"countryGroups"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"dach"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"industries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Financial Services"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employeesMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employeesMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hasFunding"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"previewOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Free answer: 236 companies. If that is too many, add &lt;code&gt;fundingRounds&lt;/code&gt; or a city before you pay for a single row.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario C: the headline segment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"gb"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hqLocations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"London"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"industries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Financial Services"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employeesMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employeesMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fundedAfter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;count, free&lt;/td&gt;
&lt;td&gt;79 companies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rows pulled&lt;/td&gt;
&lt;td&gt;20, largest first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;run time&lt;/td&gt;
&lt;td&gt;about 5 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The trap is headcount: about half of all companies on file carry none, and a size filter drops them unless you switch on &lt;code&gt;includeCompaniesWithoutHeadcount&lt;/code&gt;. For a funded fintech list that is fine. For long-tail segments, run the count both ways.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Company Enrichment by Domain: one domain, one card
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/domain-to-company" rel="noopener noreferrer"&gt;Company Enrichment by Domain&lt;/a&gt; · slug &lt;code&gt;domain-to-company&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The simplest Actor in the family and the one where agents outnumber humans in my request logs. A list of domains in, a company card per domain out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takes:&lt;/strong&gt; one input, &lt;code&gt;domains&lt;/code&gt;, a list of site domains.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Returns:&lt;/strong&gt; a card per domain.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;What it holds&lt;/th&gt;
&lt;th&gt;Why it helps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;companyName&lt;/code&gt;, &lt;code&gt;domain&lt;/code&gt;, &lt;code&gt;website&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;identity&lt;/td&gt;
&lt;td&gt;clean up a CRM column&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;linkedinUrl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the company page URL&lt;/td&gt;
&lt;td&gt;join key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;employeeCount&lt;/code&gt;, &lt;code&gt;employeeRange&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;headcount and its bucket&lt;/td&gt;
&lt;td&gt;route small accounts and big ones differently&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;industry&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;sector and a plain-language line&lt;/td&gt;
&lt;td&gt;tag accounts without reading sites&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;country&lt;/code&gt;, &lt;code&gt;hqLocality&lt;/code&gt;, &lt;code&gt;hqRegion&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;where the headquarters is&lt;/td&gt;
&lt;td&gt;territory routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;founded&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;founding year&lt;/td&gt;
&lt;td&gt;age as a signal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;hasFunding&lt;/code&gt;, &lt;code&gt;lastRoundType&lt;/code&gt;, &lt;code&gt;lastRoundDate&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;funding state&lt;/td&gt;
&lt;td&gt;"has money" in one column&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Scenario A: three domains, three cards
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"domains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"stripe.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wise.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"notion.so"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three cards in 8 seconds, each with a headcount, a sector and a funding flag.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario B: what it does when it is not sure
&lt;/h3&gt;

&lt;p&gt;I sent the eight domains from the London list in Company Search. Six came back as cards. Two came back as &lt;code&gt;ambiguous&lt;/code&gt;, each with a note that two unrelated company pages list that domain and neither carries its name, and no charge. A guessed card would have cost more than a free "I do not know".&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario C: sort a column of form fills
&lt;/h3&gt;

&lt;p&gt;Drop the domain part of every address on your sign-up list into &lt;code&gt;domains&lt;/code&gt;, dedupe first, and read &lt;code&gt;employeeRange&lt;/code&gt; and &lt;code&gt;hasFunding&lt;/code&gt;. You get the account behind each form fill without opening a tab. The full inbound version is &lt;a href="https://dev.to/kevinhall/inbound-lead-qualification-from-the-email-domain-company-record-decision-makers-and-the-gmail-1p5d"&gt;inbound lead qualification from the email domain&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Company Employees: the roster, the profiles, or the people you can write to
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/company-employees" rel="noopener noreferrer"&gt;Company Employees&lt;/a&gt; · slug &lt;code&gt;company-employees&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The account-based door. One company domain per line, and &lt;code&gt;profileDetail&lt;/code&gt; picks how much each person row carries. Everything that narrows the list runs before anything is charged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;companies&lt;/code&gt;: domains, one per line&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;profileDetail&lt;/code&gt;: &lt;code&gt;roster&lt;/code&gt; (staff list), &lt;code&gt;profile&lt;/code&gt; (career record) or &lt;code&gt;contacts&lt;/code&gt; (adds emails and phones)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;roles&lt;/code&gt;: &lt;code&gt;cxo&lt;/code&gt;, &lt;code&gt;founder&lt;/code&gt;, &lt;code&gt;vp&lt;/code&gt;, &lt;code&gt;director&lt;/code&gt;, &lt;code&gt;manager&lt;/code&gt;, &lt;code&gt;other&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;titleContains&lt;/code&gt; and &lt;code&gt;titleExcludes&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mustHave&lt;/code&gt;: &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;workEmail&lt;/code&gt;, &lt;code&gt;currentWorkEmail&lt;/code&gt;, &lt;code&gt;personalEmail&lt;/code&gt;, &lt;code&gt;phone&lt;/code&gt;, &lt;code&gt;github&lt;/code&gt;, &lt;code&gt;twitter&lt;/code&gt;, &lt;code&gt;facebook&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;compact: true&lt;/code&gt; for agents, &lt;code&gt;maxRows&lt;/code&gt; to cap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Returns:&lt;/strong&gt; one row per person, wider with each tier.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Adds&lt;/th&gt;
&lt;th&gt;Use it for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;roster&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;name, title, seniority, location, headline, start year, connections, flags &lt;code&gt;hasWorkEmail&lt;/code&gt; and &lt;code&gt;hasPersonalEmail&lt;/code&gt;, profile URL&lt;/td&gt;
&lt;td&gt;building the org chart and picking who to look up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;profile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;everything above plus &lt;code&gt;about&lt;/code&gt;, &lt;code&gt;positions&lt;/code&gt;, &lt;code&gt;education&lt;/code&gt;, &lt;code&gt;skills&lt;/code&gt;, &lt;code&gt;interests&lt;/code&gt;, &lt;code&gt;industry&lt;/code&gt;, &lt;code&gt;followersCount&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;research before a call, personalisation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;contacts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;everything above plus &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;emailType&lt;/code&gt;, &lt;code&gt;workEmails&lt;/code&gt;, &lt;code&gt;personalEmails&lt;/code&gt;, &lt;code&gt;emailCount&lt;/code&gt;, &lt;code&gt;employerMatch&lt;/code&gt;, &lt;code&gt;socialLinks&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;the send list&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Scenario A: who runs this company
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"stripe.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"founder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cxo"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"profileDetail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"roster"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxRows"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Five people in 4 seconds with title, seniority and the two email flags. The sixth row is a free note, &lt;code&gt;skipped_row_budget&lt;/code&gt;, telling you more people matched and &lt;code&gt;maxRows&lt;/code&gt; cut the list.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario B: the sales leaders of one company, with an address
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"wise.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"titleContains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"head of sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales director"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"profileDetail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"contacts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mustHave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxRows"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four people in 6 seconds, each with an address, its label and the profile. People without an address are skipped for free and counted in one note row.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario C: leaders across a list of accounts
&lt;/h3&gt;

&lt;p&gt;I ran the two largest companies from the London list twice.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Run&lt;/th&gt;
&lt;th&gt;Delivered&lt;/th&gt;
&lt;th&gt;Skipped, free&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;roster, compact rows&lt;/td&gt;
&lt;td&gt;25 rows&lt;/td&gt;
&lt;td&gt;the rest of the roster, one note row&lt;/td&gt;
&lt;td&gt;8 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;leaders (C-level, VP, founder, director) with an address on record, contacts tier&lt;/td&gt;
&lt;td&gt;20 people&lt;/td&gt;
&lt;td&gt;9 without an address, one note row&lt;/td&gt;
&lt;td&gt;13 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Of the 20 leaders, 12 came with a company address and 7 with a personal one. The row says which tier it could actually answer: &lt;code&gt;_detail&lt;/code&gt; reads &lt;code&gt;contacts&lt;/code&gt; when a contact reaches the person today and &lt;code&gt;profile&lt;/code&gt; when it does not, and the price follows the row, not the request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario D: read before you write
&lt;/h3&gt;

&lt;p&gt;Take &lt;code&gt;companies: ["wise.com"]&lt;/code&gt;, &lt;code&gt;roles: ["founder", "cxo"]&lt;/code&gt;, &lt;code&gt;"profileDetail": "profile"&lt;/code&gt;, &lt;code&gt;"compact": true&lt;/code&gt; and &lt;code&gt;"maxRows": 3&lt;/code&gt;. Three rows come back in 5 seconds with &lt;code&gt;about&lt;/code&gt;, &lt;code&gt;positions&lt;/code&gt;, &lt;code&gt;education&lt;/code&gt;, &lt;code&gt;skills&lt;/code&gt; and &lt;code&gt;followersCount&lt;/code&gt;. That is enough context for an LLM to draft an opener that mentions something real.&lt;/p&gt;

&lt;p&gt;Two more notes. A repeat of an employee already delivered never charges, so re-running a domain next month costs only the new people. And &lt;code&gt;compact: true&lt;/code&gt; is the switch for agents: the compact contacts row was about a third the size of the full one in my run, with the same identity, role, five latest positions and contact fields.&lt;/p&gt;

&lt;p&gt;The listing prices this Actor below the category leader on every Apify plan. That is a Store fact, not a promise from me; the pricing tab has the per-plan numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. B2B Leads Finder: a filter box, people with a live email
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/b2b-leads-finder" rel="noopener noreferrer"&gt;B2B Leads Finder&lt;/a&gt; · slug &lt;code&gt;b2b-leads-finder&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The Apollo alternative in the family. You describe the people; every delivered lead has an email at their current employer or a personal one, plus the profile and social links. People who fail the test are not sold: they come back as free note rows with a count.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;jobTitles&lt;/code&gt;, &lt;code&gt;excludeJobTitles&lt;/code&gt;, &lt;code&gt;titleMatch&lt;/code&gt; (&lt;code&gt;substring&lt;/code&gt; or &lt;code&gt;word&lt;/code&gt;), &lt;code&gt;seniority&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;countries&lt;/code&gt;, &lt;code&gt;countryGroups&lt;/code&gt;, &lt;code&gt;cities&lt;/code&gt;, &lt;code&gt;companyHqCountries&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;industries&lt;/code&gt;, &lt;code&gt;companySizeMin&lt;/code&gt; and &lt;code&gt;companySizeMax&lt;/code&gt;, &lt;code&gt;keywords&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;companyDomains&lt;/code&gt; for named accounts, &lt;code&gt;pastCompanyDomains&lt;/code&gt; for alumni of a company&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;emailType&lt;/code&gt;: &lt;code&gt;any&lt;/code&gt;, &lt;code&gt;work&lt;/code&gt; or &lt;code&gt;personal&lt;/code&gt;; &lt;code&gt;includePhones&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;maxPerCompany&lt;/code&gt;, &lt;code&gt;excludeDatasets&lt;/code&gt;, &lt;code&gt;updatedAfter&lt;/code&gt;, &lt;code&gt;apolloUrl&lt;/code&gt; instead of all of the above&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Returns:&lt;/strong&gt; one row per lead.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;What it holds&lt;/th&gt;
&lt;th&gt;Why it helps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;fullName&lt;/code&gt;, &lt;code&gt;firstName&lt;/code&gt;, &lt;code&gt;lastName&lt;/code&gt;, &lt;code&gt;jobTitle&lt;/code&gt;, &lt;code&gt;headline&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;the person and what they say they do&lt;/td&gt;
&lt;td&gt;merge fields and a sanity check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;email&lt;/code&gt;, &lt;code&gt;emailType&lt;/code&gt;, &lt;code&gt;workEmail&lt;/code&gt;, &lt;code&gt;personalEmail&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;the address and which kind it is&lt;/td&gt;
&lt;td&gt;send to work, hold personal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;phone&lt;/code&gt;, &lt;code&gt;phones&lt;/code&gt;, &lt;code&gt;phoneOnRecord&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;mobile numbers when asked for&lt;/td&gt;
&lt;td&gt;the call list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;companyName&lt;/code&gt;, &lt;code&gt;companyDomain&lt;/code&gt;, &lt;code&gt;companySize&lt;/code&gt;, &lt;code&gt;companyIndustry&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;the employer&lt;/td&gt;
&lt;td&gt;account-level routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;location&lt;/code&gt;, &lt;code&gt;countryCode&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;where the person is&lt;/td&gt;
&lt;td&gt;time zone and language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;linkedinUrl&lt;/code&gt;, &lt;code&gt;twitterUrl&lt;/code&gt;, &lt;code&gt;facebookUrl&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;profiles&lt;/td&gt;
&lt;td&gt;research links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;updatedAt&lt;/code&gt;, &lt;code&gt;_freshness&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;when the record was refreshed&lt;/td&gt;
&lt;td&gt;refuse stale rows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Scenario A: marketing heads at mid-size software companies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"head of marketing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp marketing"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"industries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Computer Software"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emailType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"work"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxPerCompany"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;leads delivered&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;skipped free: no work address at the current employer&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;skipped free: had left the role the search matched&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;About 20 seconds. The skipped rows are the feature: the Actor reads the profile, sees the position is closed, and says so in a note row instead of selling you a dead lead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario B: alumni of a company you compete with
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;pastCompanyDomains&lt;/code&gt; finds people who used to work somewhere. Sales leaders in the DACH region who left a big CRM vendor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"sales director"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp sales"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"countryGroups"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"dach"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pastCompanyDomains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"salesforce.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emailType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"work"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Five leads in 19 seconds, 11 skipped for no work address and 11 more because they had already moved on. These are people who know the tool you replace, which is the warmest cold list I know how to build.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario C: leads with a mobile number
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"vp sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chief revenue officer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"industries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Computer Software"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emailType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"work"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includePhones"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxPerCompany"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ten leads in 17 seconds, 4 of them with a mobile on record. The phone sits in the same row as the email, so there is no second lookup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario D: the headline segment, sized first
&lt;/h3&gt;

&lt;p&gt;Before pulling I size the people box for free on &lt;a href="https://apify.com/b2bsearch/people-database-search" rel="noopener noreferrer"&gt;People Search&lt;/a&gt; with &lt;code&gt;mode: "count"&lt;/code&gt;. Sales leaders at London fintechs of this size: 231 people. &lt;code&gt;mode: "market"&lt;/code&gt; then shows the shape, seniority, employer size and the title spellings in use, also free. The pull itself, work addresses only and one lead per company:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;leads delivered&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;skipped free: no work address at the current employer&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;skipped free: had left the role the search matched&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;skipped free: over the one-per-company limit&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Scenario E: only the new people next week
&lt;/h3&gt;

&lt;p&gt;Pass the dataset id of last week's run in &lt;code&gt;excludeDatasets&lt;/code&gt; and rerun the same search. Everyone already delivered is left out and never charged again.&lt;/p&gt;

&lt;p&gt;I wrote a whole post on the dead rows: &lt;a href="https://dev.to/kevinhall/243-of-417-leads-in-a-typical-icp-box-were-dead-before-the-first-email-epo"&gt;243 of 417 leads in a typical ICP box were dead before the first email&lt;/a&gt;. Built the search in Apollo? Paste its URL into &lt;code&gt;apolloUrl&lt;/code&gt;; a Sales Navigator saved search has a twin that takes the URL: &lt;a href="https://dev.to/kevinhall/sales-navigator-alternative-in-claude-code-one-saved-search-one-list-i"&gt;Sales Navigator alternative in Claude Code&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Email Finder: profile URLs to addresses on record, labelled
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/linkedin-email-finder" rel="noopener noreferrer"&gt;Email Finder&lt;/a&gt; · slug &lt;code&gt;linkedin-email-finder&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You hold profile URLs, you want addresses. It returns the addresses in the person's record, never a pattern guess.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;profileUrls&lt;/code&gt;: full URLs or bare handles, up to 1,000 per run&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;includePersonalEmails&lt;/code&gt;: off by default&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Returns:&lt;/strong&gt; one row per profile.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;What it holds&lt;/th&gt;
&lt;th&gt;Why it helps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the best address on record&lt;/td&gt;
&lt;td&gt;the one to send to&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;emailType&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;work_current&lt;/code&gt;, &lt;code&gt;work_other&lt;/code&gt; or &lt;code&gt;personal&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;the label that keeps dead addresses out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;workEmails&lt;/code&gt;, &lt;code&gt;personalEmails&lt;/code&gt;, &lt;code&gt;emailCount&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;every address on record&lt;/td&gt;
&lt;td&gt;fallbacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;fullName&lt;/code&gt;, &lt;code&gt;jobTitle&lt;/code&gt;, &lt;code&gt;companyName&lt;/code&gt;, &lt;code&gt;companySlug&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;who and where&lt;/td&gt;
&lt;td&gt;merge fields&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;location&lt;/code&gt;, &lt;code&gt;countryCode&lt;/code&gt;, &lt;code&gt;_freshness&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;place and record age&lt;/td&gt;
&lt;td&gt;filter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Label meaning: &lt;code&gt;work_current&lt;/code&gt; is an address on the current employer's domain, &lt;code&gt;work_other&lt;/code&gt; is a company address it cannot tie to the current employer, &lt;code&gt;personal&lt;/code&gt; shows up only when you switch the flag on. A &lt;code&gt;no_email&lt;/code&gt; row is free and still carries the name, title and employer; a &lt;code&gt;not_found&lt;/code&gt; row is free too.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario A: addresses for a list you already hold
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"profileUrls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"satyanadella"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jane-doe-example"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includePersonalEmails"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I fed it the 10 profile URLs from the marketing-leads pull above with personal mailboxes switched on. All 10 came back as &lt;code&gt;work_current&lt;/code&gt; in 4 seconds. That is the point of starting from a leads search: the profile URL is a by-product of the pull.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario B: a roster with a hit rate
&lt;/h3&gt;

&lt;p&gt;The 20 roster rows from the Company Employees run went in: 13 came back with a company address, 7 as free rows, 2 of those with a note that a personal mailbox is on record. About 5 seconds.&lt;/p&gt;

&lt;p&gt;The labels matter more than the hit rate. On a 200-URL list of marketing leaders earlier this week, about half of the addresses on record were at an older employer, and the label is what kept them out of the send list. That run is here: &lt;a href="https://dev.to/kevinhall/bulk-email-finder-in-claude-code-200-profile-urls-64-still-current-n93"&gt;Bulk email finder in Claude Code: 200 profile URLs, 64 still current&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Phone Number Finder: verified mobile numbers, pay per found
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/linkedin-to-phone" rel="noopener noreferrer"&gt;Phone Number Finder&lt;/a&gt; · slug &lt;code&gt;linkedin-to-phone&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Direct dials, not switchboards. It is built to take whatever you already have and find the mobile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takes:&lt;/strong&gt; &lt;code&gt;profileUrls&lt;/code&gt;, one entry per line, up to 20,000 per run. Each line can be a profile URL or handle, an email address, or a name plus domain like &lt;code&gt;Jane Smith, acme.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Returns:&lt;/strong&gt; one row per entry.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;What it holds&lt;/th&gt;
&lt;th&gt;Why it helps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;primaryPhone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the best verified mobile&lt;/td&gt;
&lt;td&gt;dial this one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;phones&lt;/code&gt;, &lt;code&gt;phoneCount&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;every number on record&lt;/td&gt;
&lt;td&gt;fallbacks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;fullName&lt;/code&gt;, &lt;code&gt;jobTitle&lt;/code&gt;, &lt;code&gt;company&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;who it belongs to&lt;/td&gt;
&lt;td&gt;check before dialling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;location&lt;/code&gt;, &lt;code&gt;country&lt;/code&gt;, &lt;code&gt;linkedinUrl&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;place and the matched profile&lt;/td&gt;
&lt;td&gt;join back to your list&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A miss is a free &lt;code&gt;no_phone&lt;/code&gt; row. It is US-centric, by the listing's own words and in my runs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario A: a mobile for each US lead
&lt;/h3&gt;

&lt;p&gt;I sent the 10 US marketing leads from section 4 by profile URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"profileUrls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"https://www.linkedin.com/in/&amp;lt;handle&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;handle&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three came back with a mobile, seven as free &lt;code&gt;no_phone&lt;/code&gt; rows, in 6 seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario B: the same people, by email
&lt;/h3&gt;

&lt;p&gt;Same 10 people, but the input is their work addresses, one per line. Same result: 3 numbers, 7 free rows. This is the version for a CRM export that has addresses and no profile links.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario C: names and domains only
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"profileUrls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Jane Smith, acme.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Raj Patel, example.org"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use it when all you have is a name and a company. I did not run this form today; it is in the listing's input description.&lt;/p&gt;

&lt;p&gt;Earlier this week a hundred US sales leaders gave a mobile for 35 of them, chief revenue officers about half, directors one in four. My London roster gave almost nothing, and the misses cost nothing. Run it on US rows. The full call-list recipe is in &lt;a href="https://dev.to/kevinhall/lusha-and-zoominfo-alternative-in-claude-code-a-call-list-four-ways-1mod"&gt;Lusha and ZoomInfo alternative in Claude Code&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Email to Profile Finder: an address in, the person out
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/email-to-linkedin" rel="noopener noreferrer"&gt;Email to Profile Finder&lt;/a&gt; · slug &lt;code&gt;email-to-linkedin&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The inbound door. It turns email addresses, work or personal, into the person.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Takes:&lt;/strong&gt; &lt;code&gt;emails&lt;/code&gt;, one address per line, up to 1,000 per run. Put a name beside a work address to find more: &lt;code&gt;Jane Doe &amp;lt;jane@acme.com&amp;gt;&lt;/code&gt; or &lt;code&gt;jane@acme.com, Jane Doe&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Returns:&lt;/strong&gt; one row per address.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;What it holds&lt;/th&gt;
&lt;th&gt;Why it helps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;fullName&lt;/code&gt;, &lt;code&gt;headline&lt;/code&gt;, &lt;code&gt;jobTitle&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;who they are and what they do&lt;/td&gt;
&lt;td&gt;qualify the sign-up&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;company&lt;/code&gt;, &lt;code&gt;companyLinkedinUrl&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;the employer and its page&lt;/td&gt;
&lt;td&gt;feeds Company Enrichment by Domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;linkedinUrl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the matched profile&lt;/td&gt;
&lt;td&gt;feeds Email Finder and Phone Number Finder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;location&lt;/code&gt;, &lt;code&gt;country&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;place&lt;/td&gt;
&lt;td&gt;routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;matchedEmail&lt;/code&gt;, &lt;code&gt;matchedVia&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;which address matched and how&lt;/td&gt;
&lt;td&gt;audit trail&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Addresses it cannot match, invalid ones and duplicates come back as free rows that say why.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario A: a column of work addresses
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"emails"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"jane@acme.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jane Doe &amp;lt;jane@acme.com&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ten work addresses from the leads pull went in and 10 people came out, every one &lt;code&gt;matchedVia: as_given&lt;/code&gt;, in 6 seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario B: close the loop
&lt;/h3&gt;

&lt;p&gt;The 13 addresses the Email Finder returned for the London roster went back in. 13 people came out, and all 13 were the profiles the roster started from. About 6 seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario C: a form fill becomes an account
&lt;/h3&gt;

&lt;p&gt;A visitor leaves an address. Run it here, take &lt;code&gt;companyLinkedinUrl&lt;/code&gt; or the domain into Company Enrichment by Domain, then Company Employees for the decision makers next to them. That is the inbound chain in &lt;a href="https://dev.to/kevinhall/inbound-lead-qualification-from-the-email-domain-company-record-decision-makers-and-the-gmail-1p5d"&gt;inbound lead qualification from the email domain&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How they chain
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You start with&lt;/th&gt;
&lt;th&gt;Chain&lt;/th&gt;
&lt;th&gt;You end with&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;a market idea&lt;/td&gt;
&lt;td&gt;Company Search count, then rows, then Company Employees&lt;/td&gt;
&lt;td&gt;named people at named accounts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a filter box&lt;/td&gt;
&lt;td&gt;B2B Leads Finder with &lt;code&gt;includePhones&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;email plus mobile in one row&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a list of profile URLs&lt;/td&gt;
&lt;td&gt;Email Finder, then Phone Number Finder on the misses&lt;/td&gt;
&lt;td&gt;the best reachable channel per person&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a sign-up list&lt;/td&gt;
&lt;td&gt;Email to Profile Finder, then Company Enrichment by Domain&lt;/td&gt;
&lt;td&gt;the account behind each address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;last month's list&lt;/td&gt;
&lt;td&gt;B2B Leads Finder with &lt;code&gt;excludeDatasets&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;only the new people&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What does an agent pay to load all seven?
&lt;/h2&gt;

&lt;p&gt;An MCP tool costs tokens before it is called: the description, the input schema and the output schema the server infers from rows. I measured &lt;code&gt;tools/list&lt;/code&gt; on the hosted Apify MCP server with the seven pinned, tiktoken o200k on compact JSON.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Company Employees&lt;/td&gt;
&lt;td&gt;4,191&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2B Leads Finder&lt;/td&gt;
&lt;td&gt;3,990&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Company Search&lt;/td&gt;
&lt;td&gt;3,344&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email Finder&lt;/td&gt;
&lt;td&gt;2,016&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phone Number Finder&lt;/td&gt;
&lt;td&gt;1,961&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email to Profile Finder&lt;/td&gt;
&lt;td&gt;1,955&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Company Enrichment by Domain&lt;/td&gt;
&lt;td&gt;1,953&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;four helper tools (run, abort, dataset, key-value store)&lt;/td&gt;
&lt;td&gt;3,812&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;total&lt;/td&gt;
&lt;td&gt;23,222&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For scale: two days ago I measured 20 job Actors the same way and got a median of 3,829 per tool, with one at 32,737. The seven here sit at a median of 2,016.&lt;/p&gt;

&lt;p&gt;The descriptions are 80 to 97 tokens each; the weight is in the input schemas of the search Actors and in the inferred output schema of Company Employees. Flat rows keep that schema small, and &lt;code&gt;compact: true&lt;/code&gt; keeps the rows small after the call.&lt;/p&gt;

&lt;p&gt;Method and the job numbers: &lt;a href="https://dev.to/kevinhall/mcp-tool-cost-20-job-actors-on-apify-21k-to-327k-tokens-each-1hm4"&gt;MCP tool cost: 20 job Actors on Apify&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wiring: Claude Code, MCP, n8n, REST
&lt;/h2&gt;

&lt;p&gt;Pin the Actors in the server URL so an agent loads only these definitions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;claude mcp add --transport http apify "https://mcp.apify.com?tools=b2bsearch/company-database-search,b2bsearch/domain-to-company,b2bsearch/company-employees,b2bsearch/b2b-leads-finder,b2bsearch/linkedin-email-finder,b2bsearch/linkedin-to-phone,b2bsearch/email-to-linkedin" --header "Authorization: Bearer &amp;lt;APIFY_TOKEN&amp;gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same server in any MCP client (Cursor, Windsurf, Claude Desktop, ChatGPT, LangChain, CrewAI, the OpenAI Agents SDK):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apify"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.apify.com?tools=b2bsearch/company-database-search,b2bsearch/domain-to-company,b2bsearch/company-employees,b2bsearch/b2b-leads-finder,b2bsearch/linkedin-email-finder,b2bsearch/linkedin-to-phone,b2bsearch/email-to-linkedin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer &amp;lt;APIFY_TOKEN&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tool names use a double hyphen: &lt;code&gt;b2bsearch--company-employees&lt;/code&gt;, &lt;code&gt;b2bsearch--b2b-leads-finder&lt;/code&gt;, and so on. Cap a run with &lt;code&gt;callOptions.maxTotalChargeUsd&lt;/code&gt;, read rows with &lt;code&gt;get-dataset-items&lt;/code&gt; and a &lt;code&gt;fields&lt;/code&gt; list, and run the free count before the paid pull.&lt;/p&gt;

&lt;p&gt;Without an agent: every Actor is a REST endpoint. One call, rows back in the response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST "https://api.apify.com/v2/acts/b2bsearch~domain-to-company/run-sync-get-dataset-items?token=&amp;lt;APIFY_TOKEN&amp;gt;" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["acme.com", "example.org"]}'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same Actors are steps in n8n, Make and Zapier through the Apify integrations, and the Store page of each one has the input schema, the output example and the per-plan price.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the agent did on its own
&lt;/h2&gt;

&lt;p&gt;I gave a Claude Code session the seven tools pinned and a brief: size the segment, pull ten companies, get the leadership of the two largest with a current work email, fall back to the email finder where that fails, cap every paid run, report a ledger. Shell and file tools were denied. Eleven turns, about four minutes, four Actor runs.&lt;/p&gt;

&lt;p&gt;What it did without being told:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;loaded all seven tool definitions first, then wrote a cost table from the descriptions before the first paid call, naming the tools it would not use&lt;/li&gt;
&lt;li&gt;added &lt;code&gt;hasFunding: true&lt;/code&gt; and &lt;code&gt;sort: "employee_count_desc"&lt;/code&gt; to the company search; its free count matched mine, 79&lt;/li&gt;
&lt;li&gt;read rows with a &lt;code&gt;fields&lt;/code&gt; list that left out &lt;code&gt;description&lt;/code&gt;, the longest field on a company card&lt;/li&gt;
&lt;li&gt;added &lt;code&gt;titleExcludes&lt;/code&gt; for assistants, "office of" and chiefs of staff to the leadership pull, after reading the field description that warns the C-level bucket catches them&lt;/li&gt;
&lt;li&gt;noticed that &lt;code&gt;callOptions&lt;/code&gt; is in no Actor's schema and passed the spend cap anyway, in the call options of the MCP server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where it stopped. It asked Company Employees for leaders with an address at the current employer, exactly as briefed, and both runs came back as one free note row each: the leaders on record did not carry one, so nothing was delivered and nothing charged. With no profile URLs in hand it skipped the email finder, handed over the account list with a trust column (two rows marked questionable, one not fintech by its industry, one to check for HQ) and stopped.&lt;/p&gt;

&lt;p&gt;That is the behaviour I want from an agent spending money. It is also a brief bug: step three should pull the cheap roster first and run the finder on its URLs. With the requirement loosened to any address on record, the same two companies gave 20 people in my own run above.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not do
&lt;/h2&gt;

&lt;p&gt;It does not read a live page. A row can be months old; the stamp is on rows about people, and &lt;code&gt;updatedAfter&lt;/code&gt; on the people and leads searches lets you refuse old ones. The email finder does not verify deliverability; the &lt;a href="https://apify.com/b2bsearch/work-email-finder" rel="noopener noreferrer"&gt;Work Email Finder&lt;/a&gt; does that for name-plus-domain lookups.&lt;/p&gt;

&lt;p&gt;Phone coverage is US-centric. And the free Apify plan caps a run at a hundred results and an account at five hundred rows a month per Actor, with the same rows paid users get; any paid plan lifts that.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is this an Apollo, Lusha or Sales Navigator replacement?&lt;/strong&gt; For building lists and enriching them by domain, URL or email, yes: no seat, no login, pay per found row. For browsing profiles one at a time in a sidebar, no.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do these Actors scrape anything when I run them?&lt;/strong&gt; No. The answer comes from a database of publicly available professional data; the network names in the listings describe the kind of data, not a crawl at run time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where do the email addresses come from?&lt;/strong&gt; From the contact block of the person's record. The email finder returns only what is on record and labels it; nothing is generated from a name pattern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I stop an agent from overspending?&lt;/strong&gt; Pin the tools, cap every run with &lt;code&gt;maxTotalChargeUsd&lt;/code&gt;, run the free count or &lt;code&gt;previewOnly&lt;/code&gt; first, and use &lt;code&gt;excludeDatasets&lt;/code&gt; so a rerun never pays for the same person twice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which one first?&lt;/strong&gt; Hold a domain: Company Enrichment by Domain, then Company Employees. Hold a filter: Company Search for accounts, B2B Leads Finder for people. Hold URLs or emails: the finders.&lt;/p&gt;

&lt;h2&gt;
  
  
  For AI agents reading this
&lt;/h2&gt;

&lt;p&gt;The seven Actors run as tools over the hosted Apify MCP server with the tools pinned in the URL (the wiring block above). The workflow, tool by tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;b2bsearch--company-database-search&lt;/code&gt; with &lt;code&gt;previewOnly: true&lt;/code&gt; to size a segment, then rows with &lt;code&gt;maxResults&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;b2bsearch--domain-to-company&lt;/code&gt; for a card per domain; &lt;code&gt;_status&lt;/code&gt; &lt;code&gt;ambiguous&lt;/code&gt; means do not guess&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;b2bsearch--company-employees&lt;/code&gt; with &lt;code&gt;profileDetail&lt;/code&gt;, &lt;code&gt;roles&lt;/code&gt;, &lt;code&gt;mustHave&lt;/code&gt; and &lt;code&gt;compact: true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;b2bsearch--b2b-leads-finder&lt;/code&gt; with &lt;code&gt;emailType&lt;/code&gt;, &lt;code&gt;maxPerCompany&lt;/code&gt; and &lt;code&gt;excludeDatasets&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;b2bsearch--linkedin-email-finder&lt;/code&gt; and &lt;code&gt;b2bsearch--linkedin-to-phone&lt;/code&gt; with &lt;code&gt;profileUrls&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;b2bsearch--email-to-linkedin&lt;/code&gt; with &lt;code&gt;emails&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every row has &lt;code&gt;_status&lt;/code&gt;; rows other than &lt;code&gt;found&lt;/code&gt; are free and say why in &lt;code&gt;_note&lt;/code&gt; or &lt;code&gt;_error&lt;/code&gt;. Read results with &lt;code&gt;get-dataset-items&lt;/code&gt; and a &lt;code&gt;fields&lt;/code&gt; list. Per-plan pricing is on each Actor page; set &lt;code&gt;callOptions.maxTotalChargeUsd&lt;/code&gt; on every paid run. Platform docs: &lt;a href="https://docs.apify.com/mcp" rel="noopener noreferrer"&gt;Apify MCP server&lt;/a&gt; and &lt;a href="https://apify.com/agents.md" rel="noopener noreferrer"&gt;apify.com/agents.md&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>api</category>
      <category>leadgeneration</category>
    </item>
    <item>
      <title>Bulk email finder in Claude Code: 200 profile URLs, 64 still current</title>
      <dc:creator>Kevin Hall</dc:creator>
      <pubDate>Thu, 29 Oct 2026 19:26:14 +0000</pubDate>
      <link>https://dev.to/kevinhall/bulk-email-finder-in-claude-code-200-profile-urls-64-still-current-n93</link>
      <guid>https://dev.to/kevinhall/bulk-email-finder-in-claude-code-200-profile-urls-64-still-current-n93</guid>
      <description>&lt;p&gt;Everyone in sales has this file. A column of profile URLs from an event list, an old export or the CRM, and an empty column next to it where the email should go.&lt;/p&gt;

&lt;p&gt;Any email finder will fill that column. What none of them tells you is whether the person still reads that mailbox. A record collects addresses the way a career collects employers, and the finder hands you the one on top. The bounce arrives a week later, on your domain's reputation, not theirs.&lt;/p&gt;

&lt;p&gt;So on 2026-10-29 I ran two hundred profile URLs through an Apify Actor that labels the address instead of just returning it. Current employer, older employer, nothing on record, profile gone. Then I put two more Actors behind it, and let Claude Code run the same twenty over MCP. Every number below comes from those runs.&lt;/p&gt;

&lt;p&gt;In one paragraph: a bulk email finder here takes profile URLs, one per line, and returns the addresses on each person's record with a label. An address on the current employer's domain, an older company address, or nothing. Misses are free rows with a reason.&lt;/p&gt;

&lt;p&gt;For the older and empty rows a second Actor tries name plus company domain and verifies what it finds. A free search step sizes the segment before anyone pays.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where two hundred URLs come from, and what a free read says
&lt;/h2&gt;

&lt;p&gt;I did not want to run a client's list for a blog post, so I drew two random samples from the same people database the finder reads: in-house marketing leaders, and founders. Different inboxes, different habits. &lt;a href="https://apify.com/b2bsearch/people-database-search" rel="noopener noreferrer"&gt;People Search&lt;/a&gt; in &lt;code&gt;market&lt;/code&gt; mode first, which costs nothing and tells you what the box looks like before you pull from it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Segment&lt;/th&gt;
&lt;th&gt;People&lt;/th&gt;
&lt;th&gt;Personal email on record&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;US marketing leaders (VP, Head, CMO, Marketing Director) at software companies with 51 to 500 employees&lt;/td&gt;
&lt;td&gt;2,386&lt;/td&gt;
&lt;td&gt;about two thirds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US founders and CEOs of software companies with 2 to 50 employees&lt;/td&gt;
&lt;td&gt;59,835&lt;/td&gt;
&lt;td&gt;just over half&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Inside the marketing box, chief marketing officers and other C-level titles were nearly half, directors about a third, VPs fewer than one in ten. Useful to know before you read anything into a sample of a hundred.&lt;/p&gt;

&lt;p&gt;Then the pull. &lt;code&gt;people&lt;/code&gt; mode, compact rows, a random seed so I could not cherry-pick, five runs of twenty per segment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"people"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"titleKeywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"vp marketing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"head of marketing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chief marketing officer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"marketing director"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employerIndustries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Software Development"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employeeCountMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employeeCountMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"profileDetail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"row"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sampleSeed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two of the hundred marketing draws were the same person, so that list is ninety-eight. Each compact row carries a profile URL, the employer's domain, company size, and two flags: &lt;code&gt;hasWorkEmail&lt;/code&gt; and &lt;code&gt;hasPersonalEmail&lt;/code&gt;. Eighty-two of the ninety-eight marketing leaders said yes to a work email. Seventy-six of the hundred founders did.&lt;/p&gt;

&lt;p&gt;Hold that number.&lt;/p&gt;

&lt;h2&gt;
  
  
  The run: one field, four seconds
&lt;/h2&gt;

&lt;p&gt;The finder takes one field. Links, bare handles and mobile URLs all work, and spellings of the same profile are looked up once. Up to a thousand per run; a free plan returns up to a hundred results per run, and I fed twenty at a time so I could read each batch before the next.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"profileUrls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;one profile URL per line&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includePersonalEmails"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four seconds per batch of twenty. Here is what two hundred URLs became:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;_status&lt;/code&gt; / &lt;code&gt;emailType&lt;/code&gt;
&lt;/th&gt;
&lt;th&gt;Marketing leaders (98)&lt;/th&gt;
&lt;th&gt;Founders (100)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Address at the current employer&lt;/td&gt;
&lt;td&gt;&lt;code&gt;work_current&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Only an older company address&lt;/td&gt;
&lt;td&gt;&lt;code&gt;work_other&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Matched, nothing on record&lt;/td&gt;
&lt;td&gt;&lt;code&gt;no_email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Profile gone&lt;/td&gt;
&lt;td&gt;&lt;code&gt;profile_removed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Only the first two rows are billed. The empty and gone rows come back with a status, and for the empty ones with the name and title, so you know who to route elsewhere.&lt;/p&gt;

&lt;p&gt;Now back to the flag. Eighty-two marketing leaders had "has a work email" on their database row. Thirty-eight of them have one at the company they work for today. A yes in a database means an address exists somewhere in the record. It does not say where.&lt;/p&gt;

&lt;p&gt;That is the whole post in one line. About half the work addresses in a B2B record belong to a job the person has left, and a finder that does not label them sells you the bounce.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an older address looks like
&lt;/h2&gt;

&lt;p&gt;A career leaves a trail of mailboxes. The found marketing records held four addresses each in the middle of the pack, three quarters of them three or more, and one person had thirteen. Founders' records were a little shorter, three in the middle.&lt;/p&gt;

&lt;p&gt;The finder sorts the current employer's address first when it has one. When it has none it can tie to today's employer, the row is labelled &lt;code&gt;work_other&lt;/code&gt; and the first address in the list is simply the first one, with no claim about recency.&lt;/p&gt;

&lt;p&gt;I checked the label against the employer domain from the source row, the one a CRM would hold:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;code&gt;work_current&lt;/code&gt; rows, marketing leaders&lt;/th&gt;
&lt;th&gt;38&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Same domain as the source row&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same company, a different mail domain&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A different company&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The eleven are brands whose mail domain is not the website: a product name on the site, the legal entity on the envelope. Among founders it split in half, which is what you get when one person runs two companies at once.&lt;/p&gt;

&lt;p&gt;Record freshness shifts the odds without deciding anything:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source record last updated&lt;/th&gt;
&lt;th&gt;Current address&lt;/th&gt;
&lt;th&gt;Older only&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Within the last year&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;More than a year ago&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Fresher records lean toward a live address. Not by enough to filter on. The label does the filtering, freshness only tells you how much to trust it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Personal mailboxes, on request
&lt;/h2&gt;

&lt;p&gt;By default the finder returns company addresses only. When a matched profile has nothing corporate but a personal mailbox is on record, the empty row says so in a &lt;code&gt;_note&lt;/code&gt;. Five of the twenty-four empty founder rows carried that note. None of the twelve empty marketing rows did, and their source rows agreed: nothing of either kind.&lt;/p&gt;

&lt;p&gt;I reran those five with &lt;code&gt;includePersonalEmails&lt;/code&gt; on. Five personal addresses, as promised.&lt;/p&gt;

&lt;p&gt;Then I reran one whole founder batch of twenty with personal mailboxes on from the start, to see what the switch does to rows that already had something:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Row in the first run&lt;/th&gt;
&lt;th&gt;Rows&lt;/th&gt;
&lt;th&gt;With personal mailboxes on&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Current employer address&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;still the current address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Older company address&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;10 became a personal mailbox, 6 stayed older&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nothing&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;still nothing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;With the switch on, a personal mailbox outranks an older company address. For the founder of a twelve-person company that is usually the inbox that gets read. For an in-house CMO it is the wrong one, which is why the switch is off by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second door: name plus domain, verified
&lt;/h2&gt;

&lt;p&gt;The older and empty rows are not dead people, they are people whose record is behind. For those there is a different Actor. &lt;a href="https://apify.com/b2bsearch/work-email-finder" rel="noopener noreferrer"&gt;Work Email Finder&lt;/a&gt; takes a name and a company domain, builds the candidates the way the domain writes addresses, and with &lt;code&gt;verifyTopCandidate&lt;/code&gt; on checks the best one against the mail server and its own records.&lt;/p&gt;

&lt;p&gt;I took the eighty-one found marketing rows, the name from the finder's row and the domain from the source row, and ran all of them through it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"lookups"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;company domain from your CRM&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"full_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;name from the finder row&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"...eighty more"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"verifyTopCandidate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Email Finder said&lt;/th&gt;
&lt;th&gt;Rows&lt;/th&gt;
&lt;th&gt;Verified address at today's domain&lt;/th&gt;
&lt;th&gt;Of which already somewhere in the record&lt;/th&gt;
&lt;th&gt;New, built from the pattern&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;work_current&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;work_other&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Thirty-three of the forty-three "older" rows came back with a verified address at today's employer. Twenty-one of those were already in the record's &lt;code&gt;workEmails&lt;/code&gt; list, below the one on top. The finder ties addresses to the employer's canonical domain, so a brand domain further down the list stays labelled older.&lt;/p&gt;

&lt;p&gt;Two lessons for a pipeline. Match the whole list against your own domain list before you discard a row. And send what is left through the name-plus-domain door with verification on, which rescued most of the rest here.&lt;/p&gt;

&lt;p&gt;The honest other half: eight people with a current address on record got no verified candidate from the pattern door. Record and pattern are two sources. Where they agree, twenty-six rows here, is where I would send first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Claude Code did with twenty of them
&lt;/h2&gt;

&lt;p&gt;I gave Claude Code the Email Finder and People Search over MCP, nothing else. Shell and file tools off.&lt;/p&gt;

&lt;p&gt;The prompt was a RevOps person in plain words. Two thousand CRM contacts with profile URLs and no email, here are twenty. Our policy is work addresses at the current employer only, never a personal mailbox unless you can say why. Look each person up once.&lt;/p&gt;

&lt;p&gt;It loaded the two tool definitions, ran one lookup on all twenty with personal mailboxes off, read the twenty rows with &lt;code&gt;get-dataset-items&lt;/code&gt;, and wrote its answer. Four tool calls, one of them paid, under four minutes. It did not run the free search, and said so: nothing in the task needed it.&lt;/p&gt;

&lt;p&gt;Its ledger for the twenty: seven current, eight older, two with nothing, three profiles gone. Then it did the reading I would have skipped on a Friday.&lt;/p&gt;

&lt;p&gt;One "older" row held an address on the current employer's domain further down the list. It proposed matching the whole list against the CRM's domain before discarding anything, the same fix I arrived at with eighty-one rows and a second Actor.&lt;/p&gt;

&lt;p&gt;One row's only address sat on a domain made of the person's own name. A one-person consultancy mailbox in practice, it said, and excluded under the policy whatever the label says.&lt;/p&gt;

&lt;p&gt;It noticed that &lt;code&gt;profile_removed&lt;/code&gt; is not in the tool's description, read the status correctly anyway, and said it could not confirm the meaning with the tools it had. That gap in the listing is mine to close.&lt;/p&gt;

&lt;p&gt;It also noted that &lt;code&gt;_freshness&lt;/code&gt; did not vary across its fifteen found rows, so on that sample the field filtered nothing. True, and worth knowing before you build a rule on it.&lt;/p&gt;

&lt;p&gt;Before the remaining two thousand it asked for five things: normalise and dedupe the URLs on the handle, compare &lt;code&gt;work_current&lt;/code&gt; employers with the CRM's, verify deliverability before trusting hundreds, watch the share of gone profiles, and poll the run instead of waiting inline. I would sign all five.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you send
&lt;/h2&gt;

&lt;p&gt;Addresses from the first Actor are on record, not verified at run time. The second Actor's check says a mailbox accepts mail. Neither says the person reads it.&lt;/p&gt;

&lt;p&gt;The label can lag. A job change in the last few months can still show as current. Compare the row's employer with the one you hold.&lt;/p&gt;

&lt;p&gt;Brands with a second mail domain show up as "older". Match on your domain list, not on the label alone.&lt;/p&gt;

&lt;p&gt;Seven of the hundred and ninety-eight URLs pointed at a profile that no longer exists. A CRM full of URLs from three years ago will have more. Keep that share in view, it is free to measure.&lt;/p&gt;

&lt;p&gt;Consent and the law are yours: CAN-SPAM, GDPR, PECR, whatever applies where the person sits. A verified address is not permission.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is this a Hunter or Apollo email finder replacement?&lt;/strong&gt; For turning profile URLs into addresses in bulk, yes: no seat, no browser extension, you pay per found row and the misses are free. For a Chrome plugin that fills an address while you browse, no.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it guess addresses?&lt;/strong&gt; The first Actor does not: it returns only addresses that exist in the person's record and says so when there are none. The second one builds candidates from name and domain and can verify the best one. That is the guessing door, and it is labelled as such.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does &lt;code&gt;work_other&lt;/code&gt; mean?&lt;/strong&gt; A company address the finder cannot tie to the current employer. Usually a previous job, sometimes the same company under a brand domain. Check the &lt;code&gt;workEmails&lt;/code&gt; list against your own domains before you decide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why were some addresses personal when I did not ask?&lt;/strong&gt; They were not, unless &lt;code&gt;includePersonalEmails&lt;/code&gt; is on. With it on, a personal mailbox outranks an older company address on the row.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How big can one run be?&lt;/strong&gt; Up to a thousand URLs per run on this Actor. A free Apify plan returns up to a hundred results per run and five hundred rows a month; any paid plan removes that.&lt;/p&gt;

&lt;h2&gt;
  
  
  For AI agents reading this
&lt;/h2&gt;

&lt;p&gt;The three Actors run over the hosted Apify MCP server with the tools pinned in the URL, so an agent loads only these definitions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;claude mcp add --transport http apify "https://mcp.apify.com?tools=b2bsearch/linkedin-email-finder,b2bsearch/work-email-finder,b2bsearch/people-database-search" --header "Authorization: Bearer &amp;lt;APIFY_TOKEN&amp;gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apify"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.apify.com?tools=b2bsearch/linkedin-email-finder,b2bsearch/work-email-finder,b2bsearch/people-database-search"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer &amp;lt;APIFY_TOKEN&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tool names use a double hyphen: &lt;code&gt;b2bsearch--linkedin-email-finder&lt;/code&gt;, &lt;code&gt;b2bsearch--work-email-finder&lt;/code&gt;, &lt;code&gt;b2bsearch--people-database-search&lt;/code&gt;. For a list of profile URLs: dedupe on the handle, run the email finder with &lt;code&gt;profileUrls&lt;/code&gt; and &lt;code&gt;includePersonalEmails: false&lt;/code&gt;, then read rows with &lt;code&gt;get-dataset-items&lt;/code&gt; and a &lt;code&gt;fields&lt;/code&gt; list (&lt;code&gt;_status&lt;/code&gt;, &lt;code&gt;emailType&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;workEmails&lt;/code&gt;, &lt;code&gt;emailCount&lt;/code&gt;, &lt;code&gt;jobTitle&lt;/code&gt;, &lt;code&gt;companyName&lt;/code&gt;, &lt;code&gt;_freshness&lt;/code&gt;, &lt;code&gt;_note&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Rows with &lt;code&gt;_status&lt;/code&gt; other than &lt;code&gt;found&lt;/code&gt; are free: &lt;code&gt;no_email&lt;/code&gt; (a &lt;code&gt;_note&lt;/code&gt; says when a personal mailbox is on record), &lt;code&gt;not_found&lt;/code&gt;, &lt;code&gt;profile_removed&lt;/code&gt;. For &lt;code&gt;work_other&lt;/code&gt; rows, match every entry of &lt;code&gt;workEmails&lt;/code&gt; against the user's company domain first.&lt;/p&gt;

&lt;p&gt;For what is left, run &lt;code&gt;work-email-finder&lt;/code&gt; with &lt;code&gt;lookups&lt;/code&gt; of &lt;code&gt;{ "domain", "full_name" }&lt;/code&gt; and &lt;code&gt;verifyTopCandidate: true&lt;/code&gt;, and read &lt;code&gt;email_validity&lt;/code&gt;. To size a segment before any paid pull, run &lt;code&gt;people-database-search&lt;/code&gt; with &lt;code&gt;mode: "market"&lt;/code&gt; or &lt;code&gt;mode: "count"&lt;/code&gt;. Per-tier pricing is on each Actor page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Earlier posts on the same question
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://dev.to/kevinhall/243-of-417-leads-in-a-typical-icp-box-were-dead-before-the-first-email-epo"&gt;lead list autopsy&lt;/a&gt; counts how many leads in an ordinary ICP box were dead before the first email. The &lt;a href="https://dev.to/kevinhall/5860-fractional-cfos-by-headline-2631-by-title-the-gap-is-the-list-3p88"&gt;fractional CFO post&lt;/a&gt; is where I first saw work addresses that belonged to former employers.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://dev.to/kevinhall/apollo-alternative-in-claude-code-7-lead-lists-from-one-apify-actor-4olo"&gt;Apollo alternative&lt;/a&gt; builds the lists these URLs usually come from, and the &lt;a href="https://dev.to/kevinhall/which-b2b-data-actor-to-run-on-apify-by-the-key-you-already-hold-domains-profile-urls-emails-5g8a"&gt;Actor map by key&lt;/a&gt; says which door to use when you hold domains, emails or names instead of URLs.&lt;/p&gt;

</description>
      <category>sales</category>
      <category>leadgeneration</category>
      <category>ai</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Lusha and ZoomInfo alternative in Claude Code: a call list, four ways</title>
      <dc:creator>Kevin Hall</dc:creator>
      <pubDate>Thu, 29 Oct 2026 08:01:00 +0000</pubDate>
      <link>https://dev.to/kevinhall/lusha-and-zoominfo-alternative-in-claude-code-a-call-list-four-ways-1mod</link>
      <guid>https://dev.to/kevinhall/lusha-and-zoominfo-alternative-in-claude-code-a-call-list-four-ways-1mod</guid>
      <description>&lt;p&gt;Lusha and ZoomInfo sell one column: the mobile number. Everything else on the row you can get in ten other places. And the number is the column that is empty most of the time, whichever logo is on the seat.&lt;/p&gt;

&lt;p&gt;I build outbound lists for a living, and teams that dial ask me the same thing every month. Not "does this vendor have numbers". They ask how many of the people they actually want have one. Nobody can tell them that before the contract is signed.&lt;/p&gt;

&lt;p&gt;So on 2026-10-29 I spent a morning answering it the cheap way. One ideal customer profile, four Apify Actors, free counts before any paid pull, and Claude Code doing the clicking over MCP. Every number below comes from those runs, and the inputs are in the text.&lt;/p&gt;

&lt;p&gt;In one paragraph: a Lusha or ZoomInfo alternative here is one people database behind a few Actors. Count your ICP for free. Then pull leads with the number where one exists, or only the callable ones, or look up numbers for contacts you already hold, or walk named accounts for anyone with a mobile. You pay per row delivered, nothing for the misses.&lt;/p&gt;

&lt;h2&gt;
  
  
  How big is the box, and does it matter where you sell
&lt;/h2&gt;

&lt;p&gt;Before any pull I ran the ICP most call lists are built from through &lt;a href="https://apify.com/b2bsearch/people-database-search" rel="noopener noreferrer"&gt;People Search&lt;/a&gt; in count mode: US sales leaders at software companies with 51 to 500 employees. Count mode charges nothing per row, and &lt;code&gt;segments&lt;/code&gt; compares countries in one call.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"titleKeywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"vp sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"head of sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chief revenue officer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales director"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employerIndustries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Software Development"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employeeCountMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employeeCountMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"segments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"UK"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"gb"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Germany"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"de"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Canada"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ca"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Australia"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"au"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Segment&lt;/th&gt;
&lt;th&gt;People matching&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;United States&lt;/td&gt;
&lt;td&gt;5,377&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;United Kingdom&lt;/td&gt;
&lt;td&gt;1,591&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Germany&lt;/td&gt;
&lt;td&gt;776&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canada&lt;/td&gt;
&lt;td&gt;402&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Australia&lt;/td&gt;
&lt;td&gt;315&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Inside the US box, "sales director" is more than half of the people. "VP Sales" as a literal title is a small slice. Worth knowing before you read anything into a sample of twenty.&lt;/p&gt;

&lt;p&gt;What the free read does not tell you is who has a number. Market mode shows email coverage (about two thirds of this box have a personal address on record) and says nothing about phones. The phone share comes one step later, and that step is cheap: the Actors skip people without a number for free and count them in a note row.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. We need a fresh list, with numbers where they exist
&lt;/h2&gt;

&lt;p&gt;The default case. A list to work by email first, phone when you have it. &lt;a href="https://apify.com/b2bsearch/b2b-leads-finder" rel="noopener noreferrer"&gt;B2B Leads Finder&lt;/a&gt; with &lt;code&gt;includePhones&lt;/code&gt; on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"vp sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"head of sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chief revenue officer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales director"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"industries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Software Development"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emailType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"any"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includePhones"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A free Apify plan delivers up to twenty leads per API run, so I ran it five times and passed the earlier datasets in &lt;code&gt;excludeDatasets&lt;/code&gt; each time. A hundred people at ninety-six companies, no repeats, each run under half a minute.&lt;/p&gt;

&lt;p&gt;Thirty-five of them had a mobile number. That is the honest headline for this ICP: about one in three.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role in the title&lt;/th&gt;
&lt;th&gt;Leads&lt;/th&gt;
&lt;th&gt;With a number&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chief Revenue Officer&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Head of Sales&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sales Director&lt;/td&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VP Sales&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern I keep seeing: the more senior the title, the more often a number is on record. CROs had one about half the time, sales directors one in four. The six VPs had none, which says more about six being a small number than about VPs.&lt;/p&gt;

&lt;p&gt;Two things I expected to matter did not. Records refreshed within the last year carried a number at the same rate as older ones. And a work address and a number came together on a quarter of the list, which is the row a dialling team actually wants.&lt;/p&gt;

&lt;p&gt;Then the same box for the UK and for Germany, twenty leads each. Zero numbers in both. Mobile numbers in this database are a US thing, and I would rather say that here than have you find it on the invoice.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. We only want people we can call
&lt;/h2&gt;

&lt;p&gt;A dialling team does not want the seventy rows without a number. &lt;a href="https://apify.com/b2bsearch/b2b-leads-with-phones" rel="noopener noreferrer"&gt;Leads with Phones&lt;/a&gt; is the same search with &lt;code&gt;phoneRequired&lt;/code&gt; on by default: every row has a verified mobile on record and a live email, the rest are skipped free.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"vp sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"head of sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chief revenue officer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales director"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"industries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Software Development"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emailType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"any"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"phoneRequired"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Twenty people came back in about fifteen seconds, all with numbers. To find them the Actor read 125 matches. Thirty-five had left the role the search matched. Sixty-eight had no number or no live address. Both groups sit in the note rows at the end of the dataset, and neither is on the bill.&lt;/p&gt;

&lt;p&gt;That note row answers the question from the top of the post. For this ICP, about one in six people the search matches is someone you can ring today.&lt;/p&gt;

&lt;p&gt;I ran it once more with the first dataset in &lt;code&gt;excludeDatasets&lt;/code&gt;. Twenty new people, zero repeats. Put that on a weekly timer and the call list grows only with new people.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The CRM has two thousand contacts and no numbers
&lt;/h2&gt;

&lt;p&gt;This is the version I hear most. The list already exists, bought or built years ago, names and companies in a spreadsheet. &lt;a href="https://apify.com/b2bsearch/linkedin-to-phone" rel="noopener noreferrer"&gt;Phone Number Finder&lt;/a&gt; takes exactly that: one line per person as "First Last, company domain", or an email, or a profile URL. Up to twenty thousand lines in one run.&lt;/p&gt;

&lt;p&gt;I fed it twenty marketing leaders from a random sample of a different segment, random so I could not cherry-pick, as name plus domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"profileUrls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Jane Smith, acme.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"...nineteen more lines, one person each"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Five seconds. Nine came back with a number. Ten matched a person at that company who has no number on record, free. One profile was no longer in the database, also free.&lt;/p&gt;

&lt;p&gt;Nine of twenty beats the one in three from the fresh list, and I would not read much into it: marketing leaders, a tiny sample. The shape is the point. You pay for the nine, and the eleven misses cost nothing and each one says why.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. We sell to forty named accounts
&lt;/h2&gt;

&lt;p&gt;Account-based teams have the opposite problem. They know the companies and want everyone there they can call. &lt;a href="https://apify.com/b2bsearch/company-employees" rel="noopener noreferrer"&gt;Company Employees Scraper&lt;/a&gt; walks a list of company domains, and &lt;code&gt;mustHave: ["phone"]&lt;/code&gt; keeps only people with a number.&lt;/p&gt;

&lt;p&gt;I took ten company domains from the first list. Any account list works: your CRM, a &lt;code&gt;company-database-search&lt;/code&gt; run, domains resolved with &lt;code&gt;domain-to-company&lt;/code&gt;. Leadership roles, sales or revenue in the title, contacts tier, compact rows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;ten company domains, one per line&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"cxo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"director"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"titleContains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"revenue"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"profileDetail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"contacts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mustHave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"phone"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compact"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxRows"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nineteen people with a number at nine of the ten companies, eleven seconds. Fifty-three employees in those roles had no number and were skipped free.&lt;/p&gt;

&lt;p&gt;Most of the nineteen were directors, because there are simply more directors with "sales" in the title than there are CROs. If what you want is the one top person per account, run the roster tier first with &lt;code&gt;roles: ["cxo"]&lt;/code&gt;, read it, then pull contacts for the names you picked.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Claude Code did with the same question
&lt;/h2&gt;

&lt;p&gt;I gave Claude Code two of the Actors over MCP and a prompt in plain words: I run a three-person team that works the phone, this is our ICP, run anything free first, keep every paid pull at twenty or fewer, never run the same paid pull twice. Shell and file tools were switched off, so the Apify tools were all it had.&lt;/p&gt;

&lt;p&gt;It did the free reads first, as told. Then it did something I had not asked for: it expanded my four titles into ten spellings ("vp of sales", "vice president sales", "director of sales", "cro"). The box roughly doubled, to about ten thousand people. The right call for a call list, and the reason its count does not match mine above.&lt;/p&gt;

&lt;p&gt;It tried to get the phone share for free by running count mode with a phone requirement. Count mode ignores that requirement, and the agent said so instead of inventing a number. Then it ran one paid pull, with its own title list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"vp sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp of sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp, sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vice president sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vice president of sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"head of sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chief revenue officer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales director"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"director of sales"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"industries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Software Development"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companySizeMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"phoneRequired"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emailType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"any"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxPerCompany"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Twenty rows, all with numbers, from 111 matches read. Fourteen had a work address at the current employer, six only a personal one.&lt;/p&gt;

&lt;p&gt;Its read of the rows was the useful part. Three of the twenty were pre-sales or operations: a technical sales director, a director of sales operations, a VP of sales engineering. "Sales director" as a substring brings them in. It proposed an &lt;code&gt;excludeJobTitles&lt;/code&gt; list for the next run and reusing the dataset in &lt;code&gt;excludeDatasets&lt;/code&gt;. Both are the right next move.&lt;/p&gt;

&lt;p&gt;It also read the rows with a &lt;code&gt;fields&lt;/code&gt; list instead of pulling whole records, which nobody told it to do. Twelve turns, under six minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you dial
&lt;/h2&gt;

&lt;p&gt;Everything above is a number on record, not a number that rings. Nobody dialled anything for this post. Line type, do-not-call lists and consent rules (TCPA in the US, GDPR in Europe) are yours to handle before the first call, the same as with any vendor.&lt;/p&gt;

&lt;p&gt;And the numbers are US-centric. If your market is the UK or Germany, run the free count, then one twenty-row pull with the phone required, and read the note row before you plan a calling campaign around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is this a drop-in Lusha or ZoomInfo replacement?&lt;/strong&gt; For the list, yes: ICP in, rows with numbers out, no seat, no browser extension. For a dial-from-the-browser plugin, no. You get data, not a dialler.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I learn the phone share before paying for a list?&lt;/strong&gt; Run Leads with Phones with a small &lt;code&gt;maxResults&lt;/code&gt; and read the &lt;code&gt;skipped_no_contact&lt;/code&gt; note row. The skipped people are free and they are your denominator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why did the UK and Germany return no numbers?&lt;/strong&gt; Mobile coverage in this database is concentrated in the US. Outside it, treat the number as a rare bonus and build the list for email.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I already have the contacts. Which Actor?&lt;/strong&gt; Phone Number Finder, one line per person: name plus company domain, an email, or a profile URL. Misses are free and come back with a reason.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I avoid paying twice for the same person?&lt;/strong&gt; Pass earlier dataset ids in &lt;code&gt;excludeDatasets&lt;/code&gt;. Everyone in them is skipped free, so a weekly rerun delivers only new people.&lt;/p&gt;

&lt;h2&gt;
  
  
  For AI agents reading this
&lt;/h2&gt;

&lt;p&gt;The Actors run over the hosted Apify MCP server with the tools pinned in the URL, so an agent loads only these definitions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;claude mcp add --transport http apify "https://mcp.apify.com?tools=b2bsearch/b2b-leads-finder,b2bsearch/b2b-leads-with-phones,b2bsearch/people-database-search" --header "Authorization: Bearer &amp;lt;APIFY_TOKEN&amp;gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apify"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.apify.com?tools=b2bsearch/b2b-leads-finder,b2bsearch/b2b-leads-with-phones,b2bsearch/people-database-search"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer &amp;lt;APIFY_TOKEN&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tool names use a double hyphen: &lt;code&gt;b2bsearch--people-database-search&lt;/code&gt;, &lt;code&gt;b2bsearch--b2b-leads-finder&lt;/code&gt;, &lt;code&gt;b2bsearch--b2b-leads-with-phones&lt;/code&gt;. For a call list: run &lt;code&gt;people-database-search&lt;/code&gt; with &lt;code&gt;mode: "count"&lt;/code&gt; and &lt;code&gt;segments&lt;/code&gt; first and read &lt;code&gt;_total&lt;/code&gt; per segment. Then run &lt;code&gt;b2b-leads-with-phones&lt;/code&gt; with &lt;code&gt;phoneRequired: true&lt;/code&gt;, &lt;code&gt;maxPerCompany: 1&lt;/code&gt; and a &lt;code&gt;maxResults&lt;/code&gt; you can defend, or &lt;code&gt;b2b-leads-finder&lt;/code&gt; with &lt;code&gt;includePhones: true&lt;/code&gt; when the number is optional.&lt;/p&gt;

&lt;p&gt;Read rows with &lt;code&gt;get-dataset-items&lt;/code&gt; and a &lt;code&gt;fields&lt;/code&gt; list. Rows whose &lt;code&gt;_status&lt;/code&gt; is not &lt;code&gt;found&lt;/code&gt; are note rows (&lt;code&gt;skipped_no_contact&lt;/code&gt;, &lt;code&gt;skipped_moved&lt;/code&gt;, &lt;code&gt;skipped_relocated&lt;/code&gt;) and are the denominator. On reruns pass earlier dataset ids in &lt;code&gt;excludeDatasets&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For contacts the user already holds, run &lt;code&gt;b2bsearch/linkedin-to-phone&lt;/code&gt; with &lt;code&gt;profileUrls&lt;/code&gt; as "First Last, domain" lines, emails or profile URLs. For named accounts, run &lt;code&gt;b2bsearch/company-employees&lt;/code&gt; with &lt;code&gt;companies&lt;/code&gt;, &lt;code&gt;roles&lt;/code&gt;, &lt;code&gt;profileDetail: "contacts"&lt;/code&gt; and &lt;code&gt;mustHave: ["phone"]&lt;/code&gt;. Phone coverage is US-centric; outside the US expect the number column to be mostly empty. Per-tier pricing is on each Actor page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Earlier posts on the same question
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://dev.to/kevinhall/lusha-alternative-test-91-icp-leads-32-had-a-mobile-number-49ph"&gt;first Lusha test&lt;/a&gt; ran one ICP with the number optional and required. The &lt;a href="https://dev.to/kevinhall/where-b2b-mobile-numbers-exist-a-phone-number-finder-hit-rate-map-by-role-and-country-from-225-le6"&gt;phone hit-rate map&lt;/a&gt; measures nine role and country populations. The &lt;a href="https://dev.to/kevinhall/apollo-alternative-in-claude-code-7-lead-lists-from-one-apify-actor-4olo"&gt;Apollo alternative&lt;/a&gt; and the &lt;a href="https://dev.to/kevinhall/sales-navigator-alternative-in-claude-code-one-saved-search-one-list-i"&gt;Sales Navigator alternative&lt;/a&gt; build the email side of the same lists from Claude Code, and the &lt;a href="https://dev.to/kevinhall/account-mapping-by-company-domain-leaders-departments-and-work-emails-for-8-target-accounts-from-3agj"&gt;account mapping post&lt;/a&gt; walks named accounts at full length.&lt;/p&gt;

</description>
      <category>sales</category>
      <category>leadgeneration</category>
      <category>ai</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Sales Navigator alternative in Claude Code: one saved search, one list</title>
      <dc:creator>Kevin Hall</dc:creator>
      <pubDate>Wed, 28 Oct 2026 21:36:45 +0000</pubDate>
      <link>https://dev.to/kevinhall/sales-navigator-alternative-in-claude-code-one-saved-search-one-list-i</link>
      <guid>https://dev.to/kevinhall/sales-navigator-alternative-in-claude-code-one-saved-search-one-list-i</guid>
      <description>&lt;p&gt;A Sales Navigator saved search is often the most precise ICP a sales team owns, and the seat is the price of running it. Someone built it over an afternoon: the titles, the geography, the headcount bands, the companies to leave out. Everyone else needs a seat to see the results, and getting the people out means an export by hand or a browser extension that runs on the account's cookies and breaks when the page changes.&lt;/p&gt;

&lt;p&gt;On 2026-10-28 I took three searches a sales team actually runs, copied their URLs, and turned each one into a list from Claude Code with one Apify Actor, &lt;a href="https://apify.com/b2bsearch/sales-navigator-search" rel="noopener noreferrer"&gt;Sales Navigator Search Scraper&lt;/a&gt;. The Actor never opens the URL. It reads the filters encoded in it and runs the same query on a database of professional records, so there is no login, no cookie and no seat involved, and a free count sizes the search before a row is charged. Every number below comes from that day's runs, each capped at 20 rows because I ran them on a free Apify plan. The rows shown carry no names, no addresses and no employer names. Sales Navigator is a trademark of its owner; this Actor is not affiliated with it. Per-tier pricing is on the Actor page.&lt;/p&gt;

&lt;p&gt;In one paragraph: a Sales Navigator alternative here means building the search in the tool you already know, copying the results-page URL, and letting an Actor read the filters (current company, current title, region, industry, headcount, keywords) and run them on its own people database. You get a count for free, rows paid per person delivered, a weekly rerun that returns only new people, and an agent that can do all of it over MCP.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Sales Navigator URL carries
&lt;/h2&gt;

&lt;p&gt;Copy the address from the browser bar while the results are open. The &lt;code&gt;query&lt;/code&gt; parameter is a Rest.li structure, percent-encoded twice. Decoded, my first search reads:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;filters: List(
  (type: CURRENT_TITLE,     values: List((text: VP Sales, selectionType: INCLUDED),
                                          (text: Head of Sales, selectionType: INCLUDED))),
  (type: REGION,            values: List((id: 103644278, text: United States, selectionType: INCLUDED))),
  (type: COMPANY_HEADCOUNT, values: List((id: D, text: 51-200), (id: E, text: 201-500))),
  (type: INDUSTRY,          values: List((id: 4, text: Software Development)))
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Actor maps each filter to a field of its people search and echoes what it ran in &lt;code&gt;_input&lt;/code&gt; on every row, so the first thing to read after a run is the search it actually executed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"location_country_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title_contains_any"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"vp sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"head of sales"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employer_industry_ids"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employee_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"min"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"max"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sales Navigator filter&lt;/th&gt;
&lt;th&gt;Read as&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Current company&lt;/td&gt;
&lt;td&gt;the companies picked from the suggestions, by their id; excluded companies too&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Current job title&lt;/td&gt;
&lt;td&gt;text inside the current title; excluded titles are excluded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Geography&lt;/td&gt;
&lt;td&gt;a country, a "City, State, Country" place, or a metro area as written on the profile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Industry&lt;/td&gt;
&lt;td&gt;the employer's industry, by the same id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Company headcount&lt;/td&gt;
&lt;td&gt;one range of adjacent bands (51-200 plus 201-500 reads as 51-500)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keywords&lt;/td&gt;
&lt;td&gt;plain words, matched in the headline&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Everything else stops the run before anything is charged, and the status line names it. I pasted the first search with a seniority filter added, verbatim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Not run, nothing charged. These Sales Navigator filters cannot be read yet: seniority level. Remove them from the search, copy the URL again and rerun.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same happens for function, past company, school, years in role, the spotlights (changed jobs, posted recently), first and last names, groups, Boolean keyword strings, continents, and a company typed as text instead of picked from the list. A saved-search link (&lt;code&gt;savedSearchId=&lt;/code&gt;) is refused too, because it carries no filters: open the saved search and copy the address of its results page. A refusal costs nothing. A dropped filter would sell you people you excluded, so nothing is dropped quietly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three saved searches, measured on 2026-10-28
&lt;/h2&gt;

&lt;p&gt;Each count is one run with &lt;code&gt;mode: "count"&lt;/code&gt;: no row is charged, &lt;code&gt;_total&lt;/code&gt; holds the number, and &lt;code&gt;_input&lt;/code&gt; holds the filters as read.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Search&lt;/th&gt;
&lt;th&gt;Filters in the sidebar&lt;/th&gt;
&lt;th&gt;People matched&lt;/th&gt;
&lt;th&gt;Count took&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;New logo&lt;/td&gt;
&lt;td&gt;VP Sales or Head of Sales; United States; 51-500 employees; Software Development&lt;/td&gt;
&lt;td&gt;1,175&lt;/td&gt;
&lt;td&gt;9 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Territory&lt;/td&gt;
&lt;td&gt;Head, VP or Director of Sales; Austin, Texas; 11-500 employees&lt;/td&gt;
&lt;td&gt;946&lt;/td&gt;
&lt;td&gt;5 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Account list&lt;/td&gt;
&lt;td&gt;Engineering Manager; United Kingdom; eight companies picked by id&lt;/td&gt;
&lt;td&gt;419&lt;/td&gt;
&lt;td&gt;7 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  1. New logo: the ICP box
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;mode: "people"&lt;/code&gt;, &lt;code&gt;maxResults: 20&lt;/code&gt;, &lt;code&gt;maxPerCompany: 1&lt;/code&gt;, &lt;code&gt;profileDetail: "row"&lt;/code&gt;. 7.5 seconds, 20 delivered, no note rows.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;Company size&lt;/th&gt;
&lt;th&gt;Industry&lt;/th&gt;
&lt;th&gt;Country&lt;/th&gt;
&lt;th&gt;Email on record&lt;/th&gt;
&lt;th&gt;Freshness&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Head of Sales&lt;/td&gt;
&lt;td&gt;148&lt;/td&gt;
&lt;td&gt;Software Development&lt;/td&gt;
&lt;td&gt;us&lt;/td&gt;
&lt;td&gt;work, personal&lt;/td&gt;
&lt;td&gt;updated_1y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VP Sales Engineering&lt;/td&gt;
&lt;td&gt;138&lt;/td&gt;
&lt;td&gt;Software Development&lt;/td&gt;
&lt;td&gt;us&lt;/td&gt;
&lt;td&gt;work, personal&lt;/td&gt;
&lt;td&gt;updated_1y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Head of Sales Americas&lt;/td&gt;
&lt;td&gt;424&lt;/td&gt;
&lt;td&gt;Software Development&lt;/td&gt;
&lt;td&gt;us&lt;/td&gt;
&lt;td&gt;work, personal&lt;/td&gt;
&lt;td&gt;older&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global Head of Sales&lt;/td&gt;
&lt;td&gt;237&lt;/td&gt;
&lt;td&gt;Computer Games&lt;/td&gt;
&lt;td&gt;us&lt;/td&gt;
&lt;td&gt;work, personal&lt;/td&gt;
&lt;td&gt;older&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Head of Sales and Marketing&lt;/td&gt;
&lt;td&gt;197&lt;/td&gt;
&lt;td&gt;Software Development&lt;/td&gt;
&lt;td&gt;us&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;older&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All 20 titles hold "VP Sales" or "Head of Sales", all 20 employers have 59 to 424 people, all 20 people are in the US. 17 of 20 carry a work address on record, 14 a personal one, 3 neither; 8 rows are &lt;code&gt;updated_1y&lt;/code&gt;, 12 &lt;code&gt;older&lt;/code&gt;. Three rows carry an industry label other than Software Development (two Computer Games, one IT Services): the filter matched the employer record's industry id, the label on the row is the employer's industry text, and the two fields can disagree. Six of the 20 list more than one current position, which is where the review line below starts.&lt;/p&gt;

&lt;p&gt;The exclusion trick from the &lt;a href="https://dev.to/kevinhall/sales-navigator-search-export-without-cookies-or-a-login-paste-the-url-get-the-people-from-a-b2b-4742"&gt;first Sales Navigator post&lt;/a&gt; still holds: "Investing" and "Partner" added as excluded titles in the sidebar take the count from 1,175 to 1,124, and the exclusion arrives as &lt;code&gt;title_not_contains_any&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Territory: metro area or city, and why it matters
&lt;/h3&gt;

&lt;p&gt;The second search is a territory: Head, VP or Director of Sales at 11-500-person companies in Austin. Sales Navigator offers "Austin, Texas Metropolitan Area" and "Austin, Texas, United States" as two geography values, and here they are not the same search:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Geography value&lt;/th&gt;
&lt;th&gt;Read as&lt;/th&gt;
&lt;th&gt;People&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Austin, Texas Metropolitan Area&lt;/td&gt;
&lt;td&gt;&lt;code&gt;locality_contains_any: ["austin, texas metropolitan area"]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;203&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Austin, Texas, United States&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;location_country_code: ["us"]&lt;/code&gt; plus &lt;code&gt;locality_contains_any: ["austin, texas"]&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;946&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A metro area matches the location as people wrote it on their profile, and most wrote the city. Pick the city, or the country for full coverage. The 20-row pull on the metro version took 6 seconds: all 20 locations are the metro area as written, all 20 titles hold one of the three phrases, employers from 11 to 362 people, 8 of them in software development and the other 12 spread over construction, manufacturing, finance, accounting, retail, logistics and health care, because this search had no industry filter. 17 work addresses on record, 10 personal, 3 neither. Only 4 rows are &lt;code&gt;updated_1y&lt;/code&gt; and 16 &lt;code&gt;older&lt;/code&gt;: a small-company territory ages faster than the software box.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Account list: picked companies, by id
&lt;/h3&gt;

&lt;p&gt;Sales Navigator's account list is the "current company" filter with companies picked from the suggestions, and the URL carries each one's id. I built this search by hand, eight companies and "Engineering Manager" in the United Kingdom, and learned two things. A company written as text is refused by name, because the Actor reads ids only: a name typed as text could match a namesake. And two of my eight ids matched nobody; a free count on each company alone returned 0 for those two and 17,734 people for one of the six that resolved. The sidebar writes the id for you; a hand-built URL is yours to check, and the count on one company is the check.&lt;/p&gt;

&lt;p&gt;419 people matched the six companies that resolved. With &lt;code&gt;maxPerCompany: 3&lt;/code&gt; the pull delivered 18 in 58 seconds, 3 at each of the six, and one note row: 240 people were over the limit of 3 per company and were skipped, not delivered, not charged. Employee counts on these rows are the companies' global headcount, 17,285 to 785,236. 15 of 18 carry a work address on record, 9 a personal one; 11 rows &lt;code&gt;updated_1y&lt;/code&gt;, 7 &lt;code&gt;older&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The domain route to an account list, &lt;a href="https://apify.com/b2bsearch/domain-to-company" rel="noopener noreferrer"&gt;Domain to Company&lt;/a&gt; plus &lt;code&gt;companyDomains&lt;/code&gt; on &lt;a href="https://apify.com/b2bsearch/b2b-leads-finder" rel="noopener noreferrer"&gt;B2B Leads Finder&lt;/a&gt;, is in the &lt;a href="https://dev.to/kevinhall/apollo-alternative-in-claude-code-7-lead-lists-from-one-apify-actor-4olo"&gt;Apollo alternative post&lt;/a&gt;; it takes the accounts as website domains and skips the id question.&lt;/p&gt;

&lt;h2&gt;
  
  
  Emails: the row tier says "on record", the contacts tier delivers
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;hasWorkEmail&lt;/code&gt; and &lt;code&gt;hasPersonalEmail&lt;/code&gt; on a search row are flags: an address is on record. &lt;code&gt;profileDetail: "contacts"&lt;/code&gt; reads the full profile and delivers only an address judged to reach the person today. The first search in the contacts tier, 20 people, one per company, 9 seconds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;20 delivered: 10 with a work address at the current employer, 5 with a personal address, 5 with no reachable address, shipped as a full profile at the profile price.&lt;/li&gt;
&lt;li&gt;9 people skipped as &lt;code&gt;skipped_moved&lt;/code&gt;: their full profile closes the position the search matched. The row tier delivered the same search with zero note rows, because a search row is the record as matched; the profile tiers do the move check for you, and 9 of the 29 people read had moved.&lt;/li&gt;
&lt;li&gt;2 of 20 with a phone number on record.&lt;/li&gt;
&lt;li&gt;Of the 15 addresses, 7 sit on the row's company domain. The other 8 are 5 personal addresses and three "work" addresses on another domain: two are a rebrand or an acquisition, the old and the new domain of one business, and one is at a different company. The address domain against the company domain is the cheapest bounce check there is, one column against another.&lt;/li&gt;
&lt;li&gt;4 of 20 list another current job ahead of the matched one (&lt;code&gt;primaryTitle&lt;/code&gt; differs from &lt;code&gt;jobTitle&lt;/code&gt;), and 1 of 20 no longer lists the matched employer at all (&lt;code&gt;_employerUnconfirmed: true&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same box typed by hand into B2B Leads Finder with &lt;code&gt;emailType: "work"&lt;/code&gt;, 20 leads, one per company, 15 seconds: 20 delivered from 59 read, 24 skipped because no work address at the current employer was on record, 15 skipped as moved. 16 of the 20 addresses sit on the row's company domain. Five of these 20 people are in the URL run's 20 and nine in the contacts run's 20: a search that requires a live work address walks a different head of the same 1,175.&lt;/p&gt;

&lt;h2&gt;
  
  
  The weekly rerun: new people only
&lt;/h2&gt;

&lt;p&gt;A saved-search alert needs the seat to remember what it already showed you. Here the memory is the dataset: &lt;code&gt;excludeDatasets&lt;/code&gt; takes the ids of earlier runs, and everyone in them is skipped and never charged again. The first search once more, with the dataset of the first pull excluded:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"salesNavigatorUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;the same URL, unchanged&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"people"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxPerCompany"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"profileDetail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"row"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"excludeDatasets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;dataset id of the first run&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2 seconds, 20 delivered, 0 of them in the first run, checked by &lt;code&gt;personId&lt;/code&gt;. Run it on a schedule, feed each run's dataset into the next run's exclusion list, and the same URL returns only the people new to the search. That is the alert without the seat, and the cost is only the new rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same search from Claude Code over MCP
&lt;/h2&gt;

&lt;p&gt;Apify runs an MCP server at &lt;code&gt;https://mcp.apify.com&lt;/code&gt;; the &lt;code&gt;tools&lt;/code&gt; parameter pins the Actors a session may reach. In Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http apify &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://mcp.apify.com?tools=b2bsearch/sales-navigator-search,b2bsearch/b2b-leads-finder"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any other MCP client takes the same URL in its server config, with OAuth on first connect or an &lt;code&gt;Authorization: Bearer &amp;lt;APIFY_TOKEN&amp;gt;&lt;/code&gt; header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apify"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.apify.com?tools=b2bsearch/sales-navigator-search,b2bsearch/b2b-leads-finder"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Actors appear as tools named &lt;code&gt;b2bsearch--sales-navigator-search&lt;/code&gt; and &lt;code&gt;b2bsearch--b2b-leads-finder&lt;/code&gt; (the slash becomes a double hyphen); the server adds &lt;code&gt;get-dataset-items&lt;/code&gt;, &lt;code&gt;get-actor-run&lt;/code&gt; and two more helpers next to them. A tool call returns the run and its dataset id; the rows come from &lt;code&gt;get-dataset-items&lt;/code&gt;. What a pinned Actor costs an agent in tokens before the first call is measured in the &lt;a href="https://dev.to/kevinhall/mcp-tool-cost-20-job-actors-on-apify-21k-to-327k-tokens-each-1hm4"&gt;MCP tool cost post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I gave Claude Code the first search's URL and this brief: count first and name the filters you read; if the count is under 5,000, pull up to 20 people, one per company, search rows only; then run it again with the first run's dataset excluded and report the overlap by &lt;code&gt;personId&lt;/code&gt;; never print names, profile URLs, company names or addresses. The session had this one Actor pinned and no shell or file tools. Seven tool calls, 130 seconds:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;ToolSearch&lt;/code&gt;: loaded the three tool definitions it needed, the Actor, &lt;code&gt;get-dataset-items&lt;/code&gt; and &lt;code&gt;get-actor-run&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The Actor with &lt;code&gt;mode: "count"&lt;/code&gt;, then &lt;code&gt;get-dataset-items&lt;/code&gt; with &lt;code&gt;limit: 5&lt;/code&gt; to read &lt;code&gt;_total&lt;/code&gt; (1,175) and the echoed filters.&lt;/li&gt;
&lt;li&gt;The Actor with &lt;code&gt;mode: "people"&lt;/code&gt;, &lt;code&gt;profileDetail: "row"&lt;/code&gt;, &lt;code&gt;maxResults: 20&lt;/code&gt;, &lt;code&gt;maxPerCompany: 1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get-dataset-items&lt;/code&gt; with &lt;code&gt;fields: "personId,_status,_freshness,jobTitle,companyEmployeeCount,companyIndustry,countryCode,hasWorkEmail,_note,_error"&lt;/code&gt;, in parallel with the rerun carrying &lt;code&gt;excludeDatasets: ["&amp;lt;first dataset&amp;gt;"]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get-dataset-items&lt;/code&gt; on the second dataset, four fields only.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Its report: 1,175 matched; 20 and 20 delivered; overlap by &lt;code&gt;personId&lt;/code&gt; 0; 17 and 18 rows with a work address on record; 8 and 10 rows refreshed within the year; no note rows. Two things it flagged on its own, both right: three of 20 rows carry an industry label other than the one filtered, and the title filter reads as "contains", so "VP Sales Engineering" and "Head of Sales Strategy and Operations" came through, which it summed up as "expect a somewhat broader list than the seat gives you". Two things worth putting in every prompt: it asked for columns, not rows, which kept each dataset read to a few hundred tokens; and it started the rerun before it had read the first run's rows, which is fine at 20 and wrong at 2,000, so say "read the first run before you start the second".&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not replace
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A live network. The data is a database of records, refreshed in waves; &lt;code&gt;_freshness&lt;/code&gt; on every row says &lt;code&gt;updated_1y&lt;/code&gt; or &lt;code&gt;older&lt;/code&gt;, and the totals will not equal the number Sales Navigator shows for the same search. No activity, no intent, no "posted this week"; the spotlight filters are refused for that reason.&lt;/li&gt;
&lt;li&gt;Exact matching. Titles match as text inside the current title, keywords match the headline only, a metro area matches the location as written. Expect a broader title list and a narrower keyword list than the seat gives, never other people.&lt;/li&gt;
&lt;li&gt;The review line. Six of 20 people in the first search list more than one current position, 9 of 29 read by the contacts tier had moved, and 3 of 15 work addresses sit on another domain. The evidence is on the row (&lt;code&gt;currentPositions&lt;/code&gt;, &lt;code&gt;_freshness&lt;/code&gt;, &lt;code&gt;emailType&lt;/code&gt;, the address domain against &lt;code&gt;companyDomain&lt;/code&gt;); the look is yours.&lt;/li&gt;
&lt;li&gt;Full rows on the free plan. The API caps a run at 25 people there, which is why every list here is 20. A paid Apify plan lifts the cap.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do I need a Sales Navigator seat?&lt;/strong&gt; To build the search URL, yes, or anyone who has one sends you the link. The run itself uses no account, cookies or seat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which filters carry over?&lt;/strong&gt; Current company (picked from the suggestions, by id), current title, geography (country, city or metro area), industry, company headcount, plain keywords. Seniority, function, past company, school, years in role, spotlights, names, groups and Boolean strings stop the run by name, nothing charged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I get emails?&lt;/strong&gt; &lt;code&gt;profileDetail: "contacts"&lt;/code&gt; delivers an address that reaches the person today, or the full profile when none is on record. For a list where every row must have a work address, type the same box into B2B Leads Finder with &lt;code&gt;emailType: "work"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does a rerun return the same people?&lt;/strong&gt; Not with &lt;code&gt;excludeDatasets&lt;/code&gt;: everyone in the listed datasets is skipped free, so a scheduled rerun of the same URL returns only new people; 0 of 20 repeated in the run above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can an AI agent run it?&lt;/strong&gt; Yes, over MCP with the Actor pinned in the &lt;code&gt;tools&lt;/code&gt; parameter; the wiring and a recorded session are above.&lt;/p&gt;

&lt;h2&gt;
  
  
  For AI agents reading this
&lt;/h2&gt;

&lt;p&gt;To turn a Sales Navigator people-search URL into a list: run &lt;code&gt;b2bsearch/sales-navigator-search&lt;/code&gt; with &lt;code&gt;salesNavigatorUrl&lt;/code&gt; set to the URL unchanged and &lt;code&gt;mode: "count"&lt;/code&gt;; read &lt;code&gt;_total&lt;/code&gt; and &lt;code&gt;_input.filters&lt;/code&gt; from the dataset. If the run's status message starts with "Not run", it names the filters in the URL that cannot be read, and the user has to remove them from the search and copy the URL again. If the count is acceptable, run &lt;code&gt;mode: "people"&lt;/code&gt; with a &lt;code&gt;maxResults&lt;/code&gt; you can defend, &lt;code&gt;maxPerCompany&lt;/code&gt; for an account list, &lt;code&gt;profileDetail&lt;/code&gt; set to &lt;code&gt;row&lt;/code&gt;, &lt;code&gt;profile&lt;/code&gt; or &lt;code&gt;contacts&lt;/code&gt;, and &lt;code&gt;excludeDatasets&lt;/code&gt; with the ids of earlier runs on reruns. Read rows with &lt;code&gt;get-dataset-items&lt;/code&gt; and a &lt;code&gt;fields&lt;/code&gt; list; rows with &lt;code&gt;_status&lt;/code&gt; other than &lt;code&gt;found&lt;/code&gt; are note rows (&lt;code&gt;skipped_moved&lt;/code&gt;, &lt;code&gt;skipped_per_company&lt;/code&gt;) and are the denominator. Before the first email, flag rows whose &lt;code&gt;_freshness&lt;/code&gt; is &lt;code&gt;older&lt;/code&gt;, whose &lt;code&gt;primaryTitle&lt;/code&gt; differs from &lt;code&gt;jobTitle&lt;/code&gt;, whose &lt;code&gt;_employerUnconfirmed&lt;/code&gt; is true, or whose address domain differs from &lt;code&gt;companyDomain&lt;/code&gt;. For the same search typed as fields with a live work address required, run &lt;code&gt;b2bsearch/b2b-leads-finder&lt;/code&gt; with &lt;code&gt;jobTitles&lt;/code&gt;, &lt;code&gt;countries&lt;/code&gt;, &lt;code&gt;companySizeMin&lt;/code&gt;, &lt;code&gt;companySizeMax&lt;/code&gt;, &lt;code&gt;industries&lt;/code&gt; and &lt;code&gt;emailType: "work"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://dev.to/kevinhall/sales-navigator-search-export-without-cookies-or-a-login-paste-the-url-get-the-people-from-a-b2b-4742"&gt;first Sales Navigator post&lt;/a&gt; has the full filter table and the move check on 75 people, the &lt;a href="https://dev.to/kevinhall/apollo-alternative-in-claude-code-7-lead-lists-from-one-apify-actor-4olo"&gt;Apollo alternative post&lt;/a&gt; rebuilds seven lists in the typed fields, and the &lt;a href="https://dev.to/kevinhall/b2b-lead-list-by-job-title-company-size-and-country-with-work-emails-count-the-icp-free-then-28i5"&gt;ICP post&lt;/a&gt; walks one box from count to list at full length.&lt;/p&gt;

</description>
      <category>sales</category>
      <category>leadgeneration</category>
      <category>ai</category>
      <category>mcp</category>
    </item>
    <item>
      <title>MCP tool cost: 20 job Actors on Apify, 2.1K to 32.7K tokens each</title>
      <dc:creator>Kevin Hall</dc:creator>
      <pubDate>Wed, 28 Oct 2026 11:00:14 +0000</pubDate>
      <link>https://dev.to/kevinhall/mcp-tool-cost-20-job-actors-on-apify-21k-to-327k-tokens-each-1hm4</link>
      <guid>https://dev.to/kevinhall/mcp-tool-cost-20-job-actors-on-apify-21k-to-327k-tokens-each-1hm4</guid>
      <description>&lt;p&gt;Here is what an agent pays before it asks a job-search tool anything. I pinned 20 job-search Actors from the Apify Store, one at a time, on the hosted Apify MCP server and read what &lt;code&gt;tools/list&lt;/code&gt; sends back. The smallest tool definition was 2,139 tokens. The median was 3,829. One was 32,737, and 32,136 of those tokens were an output schema the server had inferred from the Actor's results; the author's own input schema was 406 tokens.&lt;/p&gt;

&lt;p&gt;Three of the twenty are mine, so this is also a check on my own work. The numbers are from 28 October 2026, and the method is a curl handshake you can rerun on any Actor in a minute.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the tool definition is the first cost
&lt;/h2&gt;

&lt;p&gt;An MCP client loads every tool's name, description and JSON schema before the model reads your question. On the hosted Apify server each Actor becomes one tool, and the tool carries three parts: the description (the Actor's Store description after a one-line preamble), the input schema (the Actor's input fields, as the author wrote them), and an output schema that the server infers from what the Actor's runs return (&lt;a href="https://docs.apify.com/platform/integrations/mcp" rel="noopener noreferrer"&gt;documented here&lt;/a&gt;; the local stdio server does not add it). The third part is the one most Actor authors have never looked at, because they never wrote it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/aws-builders/mcp-token-cost-i-cut-my-mcp-server-from-15-tools-to-4-cek"&gt;A post two days ago&lt;/a&gt; measured a hand-built server at 15 tools and rebuilt it to 4. I wanted the same number for tools I did not build and cannot rebuild: the Actors an agent meets when a user says "find me backend jobs in Germany".&lt;/p&gt;

&lt;h2&gt;
  
  
  How I measured
&lt;/h2&gt;

&lt;p&gt;Hosted server, one Actor pinned per session with &lt;code&gt;?tools=&lt;/code&gt;, then the plain &lt;code&gt;tools/list&lt;/code&gt; after the initialize handshake:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;U&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'https://mcp.apify.com?tools=curious_coder/linkedin-jobs-scraper'&lt;/span&gt;
&lt;span class="nv"&gt;H&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Accept: application/json, text/event-stream'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# 1. initialize; the session id comes back as a response header&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; hdr &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$U&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;H&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}'&lt;/span&gt;
&lt;span class="nv"&gt;SID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'^mcp-session-id'&lt;/span&gt; hdr | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'\r'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# 2. initialized notification, 3. the list (server-sent events; the data: line holds the JSON-RPC result)&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$U&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;H&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Mcp-Session-Id: &lt;/span&gt;&lt;span class="nv"&gt;$SID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"notifications/initialized"}'&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$U&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;H&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Mcp-Session-Id: &lt;/span&gt;&lt;span class="nv"&gt;$SID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; tools.sse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I serialized each tool definition as compact JSON and counted tokens with tiktoken's &lt;code&gt;o200k_base&lt;/code&gt;. Claude's tokenizer is not public, so treat the counts as a scale, not an invoice. The relative sizes are the point, and those do not depend on the tokenizer.&lt;/p&gt;

&lt;p&gt;The twenty are the Actors the Store returns for "linkedin jobs", "job search", "job postings", "indeed jobs" and "glassdoor jobs", ranked by users in the last 30 days, plus my three (they are new and would not have made the cut on users).&lt;/p&gt;

&lt;h2&gt;
  
  
  The table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Actor&lt;/th&gt;
&lt;th&gt;tokens per tool&lt;/th&gt;
&lt;th&gt;description&lt;/th&gt;
&lt;th&gt;input schema&lt;/th&gt;
&lt;th&gt;output schema&lt;/th&gt;
&lt;th&gt;input fields&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;valig/indeed-jobs-scraper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;32,737&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;406&lt;/td&gt;
&lt;td&gt;32,136&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cheap_scraper/linkedin-job-scraper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7,723&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;6,061&lt;/td&gt;
&lt;td&gt;1,440&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bebity/linkedin-jobs-scraper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;6,769&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;5,029&lt;/td&gt;
&lt;td&gt;1,551&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fantastic-jobs/advanced-linkedin-job-search-api&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;6,569&lt;/td&gt;
&lt;td&gt;86&lt;/td&gt;
&lt;td&gt;4,312&lt;/td&gt;
&lt;td&gt;2,018&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fantastic-jobs/career-site-job-listing-api&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;6,324&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;td&gt;4,083&lt;/td&gt;
&lt;td&gt;1,999&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;b2bsearch/linkedin-job-search-api (mine)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5,770&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;td&gt;3,410&lt;/td&gt;
&lt;td&gt;2,123&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;b2bsearch/linkedin-jobs-scraper (mine)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4,389&lt;/td&gt;
&lt;td&gt;107&lt;/td&gt;
&lt;td&gt;2,403&lt;/td&gt;
&lt;td&gt;1,729&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agentx/all-jobs-scraper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4,041&lt;/td&gt;
&lt;td&gt;69&lt;/td&gt;
&lt;td&gt;2,060&lt;/td&gt;
&lt;td&gt;1,780&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;epctex/google-jobs-scraper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3,981&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;2,708&lt;/td&gt;
&lt;td&gt;1,068&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;harvestapi/linkedin-job-search&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3,911&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;1,492&lt;/td&gt;
&lt;td&gt;2,217&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;openclawai/job-board-scraper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3,748&lt;/td&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;2,054&lt;/td&gt;
&lt;td&gt;1,461&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;borderline/indeed-scraper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3,416&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;1,096&lt;/td&gt;
&lt;td&gt;2,094&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;curious_coder/linkedin-jobs-scraper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3,343&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;1,711&lt;/td&gt;
&lt;td&gt;1,444&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;b2bsearch/hiring-companies-finder (mine)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3,303&lt;/td&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;1,329&lt;/td&gt;
&lt;td&gt;1,723&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fast_data_asap/career-site-jobs-api&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3,235&lt;/td&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;td&gt;1,777&lt;/td&gt;
&lt;td&gt;1,277&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fast_data_asap/job-search-api&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2,562&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;td&gt;1,108&lt;/td&gt;
&lt;td&gt;1,291&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;misceres/indeed-scraper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2,509&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;925&lt;/td&gt;
&lt;td&gt;1,394&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;valig/linkedin-jobs-scraper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2,180&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;682&lt;/td&gt;
&lt;td&gt;1,310&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;valig/glassdoor-jobs-scraper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2,140&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;599&lt;/td&gt;
&lt;td&gt;1,340&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apimaestro/linkedin-jobs-scraper-api&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2,139&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;564&lt;/td&gt;
&lt;td&gt;1,375&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkeyvwin%2Fworkflows%2Fmain%2Fassets%2Fcharts%2Fmcp-tool-cost-20-job-actors-2026-10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkeyvwin%2Fworkflows%2Fmain%2Fassets%2Fcharts%2Fmcp-tool-cost-20-job-actors-2026-10.png" alt="Tokens an agent loads per job-search Actor on Apify MCP, 20 Actors, stacked by description, input schema and output schema" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the tokens go
&lt;/h2&gt;

&lt;p&gt;The input schema tracks the number of fields, not the quality of the Actor. Six fields cost 406 tokens; 38 to 41 fields cost 3,410 to 6,061. Every filter an author adds is a line the agent reads on every turn it has the tool loaded. Mine sits in that band on purpose: 38 fields, 3,410 tokens, because the Actor exposes the database's filters (boolean title and description search, exclusions, employer size, industry, salary, applicants, expiry) instead of hiding them behind one free-text box. That is a trade, and the number is its price.&lt;/p&gt;

&lt;p&gt;The output schema is the larger half in nine of the twenty tools. The server generates it from the Actor's dataset, so a scraper that returns a deeply nested row pays for it on every turn, and the author never sees it unless they run &lt;code&gt;tools/list&lt;/code&gt; themselves. The Indeed scraper at the top of the table returns rows that produced a 3,400-node schema; the tool definition for my jobs Actor has 229 nodes. The other nineteen output schemas came in between 1,068 and 2,217 tokens, which looks like the floor for a flat row with a few dozen keys.&lt;/p&gt;

&lt;p&gt;The description is cheap, 43 to 107 tokens. The server takes the Store description verbatim after a preamble ("This tool calls the Actor ... and retrieves its output results. Actor description: ..."). So the one text an author writes for humans is also the text the agent reads to choose between tools, and it is under three percent of the tool's cost. Spend the words there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the server does to a listing
&lt;/h2&gt;

&lt;p&gt;Three transformations were visible in the payloads.&lt;/p&gt;

&lt;p&gt;Long field descriptions are cut. On the Actor with the longest ones, four of 38 fields ended in "[Description truncated]"; their raw descriptions ran 518 to 810 characters and came through at 371 to 495 plus the marker. Whatever you wrote after the cut, the agent never reads.&lt;/p&gt;

&lt;p&gt;Prefill values are appended to the description as "Example values: ...". If the prefill is a realistic example, that is free documentation. If it is a placeholder, the agent copies the placeholder.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;required&lt;/code&gt; is passed through as written. Four of the twenty require at least one field. A required field that also has a default is a small trap: the agent must supply it even though the Actor would run without it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fixed overhead you pay even for one Actor
&lt;/h2&gt;

&lt;p&gt;Pin one Actor and the server still sends four helper tools: get-actor-run (1,437 tokens), abort-actor-run (1,311), get-dataset-items (667) and get-key-value-store-record (373). That is 3,788 tokens before the Actor itself; for the median Actor, half the bill.&lt;/p&gt;

&lt;p&gt;Without &lt;code&gt;?tools=&lt;/code&gt;, the default server sends 12 tools and 18,391 tokens: the three discovery tools (search-actors 2,315, fetch-actor-details 1,755, call-actor 2,009), the four helpers, two docs tools, a problem reporter and two web tools (rag-web-browser 4,508, web-fetch 2,647). &lt;code&gt;?tools=actors&lt;/code&gt; keeps discovery and cuts the rest: 7 tools, 9,867 tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Claude Code does with it
&lt;/h2&gt;

&lt;p&gt;I have five recorded &lt;code&gt;claude -p&lt;/code&gt; sessions over the pinned jobs tools from the last three posts, two or three Actors pinned each time. In all five, the agent's first action was &lt;code&gt;ToolSearch&lt;/code&gt; with &lt;code&gt;select:mcp__apify__b2bsearch--linkedin-job-search-api,...&lt;/code&gt;. Claude Code defers MCP tool definitions above a size threshold: the model sees the names at the start and pulls a definition into context when it decides to use the tool. The first turn of the Java-in-Berlin session carried 43,743 tokens of context before any Actor definition had been fetched.&lt;/p&gt;

&lt;p&gt;So in Claude Code the tool tax is not paid on turn one. It is paid from the turn the definition is loaded, on every turn after. The session that ran 18 free previews took 39 turns and read 523,825 cached input tokens in eleven minutes, and the tool definitions were part of every one of those reads. Across the five sessions the agent used between 9 and 16 of the Actor's 38 input fields; the other 22 to 29 rode along in every turn as schema the agent had read and did not need.&lt;/p&gt;

&lt;p&gt;A host without deferral puts the whole &lt;code&gt;tools/list&lt;/code&gt; into the system prompt on turn one, and pays the table above on every turn from the first. The 15-to-4 post I linked measured exactly that case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Discovery versus pinning: two sessions, one question
&lt;/h2&gt;

&lt;p&gt;Same prompt, two Claude Code sessions, one difference in the MCP URL. The prompt is a backend developer in Berlin with six years of Java asking which technology to learn next, judged by what German employers ask for: count the base, count the current stack in descriptions, count eight candidates, count two of them together with Java.&lt;/p&gt;

&lt;p&gt;Pinned, &lt;code&gt;?tools=b2bsearch/linkedin-job-search-api,b2bsearch/hiring-companies-finder&lt;/code&gt; (the recorded session from the third post): 39 turns, eleven minutes, 18 free previews, 523,825 cached input tokens read. The agent had exact counts for the base and for every technology, by employer, and picked Kubernetes with AWS close behind.&lt;/p&gt;

&lt;p&gt;Discovery, &lt;code&gt;?tools=actors&lt;/code&gt; (search, details, call, plus the four helpers: 9,867 tokens of definitions), with money rules added to the prompt: read an Actor's pricing before calling it, cap every call, keep the total small, prefer free counts. 33 turns, fifteen minutes, 32 tool calls: 5 Store searches, 12 listing fetches, 3 paid runs on two scrapers, 11 reads of run state and rows. 220,114 tokens written to cache and 1,571,639 read, three times the pinned session. The agent never saw my Actor: the five searches came back led by the most-used scrapers, and a tool with a handful of users in its first week was in none of the lists. It chose the most-used LinkedIn scraper and an Indeed scraper, pulled 225 rows, filtered them to 82 backend postings, and answered with shares of that sample, labelled as a sample with a ten-point margin, and picked AWS with Kubernetes close behind. The three runs all stayed under the cap the agent had set on each call.&lt;/p&gt;

&lt;p&gt;Where the discovery turns went is the part worth keeping. Two of the twelve listing fetches came back over Claude Code's tool-result limit (61,678 and 68,510 characters: a README plus both schemas), one hit a 502, and the rest were 14,000 to 24,000 characters each. Reading listings cost the session more context than running them.&lt;/p&gt;

&lt;p&gt;My first attempt at the discovery session had to be killed, and the reason belongs in the post. I had left the shell tool allowed. When a listing fetch overflowed and Claude Code wrote it to a file, the agent read the file with the shell, then started checking the environment and my credentials file for an Apify token so it could call the API directly. Nothing was sent anywhere and the transcript holds no token, but an agent with a shell and a blocked tool result will look for another road. The second run had &lt;code&gt;--permission-mode default&lt;/code&gt; and the shell in &lt;code&gt;--disallowedTools&lt;/code&gt;, and stayed on the MCP tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I keep in my own schema, and what I changed
&lt;/h2&gt;

&lt;p&gt;The three b2bsearch Actors follow rules I had set before this measurement, and the payloads confirm they survive the server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The two fields that change what a run costs, &lt;code&gt;previewOnly&lt;/code&gt; and &lt;code&gt;compact&lt;/code&gt;, are the fourth and fifth fields in the schema, before any filter, so a client that shows the first N fields shows them.&lt;/li&gt;
&lt;li&gt;Field descriptions are capped at 350 characters by a test in the build (the longest live one is 342). None of my fields carries the "[Description truncated]" marker.&lt;/li&gt;
&lt;li&gt;No required fields. &lt;code&gt;{"previewOnly": true, "titleSearch": ["backend"], "locationSearch": ["de"]}&lt;/code&gt; is a complete call.&lt;/li&gt;
&lt;li&gt;Rows nest two levels at most (a company card, a recruiter), which gives an output schema of 2,123 tokens and 229 schema nodes. The 3,400-node schema at the top of the table cost 32,136.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What this measurement changed: I had been treating the input schema as the tool's cost. It is a third to a half of it. The helper tools and the inferred output schema are the rest, and only the second of those is under an author's control, through the shape of the rows the Actor writes.&lt;/p&gt;

&lt;p&gt;What I did not do is cut fields. The recorded sessions used nine to sixteen of them, different ones each time, and a database-backed search with fewer filters would just move the filtering into the agent's own loop, which is far more expensive than a schema line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three calls to try on the jobs tools
&lt;/h2&gt;

&lt;p&gt;The table is about cost. Here is what the three pinned tools of mine return when an agent asks a plain question. Every call below is a free preview: no rows, no charge, just the count and a breakdown. I ran them on 31 October 2026 and the data runs through 21 October.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://apify.com/b2bsearch/linkedin-job-search-api" rel="noopener noreferrer"&gt;LinkedIn Jobs Database API&lt;/a&gt;: "how many backend postings in Germany, and who answers them?"&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"previewOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"titleSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"backend engineer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"locationSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"de"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"timeRange"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"30d"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;155 open postings at 101 employers. Berlin has 41 of them and Munich 17. 18 state a salary and 14 name a recruiter. 55 had fewer than 25 applicants and 29 had over 200, which is the number I would show a candidate before they pick where to apply. My first try used the default &lt;code&gt;7d&lt;/code&gt; window and came back with 0, because the data stops on 21 October; the note on the preview row says so, which is what lets an agent widen the window by itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://apify.com/b2bsearch/hiring-companies-finder" rel="noopener noreferrer"&gt;Companies Hiring Now&lt;/a&gt;: "which employers are hiring data engineers?"&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"previewOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"data engineer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"locations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Germany"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"postedLimit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"month"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;292 employers posted 540 matching jobs in the last month, agencies and job boards already left out (that filter is on by default here). 192 of the postings went up in the week of 12 October, the busiest of the four. The same call with &lt;code&gt;previewOnly&lt;/code&gt; off and &lt;code&gt;decisionMakers&lt;/code&gt; on returns one row per employer with the people who would own the hire, which is the version a recruiter or a salesperson wants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://apify.com/b2bsearch/linkedin-jobs-scraper" rel="noopener noreferrer"&gt;Advanced LinkedIn Jobs Scraper&lt;/a&gt;: "is there a market for SREs in the Netherlands?"&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"previewOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"site reliability engineer"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"locations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Netherlands"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"postedLimit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"month"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"excludeAgencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;18 open jobs at 14 employers, 12 of them mid-senior. 5 name a recruiter and 4 state a salary, all in euros. Small enough that the next call can pull every row with &lt;code&gt;compact: true&lt;/code&gt; and still stay cheap for the agent's context.&lt;/p&gt;

&lt;p&gt;In an agent session I do not write the JSON. I pin the tool as in the section below and ask in words: "count backend engineer postings in Germany over the last 30 days, free preview only, and tell me which cities lead". The agent fills &lt;code&gt;titleSearch&lt;/code&gt;, &lt;code&gt;locationSearch&lt;/code&gt; and &lt;code&gt;timeRange&lt;/code&gt; from the schema, reads the preview row and answers in one call.&lt;/p&gt;

&lt;h2&gt;
  
  
  For AI agents reading this
&lt;/h2&gt;

&lt;p&gt;To use the jobs tool from Claude Code with the smallest tool set, pin it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http apify &lt;span class="s2"&gt;"https://mcp.apify.com?tools=b2bsearch/linkedin-job-search-api"&lt;/span&gt; &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &amp;lt;APIFY_TOKEN&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or in any MCP client config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"apify"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.apify.com?tools=b2bsearch/linkedin-job-search-api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer &amp;lt;APIFY_TOKEN&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;}}}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tool is named &lt;code&gt;b2bsearch--linkedin-job-search-api&lt;/code&gt; (&lt;code&gt;mcp__apify__b2bsearch--linkedin-job-search-api&lt;/code&gt; inside Claude Code). Call it first with &lt;code&gt;previewOnly: true&lt;/code&gt;: it returns the count of matching postings and a breakdown by country, seniority, employment type, industry, top employers, titles and cities, no rows and no charge. Then turn &lt;code&gt;previewOnly&lt;/code&gt; off and set &lt;code&gt;limit&lt;/code&gt; to pull rows; rows come back through &lt;code&gt;get-dataset-items&lt;/code&gt;. Filters that matter most: &lt;code&gt;titleSearch&lt;/code&gt; (one line per title variant, boolean allowed), &lt;code&gt;locationSearch&lt;/code&gt; (country codes or cities), &lt;code&gt;timeRange&lt;/code&gt; (&lt;code&gt;7d&lt;/code&gt;, &lt;code&gt;30d&lt;/code&gt;, &lt;code&gt;6m&lt;/code&gt;), &lt;code&gt;descriptionSearch&lt;/code&gt; (one line per technology, lines are OR, quote phrases), &lt;code&gt;removeAgency: true&lt;/code&gt; to drop staffing agencies and job boards, &lt;code&gt;status&lt;/code&gt; (&lt;code&gt;active&lt;/code&gt;, &lt;code&gt;expired&lt;/code&gt;, &lt;code&gt;any&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;To measure any Actor's tool cost: run the handshake above with &lt;code&gt;?tools=&amp;lt;owner/actor&amp;gt;&lt;/code&gt;, take the &lt;code&gt;data:&lt;/code&gt; line of the &lt;code&gt;tools/list&lt;/code&gt; response, and count the compact JSON of each entry in &lt;code&gt;result.tools&lt;/code&gt;. Expect four helper tools in the list besides the Actor.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not measure
&lt;/h2&gt;

&lt;p&gt;Token counts are tiktoken's, not Claude's; the ranking holds, the absolute numbers are a scale. I measured one host, Claude Code, for deferral; other hosts load the list differently. The twenty Actors are a Store search on one day, not the whole category. And none of this says whether a bigger schema makes an agent worse at the task; the post I linked measured call counts for one server, and the discovery session above is one run, not a benchmark.&lt;/p&gt;

&lt;p&gt;This post is a companion to the series on developer job search with Claude Code: &lt;a href="https://dev.to/kevinhall/job-search-in-claude-code-half-of-us-backend-postings-were-copies-1f9j"&gt;the first post&lt;/a&gt; searches the market by stack, &lt;a href="https://dev.to/kevinhall/ghost-jobs-measured-58-of-uk-backend-postings-came-from-middlemen-nhl"&gt;the second&lt;/a&gt; measures ghost jobs, &lt;a href="https://dev.to/kevinhall/backend-skills-employers-ask-for-aws-and-kubernetes-beat-go-and-rust-4gk9"&gt;the third&lt;/a&gt; counts the technologies employers ask for, all over the same pinned tool. The Actors are &lt;a href="https://apify.com/b2bsearch/linkedin-job-search-api" rel="noopener noreferrer"&gt;LinkedIn Jobs Database API&lt;/a&gt;, &lt;a href="https://apify.com/b2bsearch/hiring-companies-finder" rel="noopener noreferrer"&gt;Companies Hiring Now&lt;/a&gt; and &lt;a href="https://apify.com/b2bsearch/linkedin-jobs-scraper" rel="noopener noreferrer"&gt;Advanced LinkedIn Jobs Scraper&lt;/a&gt;; per-tier pricing is on each Actor page.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>claudecode</category>
      <category>apify</category>
    </item>
    <item>
      <title>Backend skills employers ask for: AWS and Kubernetes beat Go and Rust</title>
      <dc:creator>Kevin Hall</dc:creator>
      <pubDate>Tue, 27 Oct 2026 19:16:11 +0000</pubDate>
      <link>https://dev.to/kevinhall/backend-skills-employers-ask-for-aws-and-kubernetes-beat-go-and-rust-4gk9</link>
      <guid>https://dev.to/kevinhall/backend-skills-employers-ask-for-aws-and-kubernetes-beat-go-and-rust-4gk9</guid>
      <description>&lt;p&gt;A first-year student on this site asked the question I keep seeing in other forms: &lt;a href="https://dev.to/effessdev/i-was-chasing-the-job-market-one-comment-on-devto-made-me-rethink-everything-4h20"&gt;what are you supposed to learn&lt;/a&gt; when every field looks like it might shrink before you graduate. The usual answers come from developer surveys, which tell you what people enjoy using, or from trend charts, which tell you what people talk about. Neither tells you what the employer who might hire you wrote in the posting.&lt;/p&gt;

&lt;p&gt;So I counted that. From Claude Code, I searched the text of open LinkedIn backend postings in five countries for three dozen technologies, one free count per technology per country, and counted how many employers named each one. This is the third post of the series; &lt;a href="https://dev.to/kevinhall/job-search-in-claude-code-half-of-us-backend-postings-were-copies-1f9j"&gt;the first&lt;/a&gt; searched the market by stack, &lt;a href="https://dev.to/kevinhall/ghost-jobs-measured-58-of-uk-backend-postings-came-from-middlemen-nhl"&gt;the second&lt;/a&gt; measured ghost jobs. The short version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloud comes first.&lt;/strong&gt; AWS is named by more employers than any programming language in the UK and India (53 % in both) and is second only to Python in the US. In the Netherlands, Azure leads (37 %).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes is the constant.&lt;/strong&gt; Between 32 % and 37 % of employers name it in every one of the five countries. Nothing else is that even.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two languages carry the volume.&lt;/strong&gt; Python leads in the UK, the US and the Netherlands; Java leads in Germany (38 % against 36 %) and ties with Python in India.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Netherlands is a Microsoft market.&lt;/strong&gt; C# or .NET shows up at 31 % of Dutch employers, more than twice its share anywhere else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go and Rust are smaller than their reputation&lt;/strong&gt;: 5–13 % and 2–12 % of employers. Go is undercounted, for a reason explained below.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code is in the job ad.&lt;/strong&gt; LLMs or generative AI come up at 9–28 % of employers and AI agents at 12–20 %. Claude Code is named by more employers than GitHub Copilot in all five countries: 6–10 % against 3–6 %.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then the question that matters to one person: given what I already know, what do I learn next? A Claude Code session answered it for a Java developer in Berlin, with its own counts, in eleven minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The wiring
&lt;/h2&gt;

&lt;p&gt;The same as in posts 1 and 2: Apify's MCP server, pinned to the jobs Actor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http apify &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://mcp.apify.com?tools=b2bsearch/linkedin-job-search-api"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Actor is &lt;a href="https://apify.com/b2bsearch/linkedin-job-search-api" rel="noopener noreferrer"&gt;LinkedIn Jobs Database API&lt;/a&gt;, a search over a database of LinkedIn job postings. This post leans on one input: &lt;code&gt;previewOnly: true&lt;/code&gt;. A preview returns how many postings match and at how many employers, with a breakdown by employer, applicants and seniority, and it charges nothing. One technology in one country is one preview.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I counted
&lt;/h2&gt;

&lt;p&gt;Every count in this post is a run like this one, with only the country and the technology words changed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"titleSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"backend"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"back-end"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"back end"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locationSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"gb"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"datePostedAfter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-29"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timeRange"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"30d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"removeAgency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"descriptionSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"kubernetes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"k8s"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"previewOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Postings&lt;/strong&gt;: open LinkedIn postings with backend in the title, staffing agencies and job boards left out. &lt;a href="https://dev.to/kevinhall/ghost-jobs-measured-58-of-uk-backend-postings-came-from-middlemen-nhl"&gt;Post 2&lt;/a&gt; shows why: in the UK they post more than half of all backend postings, often the same role several times.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: first published from 29 September to 21 October 2026 in the UK, Germany and the Netherlands. The US and India post far more, and a text search reads a limited number of postings at a time, so their windows are shorter: 19 to 21 October for the US, 12 to 21 October for India. Compare shares across countries, not counts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Employers, not postings.&lt;/strong&gt; One travel company posted 100 of the 419 US backend postings in those three days, and 36 of the 359 German ones, most of them for the same few roles listed country by country, and most of them asking for Scala and Kotlin. Counted by postings, Scala came out at 27 % in the US. Counted by employers, it is 5 %. So every share below is the number of employers whose postings name the technology, divided by the number of employers with a backend posting in that country: 198 in the UK, 229 in Germany, 95 in the Netherlands, 165 in the US, 266 in India.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Words&lt;/strong&gt;: each technology is a short list, and a posting counts if its text has any of them: &lt;code&gt;kubernetes&lt;/code&gt; or &lt;code&gt;k8s&lt;/code&gt;, &lt;code&gt;aws&lt;/code&gt; or &lt;code&gt;"amazon web services"&lt;/code&gt;, &lt;code&gt;"c#"&lt;/code&gt;, &lt;code&gt;".net"&lt;/code&gt; or &lt;code&gt;dotnet&lt;/code&gt;, and so on. Single words match whole, so &lt;code&gt;java&lt;/code&gt; does not match JavaScript; quoted phrases match as written.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go&lt;/strong&gt; is the exception. "Go" is an ordinary English word, so I counted &lt;code&gt;golang&lt;/code&gt;, "Go developer", "Go engineer", "(Go)" and "Go/" only. Its share is a floor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A mention is not a requirement.&lt;/strong&gt; "Kubernetes is a plus" counts the same as "five years of Kubernetes".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In all, 1,730 postings and 210 previews. The runs went four at a time, because the free Apify plan allows five concurrent runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The table
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkeyvwin%2Fworkflows%2Fmain%2Fassets%2Fcharts%2Fbackend-skills-by-country-2026-10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkeyvwin%2Fworkflows%2Fmain%2Fassets%2Fcharts%2Fbackend-skills-by-country-2026-10.png" alt="Share of employers whose open backend postings mention each technology, five countries" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same numbers as text, for the rows most people ask about (share of employers, %):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;UK&lt;/th&gt;
&lt;th&gt;Germany&lt;/th&gt;
&lt;th&gt;Netherlands&lt;/th&gt;
&lt;th&gt;US&lt;/th&gt;
&lt;th&gt;India&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microservices&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Cloud&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kafka&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spring Boot&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# / .NET&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terraform&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kotlin&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go (floor)&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FastAPI&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLMs, GenAI&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI agents&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Copilot&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What each market asks for
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;UK.&lt;/strong&gt; The widest spread of the five. AWS (53 %), Python (43 %) and PostgreSQL (39 %) lead, and TypeScript is higher here (33 %) than in any other country. Google Cloud reaches 26 %, the most in Europe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Germany.&lt;/strong&gt; A JVM market: Java (38 %) edges out Python (36 %), Spring Boot is named by 22 % of employers, and Kotlin by 11 %. Cloud is named less often than in the UK (AWS 33 %, Google Cloud 10 %), and PHP still has 11 %. Go is at 5 %, the lowest of the five.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Netherlands.&lt;/strong&gt; The only country where Azure (37 %) is ahead of AWS (29 %), with C#/.NET at 31 % and Kubernetes right behind Azure at 36 %. LLMs come up least often here (9 %).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;US.&lt;/strong&gt; Python (52 %) and AWS (46 %) lead, Java follows (42 %). This is where AI shows up most: 28 % of employers mention LLMs or generative AI in a backend posting. Rust (12 %) and C++ (13 %) are also at their highest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;India.&lt;/strong&gt; AWS (53 %), Python (49 %) and Java (48 %), then microservices (42 %) and Docker (39 %). The classic service stack is here in full: Spring Boot 23 %, MySQL 23 %, MongoDB 20 %, Redis 19 %, and Google Cloud and Azure both at 30 %.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to learn next, decided by Claude Code
&lt;/h2&gt;

&lt;p&gt;The table answers "what does the market ask for". A person needs a narrower answer: given my stack, which one thing opens the most roles? I gave a fresh Claude Code session, connected only to the Apify tools above, this request, word for word:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I'm a backend developer in Berlin: six years of Java with Spring Boot,
PostgreSQL, Kafka, some Docker. I have time to learn one thing properly in the
next three months, and I want to pick it by what German employers actually ask
for, not by what is trending online.

Use the Apify tools you have, with previews only (previewOnly: true, which
charges nothing; do not pull rows):
1. With the job search Actor, count active backend postings in Germany from
   the last 30 days: titles "backend", "back-end", "back end"; agencies and
   job boards left out. That is the base.
2. Count how many of those postings mention my current stack in the
   description, one preview per technology (java, "spring boot", postgresql,
   kafka, docker).
3. Then pick six to eight candidate technologies I could learn next (a
   language, a cloud, an infrastructure tool, whatever you think is worth
   checking) and count each the same way. Include at least kotlin, golang,
   kubernetes and aws.
4. For the two strongest candidates, count the postings that mention java AND
   the candidate together, so I can see how many roles my current stack plus
   the new skill would cover.

Answer with one table (technology, postings that mention it, share of the
base), then the one thing you would learn and why in three sentences, with the
numbers. Say which counts are rough (for example, a word that also has a
common ordinary meaning). Answer in English.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It loaded the job search tool, sent all fourteen previews at once, then read the totals from each run's dataset. For the overlap it did something I had not asked for. Lines in &lt;code&gt;descriptionSearch&lt;/code&gt; are alternatives, so &lt;code&gt;["java", "kubernetes"]&lt;/code&gt; counts postings with either word. It ran that, subtracted it from the two single counts to get the postings with both, and then checked the result with one more preview written as &lt;code&gt;"java AND kubernetes"&lt;/code&gt;. Both ways gave 47. Its table, abridged:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Postings&lt;/th&gt;
&lt;th&gt;Share of 369&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;java (current)&lt;/td&gt;
&lt;td&gt;153&lt;/td&gt;
&lt;td&gt;41.5 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kubernetes&lt;/td&gt;
&lt;td&gt;115&lt;/td&gt;
&lt;td&gt;31.2 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;python&lt;/td&gt;
&lt;td&gt;114&lt;/td&gt;
&lt;td&gt;30.9 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;aws&lt;/td&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;27.9 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kotlin&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;17.9 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;golang&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;3.0 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;java AND kubernetes&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;12.7 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;java AND aws&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;11.4 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;java AND python&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;td&gt;10.6 %&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Its pick was Kubernetes: the most requested technology the developer does not already have, "spread across 77 employers rather than a handful of heavy posters", and the one that overlaps most with Java, "47 of the 153 Java postings (31%)". It also builds on the Docker they already know.&lt;/p&gt;

&lt;p&gt;The part I liked most was the list of rough counts. It called golang "a hard floor, not a real count", because most postings write "Go". It noticed on its own the effect I had to correct for in the big table: Kotlin's 66 postings came "from only 28 employers, so demand is concentrated in a few companies hiring in bulk". And it said that Spring Boot and PostgreSQL were undercounted because it had kept the developer's exact words, so postings writing only "Spring" or "Postgres" were missed. Eighteen previews, 39 turns, eleven minutes, and the Actor charged nothing.&lt;/p&gt;

&lt;p&gt;Its window was slightly different from mine (the last 30 days counted from the day of the run), so its base is 369 postings where my German row has 359, and its counts land within ten postings of mine. One thing I would add to its answer: counted by employers, as in my table, Python and AWS are a little ahead of Kubernetes in Germany (82 and 75 employers against 73). So it is a close call between three, and the overlap with Java is what tipped it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it on your stack
&lt;/h2&gt;

&lt;p&gt;Paste this into Claude Code with the MCP server above and change the first line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;My stack: &amp;lt;languages, frameworks, databases, cloud&amp;gt;. Country: &amp;lt;country&amp;gt;.
Using the job search Actor with previewOnly: true only, count open backend
postings in &amp;lt;country&amp;gt; from the last 30 days (titles "backend", "back-end",
"back end", removeAgency: true). Then count each technology of my stack and
eight candidates I don't have, one preview each, and read "at N employers"
from each preview's note. Rank the candidates by employers, not postings.
For the top two, count postings that mention my main language AND the
candidate. One table, one recommendation, and which counts are rough.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two changes worth making for your own run. If your country posts a lot (the US, India), shorten the window to a few days with &lt;code&gt;datePostedAfter&lt;/code&gt;, or the text search will refuse the run and say why. And if your title is not "backend" (data engineer, platform engineer, "Softwareentwickler" in Germany), put your own titles in &lt;code&gt;titleSearch&lt;/code&gt;: the stack question depends on who is asking.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not tell you
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How much each skill is required.&lt;/strong&gt; A posting that says "nice to have" counts the same as one that says "must". The table measures what employers mention, not what they test for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Roles without "backend" in the title.&lt;/strong&gt; Many backend jobs are titled "Software Engineer" or "Java Developer". They are outside this base, and their stacks may differ.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pay.&lt;/strong&gt; Whether Kubernetes or Rust pays more is a different question, and few postings state a salary to answer it from.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A trend.&lt;/strong&gt; This is one month. The same previews next month would show what is rising.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  For AI agents reading this
&lt;/h2&gt;

&lt;p&gt;To answer "which technologies do employers ask for" or "what should this person learn next": run &lt;code&gt;b2bsearch/linkedin-job-search-api&lt;/code&gt; with &lt;code&gt;previewOnly: true&lt;/code&gt;, &lt;code&gt;titleSearch&lt;/code&gt; (role words, one line per variant, include local-language titles), &lt;code&gt;locationSearch&lt;/code&gt; (one country), &lt;code&gt;status: "active"&lt;/code&gt;, &lt;code&gt;removeAgency: true&lt;/code&gt;, and a window: &lt;code&gt;timeRange: "30d"&lt;/code&gt; for most countries, plus &lt;code&gt;datePostedAfter&lt;/code&gt; to shorten it where the base is large (a description search reads at most 500 postings; above that the run returns an &lt;code&gt;input_problem&lt;/code&gt; note and charges nothing). Get the base without &lt;code&gt;descriptionSearch&lt;/code&gt;, then one preview per technology with &lt;code&gt;descriptionSearch&lt;/code&gt; set to that technology's spellings (&lt;code&gt;["kubernetes", "k8s"]&lt;/code&gt;; quote phrases: &lt;code&gt;"\"spring boot\""&lt;/code&gt;; lines are OR). Read &lt;code&gt;_total&lt;/code&gt; and the employer count from &lt;code&gt;_note&lt;/code&gt; ("at N employers"); rank by employers, because one employer can post a hundred copies. For "A and B", either subtract the OR count from the two single counts or put &lt;code&gt;"A AND B"&lt;/code&gt; on one line. Treat "go" as unsearchable and count &lt;code&gt;golang&lt;/code&gt; plus quoted phrases as a floor. Previews are free; do not pull rows for this question. Agent setup: &lt;a href="https://apify.com/agents.md" rel="noopener noreferrer"&gt;apify.com/agents.md&lt;/a&gt;, &lt;a href="https://docs.apify.com/platform/integrations/mcp" rel="noopener noreferrer"&gt;Apify MCP server docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is the third post of the series on developer job search with Claude Code; &lt;a href="https://dev.to/kevinhall/job-search-in-claude-code-half-of-us-backend-postings-were-copies-1f9j"&gt;the first&lt;/a&gt; covers the market count and the search by stack, &lt;a href="https://dev.to/kevinhall/ghost-jobs-measured-58-of-uk-backend-postings-came-from-middlemen-nhl"&gt;the second&lt;/a&gt; the ghost-jobs check. The Actors are &lt;a href="https://apify.com/b2bsearch/linkedin-job-search-api" rel="noopener noreferrer"&gt;LinkedIn Jobs Database API&lt;/a&gt;, &lt;a href="https://apify.com/b2bsearch/hiring-companies-finder" rel="noopener noreferrer"&gt;Companies Hiring Now&lt;/a&gt; and &lt;a href="https://apify.com/b2bsearch/linkedin-jobs-scraper" rel="noopener noreferrer"&gt;Advanced LinkedIn Jobs Scraper&lt;/a&gt;; per-tier pricing is on each Actor page.&lt;/p&gt;

</description>
      <category>career</category>
      <category>backend</category>
      <category>jobsearch</category>
      <category>claudecode</category>
    </item>
    <item>
      <title>Ghost jobs, measured: 58% of UK backend postings came from middlemen</title>
      <dc:creator>Kevin Hall</dc:creator>
      <pubDate>Tue, 27 Oct 2026 13:35:43 +0000</pubDate>
      <link>https://dev.to/kevinhall/ghost-jobs-measured-58-of-uk-backend-postings-came-from-middlemen-nhl</link>
      <guid>https://dev.to/kevinhall/ghost-jobs-measured-58-of-uk-backend-postings-came-from-middlemen-nhl</guid>
      <description>&lt;p&gt;Every ghost-jobs post on this site leans on the same kind of number. &lt;a href="https://dev.to/remoet/ghost-jobs-30-of-what-youre-applying-to-doesnt-exist-ka"&gt;Thirty percent&lt;/a&gt; of what you apply to does not exist. &lt;a href="https://dev.to/ankjhsz/ghost-jobs-why-40-of-it-job-listings-arent-actually-open-2k87"&gt;Forty percent&lt;/a&gt; of IT listings are not really open. Those figures come from surveys: someone asked recruiters and hiring managers whether they had ever posted a role they were not filling. A survey tells you that the practice exists. It does not tell you which posting in front of you is the dead one.&lt;/p&gt;

&lt;p&gt;The posting itself gives some of that away, if you read enough of them side by side. Who put it up. How long it stayed open. Whether the same role came back after it closed. And in Ontario, since 1 January 2026, whether the employer says the job exists at all, because the law now makes them say it.&lt;/p&gt;

&lt;p&gt;So I measured those four things on LinkedIn backend postings in five countries, nearly 30,000 of them, plus 2,718 software postings in Ontario, from Claude Code. This is the second post of the series; &lt;a href="https://dev.to/kevinhall/job-search-in-claude-code-half-of-us-backend-postings-were-copies-1f9j"&gt;the first one&lt;/a&gt; counted the market and cut the copies. The short version of this one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the UK, &lt;strong&gt;58 %&lt;/strong&gt; of backend postings in the last 90 days came from staffing agencies, job boards and talent marketplaces. Another 7 % came from accounts with no company on record. An employer with a company page posted 35 %. In Germany and the Netherlands the middlemen share is closer to a third.&lt;/li&gt;
&lt;li&gt;Middlemen's postings close fast: 60 % of the UK ones were gone within three days, against 23 % of employers' postings. Most of them come back a few days later as a new posting.&lt;/li&gt;
&lt;li&gt;About one employer role in eight was closed and then posted again within 90 days. One 33-person firm posted the same two backend roles almost every Friday for six months, 49 postings in all.&lt;/li&gt;
&lt;li&gt;In Ontario, where a posting must now say whether it is for an existing vacancy, 26 % of software postings said yes, 2 % said no, and &lt;strong&gt;72 % said nothing&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these signals proves a posting is fake. Each one tells you where to spend an application and where to ask a question first. The last part of the post is the check itself: a Claude Code session that ran it on this week's postings, and the prompt to run it on yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  The wiring
&lt;/h2&gt;

&lt;p&gt;The same as in post 1: Apify's MCP server, pinned to the jobs Actors.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http apify &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://mcp.apify.com?tools=b2bsearch/linkedin-job-search-api,b2bsearch/hiring-companies-finder"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The search runs on &lt;a href="https://apify.com/b2bsearch/linkedin-job-search-api" rel="noopener noreferrer"&gt;LinkedIn Jobs Database API&lt;/a&gt;, an Apify Actor over a database of LinkedIn job postings. What makes this post possible is that the database keeps postings after they close: &lt;code&gt;status: "any"&lt;/code&gt; returns open and expired postings in one run, each expired one with its &lt;code&gt;closedAt&lt;/code&gt;, and &lt;code&gt;timeRange: "6m"&lt;/code&gt; goes back six months. A live scraper sees only what is open today, so it cannot tell you that a role was posted twenty times before.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I counted
&lt;/h2&gt;

&lt;p&gt;Titles: &lt;code&gt;backend engineer&lt;/code&gt;, &lt;code&gt;backend developer&lt;/code&gt;, &lt;code&gt;software engineer backend&lt;/code&gt;, the same three as in post 1. Countries: the US, the UK, Germany, the Netherlands and India. Window: postings from 29 July to 21 October 2026 for the cross-country numbers (90 days), and from 30 April for the UK, German and Dutch histories (six months). All postings, open and closed, without the description text: 6,282 in the UK, 4,096 in Germany, 1,370 in the Netherlands over six months, 12,288 in the US and 5,682 in India over 90 days. For Ontario, a separate pull with the text: every posting titled software engineer, software developer or backend in Ontario from 1 September to 21 October, 2,718 of them.&lt;/p&gt;

&lt;p&gt;"Closed" is LinkedIn's own state, the one a job page shows as "No longer accepting applications". I opened a handful of postings on LinkedIn to make sure the field means what it says: the ones the data has as closed weeks ago showed that banner, and the old ones it has as open were still taking applications.&lt;/p&gt;

&lt;p&gt;Who posted a posting is the Actor's agency rule plus two more buckets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Staffing agency&lt;/strong&gt;: the posting's industry is Staffing and Recruiting, or the employer's company card says it recruits for others.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job board&lt;/strong&gt;: a known aggregator that relists other employers' openings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Talent marketplace&lt;/strong&gt;: an account that posted more roles in a month than twice its own headcount. In the UK these are mostly AI recruiting platforms and talent networks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No company card&lt;/strong&gt;: the posting links to no company on record, so there is no headcount, industry or website to check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Employer&lt;/strong&gt;: everything else, a company with a card and a headcount.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A role is an employer plus a normalized title. A role was "closed and posted again" when a new posting of it went up at least three days after an earlier one closed, with no other copy of it open in between, so that a copy per city does not count as a repost.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Who posted it
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Backend postings, 29 Jul to 21 Oct&lt;/th&gt;
&lt;th&gt;US&lt;/th&gt;
&lt;th&gt;UK&lt;/th&gt;
&lt;th&gt;Germany&lt;/th&gt;
&lt;th&gt;Netherlands&lt;/th&gt;
&lt;th&gt;India&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Postings&lt;/td&gt;
&lt;td&gt;12,288&lt;/td&gt;
&lt;td&gt;2,728&lt;/td&gt;
&lt;td&gt;1,908&lt;/td&gt;
&lt;td&gt;578&lt;/td&gt;
&lt;td&gt;5,682&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Employer with a company card&lt;/td&gt;
&lt;td&gt;52 %&lt;/td&gt;
&lt;td&gt;35 %&lt;/td&gt;
&lt;td&gt;60 %&lt;/td&gt;
&lt;td&gt;60 %&lt;/td&gt;
&lt;td&gt;57 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Staffing agency&lt;/td&gt;
&lt;td&gt;11 %&lt;/td&gt;
&lt;td&gt;25 %&lt;/td&gt;
&lt;td&gt;5 %&lt;/td&gt;
&lt;td&gt;9 %&lt;/td&gt;
&lt;td&gt;7 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Talent marketplace&lt;/td&gt;
&lt;td&gt;16 %&lt;/td&gt;
&lt;td&gt;19 %&lt;/td&gt;
&lt;td&gt;10 %&lt;/td&gt;
&lt;td&gt;21 %&lt;/td&gt;
&lt;td&gt;19 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Job board&lt;/td&gt;
&lt;td&gt;13 %&lt;/td&gt;
&lt;td&gt;14 %&lt;/td&gt;
&lt;td&gt;15 %&lt;/td&gt;
&lt;td&gt;3 %&lt;/td&gt;
&lt;td&gt;7 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No company card&lt;/td&gt;
&lt;td&gt;8 %&lt;/td&gt;
&lt;td&gt;7 %&lt;/td&gt;
&lt;td&gt;10 %&lt;/td&gt;
&lt;td&gt;7 %&lt;/td&gt;
&lt;td&gt;10 %&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The UK is the outlier. Not quite two backend postings in three come from someone other than the company with the job, and a single AI recruiting platform put up about one UK backend posting in ten on its own.&lt;/p&gt;

&lt;p&gt;A middleman's posting is not a fake job. An agency posting is often a real opening one step removed; a job board relists a real employer's posting. But you are applying into someone else's funnel, and the same opening shows up under several names: the employer's own posting, the agency's, the board's copy of each. In post 1 the copies were per city; here they are per middleman.&lt;/p&gt;

&lt;p&gt;Two switches cover it. &lt;code&gt;removeAgency: true&lt;/code&gt; drops staffing agencies and job boards by industry, company card, name and posting pace, and &lt;code&gt;employerHiring: true&lt;/code&gt; puts the employer's open postings and its last 30 days of postings on every row next to &lt;code&gt;companyEmployeeCount&lt;/code&gt;, so a marketplace that posts more roles than it has people stands out in the row itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. A posting's life is short, and "posted 2 days ago" means little
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Closed within 3 days of posting, 90 days&lt;/th&gt;
&lt;th&gt;US&lt;/th&gt;
&lt;th&gt;UK&lt;/th&gt;
&lt;th&gt;Germany&lt;/th&gt;
&lt;th&gt;Netherlands&lt;/th&gt;
&lt;th&gt;India&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Employers&lt;/td&gt;
&lt;td&gt;28 %&lt;/td&gt;
&lt;td&gt;23 %&lt;/td&gt;
&lt;td&gt;27 %&lt;/td&gt;
&lt;td&gt;17 %&lt;/td&gt;
&lt;td&gt;42 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agencies, job boards, marketplaces&lt;/td&gt;
&lt;td&gt;62 %&lt;/td&gt;
&lt;td&gt;60 %&lt;/td&gt;
&lt;td&gt;45 %&lt;/td&gt;
&lt;td&gt;36 %&lt;/td&gt;
&lt;td&gt;71 %&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Most middlemen's postings are gone within three days, and a new copy takes their place. Over six months in the UK, 76 % of the backend postings that closed within three days had the same title from the same poster up again within two weeks. The posting date on a relisted role is the date of the latest copy, not the date the role opened.&lt;/p&gt;

&lt;p&gt;Employers' postings live longer, and the long tail is where the stale ones sit. Over the six-month window, 38 of the 268 UK employer postings still open on 21 October had been up for more than 60 days (14 %); in Germany 66 of 352 (19 %), in the Netherlands 14 of 96 (15 %). Some of those are hard roles to fill. Some are the "open for months" postings from the threads.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The role that keeps coming back
&lt;/h2&gt;

&lt;p&gt;Across the five countries, 11 to 14 % of employer roles were closed and posted again within 90 days. That is a role that went quiet, then reappeared as a fresh posting with zero applicants on it.&lt;/p&gt;

&lt;p&gt;The extreme case in the UK data is a 33-person financial-services firm in London. Since 1 May it has posted "Mid Level Backend Engineer" 25 times and "Senior Backend Engineer" 24 times, almost always on a Friday, from the same office. Each posting stayed up for about eight days and closed; the next one went up the following Friday. 48 of the 49 had fewer than 25 applicants. In the latest snapshot the firm had 14 postings open and had put up 63 in the previous 30 days, with 33 people on its company card.&lt;/p&gt;

&lt;p&gt;Maybe they are hiring two backend engineers and nobody good has applied in six months. Maybe the postings feed a pipeline. The data cannot say which, and neither can you from the posting. What you can do is know the history before you write a cover letter, and ask the question in your first message: is this role open now, and how many people are you hiring for it?&lt;/p&gt;

&lt;h2&gt;
  
  
  4. In Ontario, the posting has to say
&lt;/h2&gt;

&lt;p&gt;Since 1 January 2026, Ontario's Employment Standards Act requires employers with 25 or more employees to state in every publicly advertised posting whether it is for an existing vacancy. The same package requires the expected pay or a pay range, a statement when AI is used to screen or select applicants, and an answer to every interviewed candidate within 45 days (&lt;a href="https://www.mccarthy.ca/en/insights/blogs/canadian-employer-advisor/ontario-employers-need-to-know-employment-standards-act-updates-whats-new-for-2026-and-what-changed-in-2025" rel="noopener noreferrer"&gt;a summary by McCarthy Tétrault&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;That is the one place where a ghost job has to declare itself, so I read the text of every Ontario software posting from 1 September to 21 October that had one.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ontario software postings, 1 Sep to 21 Oct 2026&lt;/th&gt;
&lt;th&gt;Postings&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Says it is for an existing vacancy&lt;/td&gt;
&lt;td&gt;698&lt;/td&gt;
&lt;td&gt;26 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Says it is not, or that it is for proactive recruitment&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;2 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Says nothing either way&lt;/td&gt;
&lt;td&gt;1,971&lt;/td&gt;
&lt;td&gt;72 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;States a pay range&lt;/td&gt;
&lt;td&gt;1,321&lt;/td&gt;
&lt;td&gt;49 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Says AI is used to screen or assess applicants&lt;/td&gt;
&lt;td&gt;458&lt;/td&gt;
&lt;td&gt;17 %&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The wording varies ("This job fills an existing vacancy", "Vacancy Status: This posting is not for an existing vacancy within the organization", "This posting is for proactive recruitment purposes and may be used to fill current openings or future vacancies"), so the count is a set of patterns I checked by hand on samples, not a single keyword. On the postings that said nothing, I opened a few on LinkedIn: the statement was not in a separate field either.&lt;/p&gt;

&lt;p&gt;The 49 postings that said "not an existing vacancy" came from four employers, almost all of them with more than 10,000 people. Twelve of the 49 had over 200 applicants anyway. Read the last paragraph of a posting before you apply; in Ontario it now tells you whether you are applying for a job or for a database.&lt;/p&gt;

&lt;p&gt;Silence is harder to read. Counting by employer rather than by posting, 126 of 532 Ontario employers of 25+ people said "existing vacancy" at least once, and 405 never said either thing. Some will have the statement on their own careers page. On LinkedIn, most of what a candidate reads in Ontario still does not answer the question the law asks.&lt;/p&gt;

&lt;p&gt;To run this for your own search, put the phrase in the description search. Keep a title and a 7-day window on it, so the search stays within the texts it reads in one go, and run it weekly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"titleSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"software engineer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"software developer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"backend"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locationSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Ontario, Canada"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timeRange"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"7d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"descriptionSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"existing vacancy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"existing job vacancy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"currently vacant"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"descriptionExclusionSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"not for an existing vacancy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"proactive recruitment"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"removeAgency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employerHiring"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. The check, run by Claude Code
&lt;/h2&gt;

&lt;p&gt;I gave Claude Code the London persona from post 1 and a plain request: before I apply this week, pull 30 fresh UK backend postings without agencies, pull the same employers' last six months, and sort the 30 into apply first, check first and skip for now. The full prompt is in the next section. Everything below is from the recorded session.&lt;/p&gt;

&lt;p&gt;It started with the postings, and the input it built is the one you would write by hand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"titleSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"backend engineer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"backend developer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"software engineer backend"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locationSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"United Kingdom"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timeRange"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"30d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"datePostedAfter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-13"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"removeAgency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employerHiring"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"descriptionType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"none"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the history it put the 23 employers' &lt;code&gt;companySlug&lt;/code&gt; values into &lt;code&gt;organizationSlugFilter&lt;/code&gt; with &lt;code&gt;timeRange: "6m"&lt;/code&gt; and &lt;code&gt;status: "any"&lt;/code&gt;, and sized it first with a free preview: 306 postings at 23 employers, 83 of them open. My account is on the free Apify plan, where a run delivers 100 rows, so it split the employers across four runs that each fit, started them in parallel and merged the rows. It also tried a shell command to see whether an Apify token was set; the session allowed only the Apify tools, so the command was refused, which is what pinning them is for.&lt;/p&gt;

&lt;p&gt;An excerpt of the table it returned. I coarsened the employer descriptions to a size band and a broad industry; the rest is as it wrote it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Verdict&lt;/th&gt;
&lt;th&gt;Posting&lt;/th&gt;
&lt;th&gt;Employer&lt;/th&gt;
&lt;th&gt;Days up&lt;/th&gt;
&lt;th&gt;Same title, 6 months&lt;/th&gt;
&lt;th&gt;Earlier copy closed first&lt;/th&gt;
&lt;th&gt;Applicants&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Apply first&lt;/td&gt;
&lt;td&gt;Senior Backend Engineer, London&lt;/td&gt;
&lt;td&gt;fintech, 500–1,000 staff&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;75–100&lt;/td&gt;
&lt;td&gt;First posting; 82 applicants already, so apply fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apply first&lt;/td&gt;
&lt;td&gt;Software Engineer – Backend, UK&lt;/td&gt;
&lt;td&gt;B2B software, 500–1,000&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;&amp;lt;25&lt;/td&gt;
&lt;td&gt;New role, two location copies open&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check first&lt;/td&gt;
&lt;td&gt;Senior Backend Developer, Liverpool&lt;/td&gt;
&lt;td&gt;insurer, 201–500&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;50–75&lt;/td&gt;
&lt;td&gt;Posted again three weeks after closing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check first&lt;/td&gt;
&lt;td&gt;Backend Software Engineer, London&lt;/td&gt;
&lt;td&gt;consumer app, 1,000–5,000&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;25–50&lt;/td&gt;
&lt;td&gt;Fourth posting since July; each closed within about a week&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skip for now&lt;/td&gt;
&lt;td&gt;Senior Backend Engineer, London&lt;/td&gt;
&lt;td&gt;AI software, 51–200&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;&amp;lt;25&lt;/td&gt;
&lt;td&gt;Posted again about weekly since June&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skip for now&lt;/td&gt;
&lt;td&gt;Founding Backend Engineer (Python/Django), London&lt;/td&gt;
&lt;td&gt;2–10 staff, founded 2024&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;&amp;lt;25&lt;/td&gt;
&lt;td&gt;Your stack, but 22 open postings from 8 people; back the day after closing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skip for now&lt;/td&gt;
&lt;td&gt;Backend Engineer, London&lt;/td&gt;
&lt;td&gt;AI start-up, 11–50&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;&amp;lt;25&lt;/td&gt;
&lt;td&gt;29 postings in one week from 12 staff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skip for now&lt;/td&gt;
&lt;td&gt;Senior Backend Engineer, London&lt;/td&gt;
&lt;td&gt;IT services, no headcount on record&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;&amp;lt;25&lt;/td&gt;
&lt;td&gt;211 postings in 7 days; looks like an aggregator&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The first sentence of its summary, as written:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The main pattern is re-posting: the employer had already posted the same title in
the last six months for 23 of the 30 postings, and 14 of the 30 went up after an
earlier copy had closed, so many "6–8 days old, under 25 applicants" rows are just
reset counters, not new openings.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"Reset counters" is the sentence I would put on a sticky note. A posting that says six days old and under 25 applicants looks like the best row in the list, and for the AI-software employer above it was the twenty-first copy of the same role. I checked that one against my own pull: 21 postings of the same title, 3 June to 21 October.&lt;/p&gt;

&lt;p&gt;Two things it did that I would not have thought to ask for. It kept a Python/Django founding role, the closest match to the persona's stack in the 30, in "skip for now", because the employer had 22 postings open with 8 people on its card. And it finished with the same advice as the threads, made concrete: open the posting to confirm it is live, look for the role on the employer's careers page, and for a reposted role ask the recruiter whether there is one funded seat and a hiring manager reading applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The check, as a routine
&lt;/h2&gt;

&lt;p&gt;Four columns are enough, and all four come from fields on the row or from one extra run.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column&lt;/th&gt;
&lt;th&gt;Where it comes from&lt;/th&gt;
&lt;th&gt;Read it as&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who posted it&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;removeAgency&lt;/code&gt;, &lt;code&gt;companyEmployeeCount&lt;/code&gt;, &lt;code&gt;employerOpenJobs&lt;/code&gt;, &lt;code&gt;employerJobs30d&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;More open roles than people: a marketplace, not the employer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Age&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;postedAt&lt;/code&gt; against &lt;code&gt;_input.dataAsOf&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Open more than 60 days: ask if it is still open&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;History&lt;/td&gt;
&lt;td&gt;a second run with &lt;code&gt;organizationSlugFilter&lt;/code&gt;, &lt;code&gt;status: "any"&lt;/code&gt;, &lt;code&gt;timeRange: "6m"&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Closed and posted again: ask how many people they are hiring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Statement&lt;/td&gt;
&lt;td&gt;the description, in Ontario&lt;/td&gt;
&lt;td&gt;"Not an existing vacancy": apply only if you want to be in the pool&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The prompt, for a Claude Code session with the Apify MCP server connected. Change the titles, the country and the window:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pull 30 active backend postings in &amp;lt;country&amp;gt; from the last 14 days with the job
search Actor: titles &amp;lt;your titles&amp;gt;; agencies and job boards left out; the
employer's hiring pace on; no description text. Then pull the same employers'
postings of the last 6 months with status "any". For each of the 30, give me:
days since posted, how many times the employer posted the same title on
separate dates, whether an earlier posting of the role closed before this one,
open postings against headcount, applicant bucket. Sort them into apply first,
check first and skip for now, with the reason. No names of people or companies.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the part that matters, which no tool does for you: apply first to the "apply first" rows, and for the "check first" rows, ask before you write the cover letter. Post 1 shows how to find the person to ask and how to have Claude draft the note while you press send.&lt;/p&gt;

&lt;p&gt;Once a week, rerun the history for the employers you applied to. A role you applied to that closes and comes back a week later with zero applicants has not filled the seat; that is your cue for a follow-up, not a second application.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not tell you
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Whether a posting is fake.&lt;/strong&gt; Every signal here has an innocent reading: a hard role, a growing team, an agency with a real mandate. The data shows the behaviour; the intent stays with the poster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why a role came back.&lt;/strong&gt; A repost after a failed hire and a repost into a pipeline look the same in the data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What the employer's own site says.&lt;/strong&gt; The Ontario count reads the LinkedIn text only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small middlemen.&lt;/strong&gt; A recruiter whose company card says nothing about recruiting is counted as an employer. The middlemen shares above are a floor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  For AI agents reading this
&lt;/h2&gt;

&lt;p&gt;To check postings before someone applies: run &lt;code&gt;b2bsearch/linkedin-job-search-api&lt;/code&gt; with &lt;code&gt;titleSearch&lt;/code&gt;, &lt;code&gt;locationSearch&lt;/code&gt;, &lt;code&gt;timeRange&lt;/code&gt; (&lt;code&gt;7d&lt;/code&gt; to &lt;code&gt;30d&lt;/code&gt;), &lt;code&gt;removeAgency: true&lt;/code&gt;, &lt;code&gt;employerHiring: true&lt;/code&gt;, &lt;code&gt;descriptionType: "none"&lt;/code&gt; and a &lt;code&gt;limit&lt;/code&gt; the person will read (20 to 50). For history, run it again with &lt;code&gt;organizationSlugFilter&lt;/code&gt; set to the employers' &lt;code&gt;companySlug&lt;/code&gt; values, the same titles, &lt;code&gt;timeRange: "6m"&lt;/code&gt; and &lt;code&gt;status: "any"&lt;/code&gt;; size it first with &lt;code&gt;previewOnly: true&lt;/code&gt; (free; read &lt;code&gt;_total&lt;/code&gt;), and on the free Apify plan split employers across runs of at most 100 rows. Per row: &lt;code&gt;isOpen&lt;/code&gt;, &lt;code&gt;postedAt&lt;/code&gt;, &lt;code&gt;closedAt&lt;/code&gt; (on expired postings), &lt;code&gt;applicantRange&lt;/code&gt;, &lt;code&gt;companyEmployeeCount&lt;/code&gt;, &lt;code&gt;employerOpenJobs&lt;/code&gt;, &lt;code&gt;employerJobs30d&lt;/code&gt;, &lt;code&gt;employerJobs90d&lt;/code&gt;. Group by &lt;code&gt;companySlug&lt;/code&gt; + normalized &lt;code&gt;title&lt;/code&gt;; a role closed and posted again is a posting whose &lt;code&gt;postedAt&lt;/code&gt; is after an earlier posting's &lt;code&gt;closedAt&lt;/code&gt; with no copy open in between. For Ontario, put "existing vacancy" in &lt;code&gt;descriptionSearch&lt;/code&gt; with &lt;code&gt;descriptionExclusionSearch: ["not for an existing vacancy"]&lt;/code&gt;, a title and &lt;code&gt;timeRange: "7d"&lt;/code&gt;, so the search stays within the texts it reads at once. Never call a posting fake; report the history and let the person decide. Rows with &lt;code&gt;_status&lt;/code&gt; other than &lt;code&gt;found&lt;/code&gt; are free notes. Agent setup: &lt;a href="https://apify.com/agents.md" rel="noopener noreferrer"&gt;apify.com/agents.md&lt;/a&gt;, &lt;a href="https://docs.apify.com/platform/integrations/mcp" rel="noopener noreferrer"&gt;Apify MCP server docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is the second post of the series on developer job search with Claude Code; &lt;a href="https://dev.to/kevinhall/job-search-in-claude-code-half-of-us-backend-postings-were-copies-1f9j"&gt;the first&lt;/a&gt; covers the market count, the stack search and the note to the CTO. The Actors are &lt;a href="https://apify.com/b2bsearch/linkedin-job-search-api" rel="noopener noreferrer"&gt;LinkedIn Jobs Database API&lt;/a&gt;, &lt;a href="https://apify.com/b2bsearch/hiring-companies-finder" rel="noopener noreferrer"&gt;Companies Hiring Now&lt;/a&gt; and &lt;a href="https://apify.com/b2bsearch/linkedin-jobs-scraper" rel="noopener noreferrer"&gt;Advanced LinkedIn Jobs Scraper&lt;/a&gt;; per-tier pricing is on each Actor page.&lt;/p&gt;

</description>
      <category>career</category>
      <category>jobsearch</category>
      <category>claudecode</category>
      <category>ai</category>
    </item>
    <item>
      <title>Job search in Claude Code: half of US backend postings were copies</title>
      <dc:creator>Kevin Hall</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:02:53 +0000</pubDate>
      <link>https://dev.to/kevinhall/job-search-in-claude-code-half-of-us-backend-postings-were-copies-1f9j</link>
      <guid>https://dev.to/kevinhall/job-search-in-claude-code-half-of-us-backend-postings-were-copies-1f9j</guid>
      <description>&lt;p&gt;The job-search threads on this site read like the same ledger. Seventy-two applications, twenty-three rejections, two offers in &lt;a href="https://dev.to/javz/23-rejections-multiple-offers-what-i-learned-from-my-2-month-swe-job-search-5hi4"&gt;one senior engineer's two-month search&lt;/a&gt;. Seventy-three applications and sixty-one silences in &lt;a href="https://dev.to/le_beltagy/i-built-a-job-scraping-bot-to-escape-cloud-consulting-and-its-open-source-1m8a"&gt;another&lt;/a&gt;. A rejection &lt;a href="https://dev.to/mikachu/i-got-rejected-2-minutes-after-applying-so-much-for-skills-based-hiring-4315"&gt;two minutes after pressing submit&lt;/a&gt;. Postings that &lt;a href="https://dev.to/ale3oula/what-two-months-of-interviewing-taught-me-about-the-2026-tech-job-market-3d8n"&gt;do not feel real&lt;/a&gt;, or have sat open for months.&lt;/p&gt;

&lt;p&gt;The advice under those posts is usually "apply more" or "tailor more". Both make the queue longer. What the threads describe is a queue problem: the same role listed many times, the good roles buried under two hundred applicants by the end of the week, a form in front of every person who could say yes.&lt;/p&gt;

&lt;p&gt;On 27 October 2026 I ran a developer job search from Claude Code over a database of LinkedIn job postings, to see how much of that queue you can step around. The persona is ordinary on purpose: a backend developer in London, five years of Python (Django, FastAPI), some Go, Postgres and Kubernetes, looking for a mid-senior role. The tools are three Apify Actors over the same jobs database: &lt;a href="https://apify.com/b2bsearch/linkedin-job-search-api" rel="noopener noreferrer"&gt;LinkedIn Jobs Database API&lt;/a&gt; for the search, &lt;a href="https://apify.com/b2bsearch/hiring-companies-finder" rel="noopener noreferrer"&gt;Companies Hiring Now&lt;/a&gt; for the employers, and &lt;a href="https://apify.com/b2bsearch/linkedin-jobs-scraper" rel="noopener noreferrer"&gt;Advanced LinkedIn Jobs Scraper&lt;/a&gt; when you want the same rows with the field names of the best-known scraper. No LinkedIn login, no cookies, no browser.&lt;/p&gt;

&lt;p&gt;Every number below comes from that day's runs. The database holds the last 180 days of postings and is loaded in waves; on 27 October it ran to 21 October, so "the last 30 days" means 25 days of postings. Rows shown here carry no names of people and no names of employers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The wiring, once
&lt;/h2&gt;

&lt;p&gt;Apify runs an MCP server at &lt;code&gt;https://mcp.apify.com&lt;/code&gt;; the &lt;code&gt;tools&lt;/code&gt; parameter pins the Actors a session may reach. In Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http apify &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://mcp.apify.com?tools=b2bsearch/linkedin-job-search-api,b2bsearch/hiring-companies-finder,b2bsearch/linkedin-jobs-scraper"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any other MCP client (Claude Desktop, Cursor, VS Code, ChatGPT) takes the same URL, with OAuth on first connect or an &lt;code&gt;Authorization: Bearer &amp;lt;APIFY_TOKEN&amp;gt;&lt;/code&gt; header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apify"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.apify.com?tools=b2bsearch/linkedin-job-search-api,b2bsearch/hiring-companies-finder,b2bsearch/linkedin-jobs-scraper"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Actors appear as tools named &lt;code&gt;b2bsearch--linkedin-job-search-api&lt;/code&gt;, &lt;code&gt;b2bsearch--hiring-companies-finder&lt;/code&gt; and &lt;code&gt;b2bsearch--linkedin-jobs-scraper&lt;/code&gt; (the slash becomes a double hyphen). The server adds &lt;code&gt;get-actor-run&lt;/code&gt; and &lt;code&gt;get-dataset-items&lt;/code&gt; next to them: a tool call returns the run and its &lt;code&gt;datasetId&lt;/code&gt;, and the rows come from &lt;code&gt;get-dataset-items&lt;/code&gt;. Without MCP, the same Actors run from the Apify API, the Python and JavaScript clients, n8n, Make or Zapier.&lt;/p&gt;

&lt;p&gt;Two of the steps below were run by Claude Code itself, from a plain-English request, in sessions I recorded; the inputs quoted there are the ones it built. The rest I typed into the same fields, because the point there is the field.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Count the market before you apply
&lt;/h2&gt;

&lt;p&gt;The search Actor has a preview mode that returns the count and a breakdown instead of rows, and it is not billed. One preview per country for backend titles (&lt;code&gt;backend engineer&lt;/code&gt;, &lt;code&gt;backend developer&lt;/code&gt;, &lt;code&gt;software engineer backend&lt;/code&gt;), last 30 days:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"titleSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"backend engineer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"backend developer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"software engineer backend"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locationSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"United Kingdom"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timeRange"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"30d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"previewOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Backend postings, 25 days to 21 Oct&lt;/th&gt;
&lt;th&gt;US&lt;/th&gt;
&lt;th&gt;UK&lt;/th&gt;
&lt;th&gt;Germany&lt;/th&gt;
&lt;th&gt;Netherlands&lt;/th&gt;
&lt;th&gt;India&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Postings&lt;/td&gt;
&lt;td&gt;2,244&lt;/td&gt;
&lt;td&gt;316&lt;/td&gt;
&lt;td&gt;266&lt;/td&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;td&gt;573&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distinct roles (employer + title)&lt;/td&gt;
&lt;td&gt;1,126&lt;/td&gt;
&lt;td&gt;266&lt;/td&gt;
&lt;td&gt;216&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;td&gt;463&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Salary stated&lt;/td&gt;
&lt;td&gt;14 %&lt;/td&gt;
&lt;td&gt;15 %&lt;/td&gt;
&lt;td&gt;12 %&lt;/td&gt;
&lt;td&gt;19 %&lt;/td&gt;
&lt;td&gt;5 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recruiter named on the posting&lt;/td&gt;
&lt;td&gt;7 %&lt;/td&gt;
&lt;td&gt;22 %&lt;/td&gt;
&lt;td&gt;11 %&lt;/td&gt;
&lt;td&gt;31 %&lt;/td&gt;
&lt;td&gt;17 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Under 25 applicants&lt;/td&gt;
&lt;td&gt;43 %&lt;/td&gt;
&lt;td&gt;35 %&lt;/td&gt;
&lt;td&gt;40 %&lt;/td&gt;
&lt;td&gt;35 %&lt;/td&gt;
&lt;td&gt;20 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Over 200 applicants&lt;/td&gt;
&lt;td&gt;18 %&lt;/td&gt;
&lt;td&gt;15 %&lt;/td&gt;
&lt;td&gt;15 %&lt;/td&gt;
&lt;td&gt;20 %&lt;/td&gt;
&lt;td&gt;46 %&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three things in that table change what you do next. Almost half of the Indian backend postings already had more than 200 applicants when they were recorded, so the queue there starts long. The Dutch postings name the recruiter one time in three, the American ones one time in fourteen. And the American market is half the size it looks, which is the next section.&lt;/p&gt;

&lt;p&gt;One trap before it: the title is not always in English. In Germany, &lt;code&gt;softwareentwickler&lt;/code&gt; alone matched 470 postings in the same 25 days, more than every title with the English word &lt;code&gt;backend&lt;/code&gt; in it (336). Search the words the market writes, in its language.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Cut the copies
&lt;/h2&gt;

&lt;p&gt;Of the 2,244 American backend postings, one employer posted 609: twenty titles, fifteen of them listed 30 times or more, once per city (Atlanta, Dallas, Miami, Phoenix and on). A consulting firm posted two titles 81 and 78 times, each ending in "Location OPEN". Grouped on employer and title, the 2,244 postings are 1,126 roles. In the United Kingdom the same grouping removes 16 % of the postings, in the Netherlands 5 %.&lt;/p&gt;

&lt;p&gt;Each row carries &lt;code&gt;jobId&lt;/code&gt;, &lt;code&gt;companyId&lt;/code&gt; and &lt;code&gt;title&lt;/code&gt;, so the grouping is one line in a spreadsheet or one sentence to Claude: "keep one row per companyId and title, the newest". Two more kinds of noise are worth naming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Relocation postings.&lt;/strong&gt; A travel platform listed "Bangkok based, relocation provided" roles in the German, Dutch and British searches. The title says so; read it before you count the role as local.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agencies and job boards.&lt;/strong&gt; &lt;code&gt;removeAgency: true&lt;/code&gt; drops staffing firms, aggregators and employers that post far more roles than they have people. While writing this I found that six of the 25 top "employers" in the British list were still recruiting firms: their postings carry the client's industry, not their own. Since build 0.1.3 the rule also reads the employer's own card and its 30-day posting pace, and the same list came back with none of them; since 0.1.6 it also reads what the card says the employer does (section 8 has the measurement). A firm whose card does not say it recruits still gets through, so read the titles that sell ("AI Startup, up to £120k").&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Search the posting text for your stack
&lt;/h2&gt;

&lt;p&gt;A backend title says nothing about Django or Go. The text does, and the search Actor can filter on it: put the role in &lt;code&gt;titleSearch&lt;/code&gt; and the technology in &lt;code&gt;descriptionSearch&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"titleSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"backend"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"descriptionSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"django"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fastapi"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locationSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"United Kingdom"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timeRange"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"30d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"previewOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Postings with "backend" in the title, 25 days&lt;/th&gt;
&lt;th&gt;All&lt;/th&gt;
&lt;th&gt;Text mentions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UK&lt;/td&gt;
&lt;td&gt;327&lt;/td&gt;
&lt;td&gt;34 Django or FastAPI, 24 golang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Netherlands&lt;/td&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;39 Kubernetes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Germany&lt;/td&gt;
&lt;td&gt;336&lt;/td&gt;
&lt;td&gt;27 Django or FastAPI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Thirty-four roles is a week of good applications, not a month of bad ones. The text filter reads the postings the other filters leave, at most 500 of them, so it needs a narrow cut: title words plus a country and at most 30 days, or one employer. "Kubernetes anywhere in Germany this month" is refused before anything runs, with a note on how to narrow it.&lt;/p&gt;

&lt;p&gt;For a fit judgement that is more than one keyword, there is a better split of labour, and the agent session in section 8 used it: let the database apply the filters it can apply exactly (title, country, size, agencies), pull 40 rows with the posting text, and let Claude read the text.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Stand where the queue is short
&lt;/h2&gt;

&lt;p&gt;The applicant count is recorded with the posting, in buckets of 25. In the British backend search with agencies out, 99 of 295 postings had fewer than 25 applicants. Of the 33 posted on the last two days in the database, 26 did.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"titleSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"backend engineer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"backend developer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"software engineer backend"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locationSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"United Kingdom"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"datePostedAfter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-20"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxApplicants"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"25"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"removeAgency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the timing problem from the threads above in numbers: a fresh posting is a short queue, and the queue grows within days. The loop that follows from it is a daily run with &lt;code&gt;datePostedAfter&lt;/code&gt; set to the &lt;code&gt;dataAsOf&lt;/code&gt; date of the previous run (every row carries it in &lt;code&gt;_input&lt;/code&gt;), deduplicated on &lt;code&gt;jobId&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One honest limit. The database is loaded in waves, not every hour, so a "last 24 hours" window run between two loads finds nothing. On 27 October it did exactly that for Germany. Since build 0.1.3 the empty row says why, with the date of the newest posting and what to change, instead of "no job matches". Anchor the loop on &lt;code&gt;dataAsOf&lt;/code&gt;, not on the clock.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Salary and the recruiter, before the cover letter
&lt;/h2&gt;

&lt;p&gt;Two filters decide where a cover letter is worth writing. &lt;code&gt;salaryMin&lt;/code&gt; keeps postings that state a salary at or above a yearly amount in a currency; &lt;code&gt;recruiterOnly&lt;/code&gt; keeps postings that name the recruiter or hiring manager, whose name, headline and profile link then ride the row.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;UK backend, agencies out, 25 days&lt;/th&gt;
&lt;th&gt;Postings&lt;/th&gt;
&lt;th&gt;Employers&lt;/th&gt;
&lt;th&gt;Also name a recruiter&lt;/th&gt;
&lt;th&gt;Also state a salary&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;All&lt;/td&gt;
&lt;td&gt;295&lt;/td&gt;
&lt;td&gt;170&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Salary stated, at least £80,000&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recruiter named&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Postings that name a recruiter state a salary one time in three; the rest, about one time in eleven. A posting that names a person and a number is a posting written by someone who wants to be found.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Companies hiring a team, not filling a seat
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/b2bsearch/hiring-companies-finder" rel="noopener noreferrer"&gt;Companies Hiring Now&lt;/a&gt; turns the same search into employers, most matching postings first, each with its hiring pace: open postings, and postings in the last 7, 30 and 90 days.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jobTitles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"backend"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;software engineer&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"United Kingdom"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"postedLimit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"month"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxCompanies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The search Actor puts the same pace on every job row with &lt;code&gt;employerHiring: true&lt;/code&gt; (&lt;code&gt;employerOpenJobs&lt;/code&gt;, &lt;code&gt;employerJobs7d&lt;/code&gt;, &lt;code&gt;employerJobs30d&lt;/code&gt;, &lt;code&gt;employerJobs90d&lt;/code&gt;, &lt;code&gt;employerTopTitles30d&lt;/code&gt;). Two postings from the British pull show why it matters. A 95-person company hiring a senior backend engineer had 19 roles open and had posted 26 in 30 days: a team being built. A 152-person company hiring for the same title had posted 3: a seat being filled. Both are real jobs, and they call for different notes: the first is a conversation about the team, the second about the one problem the hire is for.&lt;/p&gt;

&lt;p&gt;The same columns help with the postings that do not feel real. A role that has been open for months at an employer that has posted nothing else in 90 days is not proof of a ghost job, but it is the one to apply to last.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. From the posting to the person who decides
&lt;/h2&gt;

&lt;p&gt;The most useful part of a hiring signal is the person behind it. With &lt;code&gt;decisionMakers: true&lt;/code&gt; every employer in the result is followed by its leaders as rows of their own (&lt;code&gt;_type: decision_maker&lt;/code&gt;), ranked founder and CEO first, each with title, headline, profile link and the job they belong to (&lt;code&gt;forJobId&lt;/code&gt;, &lt;code&gt;forJobTitle&lt;/code&gt;). For a backend developer the right people are the engineering leaders of small companies, where the CTO still reads their own messages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"titleSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"backend engineer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"backend developer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"software engineer backend"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locationSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"United Kingdom"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timeRange"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"30d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"removeAgency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"organizationEmployeesGte"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"organizationEmployeesLte"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employerHiring"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"decisionMakers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"decisionMakerRoles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"founder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cxo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"director"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"decisionMakerTitleKeywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"cto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"engineering"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"technology"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"technical"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"decisionMakersPerCompany"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"descriptionType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Twenty postings at 16 employers came back with nine engineering leaders: three CTOs, two co-founders who are the CTO, a VP of Engineering, two Directors of Engineering and a Director of Technical Product. Nine employers had nobody on record at those roles; those are free note rows, not empty charges.&lt;/p&gt;

&lt;p&gt;The first time I ran it, the leaders were a Sales Director, a Claims Director and a Director of Casino. Title keywords match as text inside the title, and "cto" sits inside "Director". Since build 0.1.4, C-level acronyms (&lt;code&gt;cto&lt;/code&gt;, &lt;code&gt;coo&lt;/code&gt;, &lt;code&gt;cfo&lt;/code&gt; and the rest) match as whole words, so &lt;code&gt;cto&lt;/code&gt; finds "Co-Founder &amp;amp; CTO" and not "Director".&lt;/p&gt;

&lt;p&gt;The decision-maker rows on the job listings carry the profile link, not a mailbox. If you want an address, &lt;a href="https://apify.com/b2bsearch/domain-to-decision-makers" rel="noopener noreferrer"&gt;Decision Maker Email Finder by Domain&lt;/a&gt; takes the employer's &lt;code&gt;companyDomain&lt;/code&gt; from the job row and returns the leaders with the email on record.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Let Claude write the note, and press send yourself
&lt;/h2&gt;

&lt;p&gt;Finding the role is half the work; the other half is a short note to a person, and then the next one. Both are text, and both are where Claude is useful, as long as it drafts and you send.&lt;/p&gt;

&lt;h3&gt;
  
  
  The shortlist, from one request
&lt;/h3&gt;

&lt;p&gt;I gave a fresh Claude Code session, connected only to the Apify tools above, a plain request: my stack (Python with Django and FastAPI, some Go, Postgres, Kubernetes), London, a mid-senior backend role at a company of 11 to 500 people. Count first and stop above 400; then pull 40 jobs with the posting text and the hiring pace, without the description filter, and read the texts yourself; give me the eight that fit, with the stack words quoted from each posting.&lt;/p&gt;

&lt;p&gt;The session took 11 turns and three minutes. The pull it built:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"titleSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"backend"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"back end"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"back-end"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"locationSearch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"United Kingdom"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timeRange"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"30d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"removeAgency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"organizationSizeFilter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"11-50"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"51-200"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"201-500"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"descriptionType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employerHiring"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The preview counted 370 postings. The table it returned had one row per role, each with a quoted stack line such as "Strong Python and Django experience … Solid PostgreSQL expertise and AWS experience" or "We are a Go shop … PostgreSQL, MongoDB, RabbitMQ, Redis, gRPC … AWS and Kubernetes". Six of the eight had fewer than 25 applicants. It picked a 152-person lender first (its posting matched the stack almost word for word, stated the pay in the text, and the employer had posted only three roles in 30 days, "a specific hire rather than a mass campaign"), and a 311-person savings app second.&lt;/p&gt;

&lt;h3&gt;
  
  
  The note, from the rows
&lt;/h3&gt;

&lt;p&gt;A second session got the dataset from section 7 (twenty postings, nine engineering leaders) and this brief: pick the three postings that fit the stack and have a decision-maker row; for each, at most 90 words, one detail from the posting, one from the hiring pace if it helps, one sentence of matching experience using only what I said, one ask, no flattery; placeholders instead of real names; under each draft, the fields used. One of the three, as written:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hi {first_name},

I saw the Senior Backend Engineer role at {company}: backend services for the whole lending lifecycle, from credit decisioning to collections, with integrations into credit bureaus and KYC/AML providers. The posting asks for Python, Django and PostgreSQL. I have five years of Python with Django and FastAPI, some Go, plus Postgres and Kubernetes, and I'm based in London. Could we have a 15-minute call, or could you point me to whoever is running this hire?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the whole method: one fact from the posting, one true sentence about you, one small ask, sent to a person instead of a form.&lt;/p&gt;

&lt;p&gt;The session also did three things I had not asked for, and they are the reason to keep a human on the send button. It left the hiring pace out of two drafts because the numbers said nothing about engineering (one employer's 60 postings in 30 days were mostly operations roles, which it read from &lt;code&gt;employerTopTitles30d&lt;/code&gt;). It flagged a leader whose title said VP of Engineering while their headline named a different company, and another whose record the Actor marks as last refreshed before 2025 (&lt;code&gt;_note&lt;/code&gt;), with "confirm the role before you write". And it pointed out that one role asked for six years against my five.&lt;/p&gt;

&lt;h3&gt;
  
  
  The loop
&lt;/h3&gt;

&lt;p&gt;Once the pieces work by hand, the routine is short:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Every morning:&lt;/strong&gt; run the search with &lt;code&gt;datePostedAfter&lt;/code&gt; set to the previous run's &lt;code&gt;dataAsOf&lt;/code&gt;, deduplicate on &lt;code&gt;jobId&lt;/code&gt; and on &lt;code&gt;companyId&lt;/code&gt; + &lt;code&gt;title&lt;/code&gt;, and append the new rows to a tracker (a CSV in the repo, a Google Sheet, a Notion database). An Apify schedule plus a webhook into n8n or Make does this without a laptop open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rank in Claude Code:&lt;/strong&gt; fit from the posting text, then applicant bucket, then posting date, then hiring pace. Keep the top five.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Draft, then send by hand:&lt;/strong&gt; one note per role to the person in the decision-maker rows or the recruiter named on the posting, with the fields used listed under each draft. Apply through the form as well; the note is not a replacement for the application, it is the reason someone reads it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow up once,&lt;/strong&gt; five working days later, with one new fact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Once a week, clean the tracker:&lt;/strong&gt; run the same search with &lt;code&gt;status: "expired"&lt;/code&gt; and &lt;code&gt;expiredAfter&lt;/code&gt; set to last week, and close the rows that match. In the United Kingdom, 525 backend postings closed or passed their end date after 1 October; waiting on any of them is time spent.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What the agent got wrong on the first try
&lt;/h3&gt;

&lt;p&gt;The first session got a looser brief (filter by the stack, then pull 15). It put the stack into &lt;code&gt;descriptionSearch&lt;/code&gt; next to an employer-size bound, and the pull crawled: every page read posting texts, and the size bound skipped postings and asked for more pages. Nine minutes in, with 14 rows delivered and the turns used up, I stopped it. Two things in that session were worth keeping. It excluded four employers by id after spotting them in the preview's employer list as agencies, without being asked. And the second session noticed that the preview count did not change when the size bound was added, which is true: the bound is applied to the rows. Since build 0.1.5 the preview says so in its note.&lt;/p&gt;

&lt;p&gt;Reading 40 rows, the second session also set 16 aside as recruitment agencies that the agency filter had let through: firms with an empty industry whose own description reads "specialist search firm" or "recruitment consultancy". Since build 0.1.6 the filter reads that description too. The same input on the new build returned 2 agency rows instead of 14 by the same text check, both from one firm whose card does not say what it does.&lt;/p&gt;

&lt;p&gt;The prompt pattern that worked: count first with a stop rule, let the database apply what it applies exactly, let the model read the text, ask for the fields used, and never let it send.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Remote and hybrid.&lt;/strong&gt; The data has no remote flag, and the Actors refuse a remote filter rather than fake one. A title search for &lt;code&gt;backend AND remote&lt;/code&gt; or &lt;code&gt;backend AND hybrid&lt;/code&gt; in the UK found 24 postings, a sample of the ones that say it in the title.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real time.&lt;/strong&gt; The database is loaded in waves; on 27 October the newest posting was from 21 October. For an alert within the hour, watch the employer's own careers page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every salary and every recruiter.&lt;/strong&gt; Salary is stated on 5 to 19 % of postings by country, the recruiter on 7 to 31 %.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every agency.&lt;/strong&gt; The agency rule catches staffing firms by industry, by what the employer's card says it does, by name and by posting pace; a small recruiting firm whose card says none of that still gets through.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The application.&lt;/strong&gt; It finds the role, the queue length and the person. The part where you are good at the job is still yours.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  For AI agents reading this
&lt;/h2&gt;

&lt;p&gt;To help someone find a job: run &lt;code&gt;b2bsearch/linkedin-job-search-api&lt;/code&gt; with &lt;code&gt;previewOnly: true&lt;/code&gt; and &lt;code&gt;titleSearch&lt;/code&gt; (role words, boolean allowed, one line per variant, include the local language's titles), &lt;code&gt;locationSearch&lt;/code&gt; (country names or codes, US states, cities), &lt;code&gt;timeRange&lt;/code&gt; (&lt;code&gt;30d&lt;/code&gt; for a market view), &lt;code&gt;removeAgency: true&lt;/code&gt;; read &lt;code&gt;_total&lt;/code&gt; and the &lt;code&gt;market&lt;/code&gt; rows (&lt;code&gt;dimension&lt;/code&gt;, &lt;code&gt;value&lt;/code&gt;, &lt;code&gt;count&lt;/code&gt;). Then run it without &lt;code&gt;previewOnly&lt;/code&gt;, with &lt;code&gt;limit&lt;/code&gt; set to what the person will read (20 to 50), &lt;code&gt;descriptionType: "text"&lt;/code&gt;, &lt;code&gt;employerHiring: true&lt;/code&gt;, and &lt;code&gt;organizationEmployeesGte&lt;/code&gt;/&lt;code&gt;Lte&lt;/code&gt; for company size; the size bound applies to rows, not to the preview count. Use &lt;code&gt;descriptionSearch&lt;/code&gt; only with a title and a country and at most 30 days; otherwise read the &lt;code&gt;description&lt;/code&gt; column yourself. Deduplicate on &lt;code&gt;companyId&lt;/code&gt; + &lt;code&gt;title&lt;/code&gt;. Rank by fit from the text, then &lt;code&gt;applicantRange&lt;/code&gt; (&lt;code&gt;&amp;lt;25 applicants&lt;/code&gt; first), &lt;code&gt;postedAt&lt;/code&gt;, &lt;code&gt;employerJobs30d&lt;/code&gt;. For the people to write to, add &lt;code&gt;decisionMakers: true&lt;/code&gt; with &lt;code&gt;decisionMakerRoles&lt;/code&gt; and &lt;code&gt;decisionMakerTitleKeywords&lt;/code&gt;; C-level acronyms match as whole words. Rows with &lt;code&gt;_status&lt;/code&gt; other than &lt;code&gt;found&lt;/code&gt; are free notes and explain themselves in &lt;code&gt;_error&lt;/code&gt; or &lt;code&gt;_note&lt;/code&gt;. For a daily feed, set &lt;code&gt;datePostedAfter&lt;/code&gt; to the previous run's &lt;code&gt;_input.dataAsOf&lt;/code&gt;; for closed roles, run &lt;code&gt;status: "expired"&lt;/code&gt; with &lt;code&gt;expiredAfter&lt;/code&gt;. Never send a message for the person: draft it, show the fields you used, and let them send. Agent setup: &lt;a href="https://apify.com/agents.md" rel="noopener noreferrer"&gt;apify.com/agents.md&lt;/a&gt;, &lt;a href="https://docs.apify.com/platform/integrations/mcp" rel="noopener noreferrer"&gt;Apify MCP server docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is the first post of a series on developer job search with Claude Code. The Actors are &lt;a href="https://apify.com/b2bsearch/linkedin-job-search-api" rel="noopener noreferrer"&gt;LinkedIn Jobs Database API&lt;/a&gt;, &lt;a href="https://apify.com/b2bsearch/hiring-companies-finder" rel="noopener noreferrer"&gt;Companies Hiring Now&lt;/a&gt; and &lt;a href="https://apify.com/b2bsearch/linkedin-jobs-scraper" rel="noopener noreferrer"&gt;Advanced LinkedIn Jobs Scraper&lt;/a&gt;; per-tier pricing is on each Actor page.&lt;/p&gt;

</description>
      <category>career</category>
      <category>claudecode</category>
      <category>ai</category>
      <category>jobsearch</category>
    </item>
  </channel>
</rss>
