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.
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.
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.
In one paragraph
b2bsearch on Apify is a family of pay-per-row Actors over one database: 1B+ professional profiles, 115M companies, 50M+ job postings.
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.
What $10 buys
| $10 buys | On | Input |
|---|---|---|
| 4,000 leads, each with a live email | B2B Leads Finder | title, seniority, size, industry, country, city, or an Apollo URL |
| 1,100+ employees of your target accounts, with emails and phones | Company Employees | website domains |
| 3,100 founders, C-level and VPs with their emails | Decision Maker Email Finder by Domain | website domains |
| 6,600 companies by industry, headcount, HQ and last round | Company Search | filters, count first |
| 1,800 company cards for a list of domains | Company Enrichment by Domain | website domains |
| 5,000 people rows from 35+ filters, count and market shape free | People Search | filters |
| 1,250 emails at the current employer for profile URLs you hold | Email Finder | profile URLs |
| 900 verified US mobile numbers | Phone Number Finder | profile URLs, emails or names |
| 3,100 full career records, or rows of a CSV resolved by any key | Profile Lookup, Bulk People Enrichment | profile URLs, or a CSV |
| 3,100 people behind email addresses | Reverse Email Lookup | emails |
| 4,100 employers hiring for a role, with their hiring pace | Companies Hiring Now | job titles, locations |
| 12,500 job postings with the company card, or 6,200 with the named recruiter and the employer's pace | Jobs Scraper, Jobs Database API | title, location, filters |
Misses are free rows on every one of them, so the budget goes to answers, not attempts.
How to make the credit go far
Five habits, all of them free:
-
Count before you buy. Company Search and the jobs Actors have
previewOnly; People Search hasmode: "count"andmode: "market". A count tells you the size of a segment, a market run tells you its shape, and neither charges a row. -
Let the misses be free. A person with no email, a domain nobody claims, a namesake with five holders: each comes back as a row with a
_statusand a note, and no charge. Read the notes; they are the autopsy of your list. -
Say what a row must have.
mustHave(currentWorkEmail,personalEmail,phone,githuband so on) means a row without it is skipped free and counted in one note row, instead of delivered and paid for. -
Never pay for the same person twice.
excludeDatasetson the search Actors takes the datasets of earlier runs and leaves everyone in them out. A weekly rerun costs only the new people. -
Cap the run.
maxResults,maxRows,maxPerCompany, andcallOptions.maxTotalChargeUsdwhen an agent is doing the calling.
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.
Start from a filter: you have an ICP, not a list
B2B Leads Finder
B2B Leads Finder 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.
Job titles, seniority buckets, countries or regions (dach, nordics, latam), 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.
{
"jobTitles": ["vp sales", "head of sales"],
"countries": ["us"],
"companySizeMin": 50, "companySizeMax": 500,
"industries": ["Software Development"],
"emailType": "work",
"maxPerCompany": 2,
"maxResults": 200
}
Every row is a person with a live email: name, title, headline, the address and whether it is work or personal, both when both exist, company name, domain, size and industry, location, the profile URL, X, GitHub and Facebook links where on record, a phoneOnRecord flag (switch on includePhones for the number itself), a stable personId and a _freshness bucket. People without an email are not delivered and not charged; the note rows say how many, and why.
That is a send-ready list, and the reason the family exists. Next: excludeDatasets for next week's delta, Profile Lookup when you want the whole career behind a lead, Phone Number Finder for the call list. The deep dive: Apollo alternative in Claude Code: 7 lead lists from one Apify Actor.
People Search
People Search 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.
Three modes. count answers with one number. market 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; segments compares up to ten variants in one run. people returns the rows at the tier you choose: row (name, title, employer, location, email flags), profile (the career record) or contacts (plus emails and phones), with compact for agents.
This is where the signals live: who left a competitor since last year (pastEmployerDomains plus leftPastEmployerAfterYear), who started a role this quarter (currentRoleStartedAfterDate), fractional execs by headline. Two worked examples: the warmest cold list, people who left one company since 2025 and fractional CFOs by headline.
Company Search
Company Search builds the account list: countries or groups, industries (a sector covers everything under it), HQ city or state, founding year, headcount band, and funding: hasFunding, last round after or before a date, the stage of the last round, the amount. previewOnly: true first.
{
"countries": ["gb"],
"industries": ["Financial Services"],
"hqLocations": ["London"],
"employeesMin": 51, "employeesMax": 200,
"fundedAfter": "2024-01-01",
"previewOnly": true
}
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.
The domain column is the handle for everything below: paste it into Company Employees, Decision Makers or Lookalike Company Finder.
Companies Hiring Now
Companies Hiring Now turns a job search into the employers behind it. Job titles as boolean lines ("account executive" OR "sales development"), countries, states or cities, how far back, experience level, employment type, industries, agencies out. Turn on decisionMakers with roles, a per-company cap and title keywords, and each employer comes with the people who own the budget.
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.
Then one row per decision maker: name, title, seniority, profile URL, freshness.
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.
Jobs Database API
Jobs Database API 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.
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. previewOnly gives the market breakdown free; compact keeps rows short.
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.
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: half of US backend postings were copies and ghost jobs, measured.
Start from domains: you have the accounts
Company Enrichment by Domain
Company Enrichment by Domain takes a column of websites in any form (acme.com, a URL with a path, www) 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.
{ "domains": ["acme-robotics.com", "https://www.northwind-logistics.co.uk/about"] }
Three statuses. found is the card. not_found means no company lists this domain as its site, free. ambiguous means several unrelated pages claim it, or it is a shared host like github.io, 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.
Decision Maker Email Finder by Domain
Decision Maker Email Finder by Domain answers the question every account list ends with: who runs this place. Domains in, up to five hundred per run, roles to pick from founders, C-level, VPs and directors, maxPerCompany in rank order, titleKeywords to keep only marketing, finance or engineering.
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 email 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.
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.
Company Employees
Company Employees is the org map. Domains in, and profileDetail decides the depth: roster for the staff list (name, title, seniority, headline, city, email flags, profile URL, freshness stamps), profile for the career record of each person, contacts for emails, phones and social links. roles keeps seniority buckets, titleContains and titleExcludes pick departments, mustHave keeps only people you can reach, excludeLowSignal drops self-declared profiles, compact keeps rows short for agents.
{
"companies": ["acme.com"],
"roles": ["vp", "director"],
"titleContains": ["sales", "revenue"],
"profileDetail": "contacts",
"mustHave": ["email"],
"compact": true
}
Why the roster first: it is the cheapest tier and it carries hasWorkEmail and hasPersonalEmail per person, so you can pick the twelve people who matter and send only those to the contacts tier or to the Email Finder.
A repeat of an employee already delivered never charges, so re-running an account next month costs only the new hires. Full walk-through: account mapping by company domain.
Start from people you already have
Email Finder
Email Finder takes profile URLs or bare handles, up to a thousand per run, and returns the addresses on record, never a pattern guess.
Each row is labelled: work_current for the current employer's domain, work_other for an older company address, personal when includePersonalEmails is on, with the whole workEmails list and a count. A profile with nothing on record is a free no_email row that still names the person and says when a personal mailbox exists.
The labels are the product. A list of two hundred URLs becomes three piles, send now, verify first, skip, in one run: bulk email finder in Claude Code. For the "verify first" pile, Work Email Finder takes name plus domain, ranks candidates and checks the best one against the mail domain.
Phone Number Finder
Phone Number Finder 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 _freshness bucket.
A known profile without a number is a free no_phone row. It is US-centric by design, so run it on US rows and expect little elsewhere. The call-list recipes: Lusha and ZoomInfo alternative in Claude Code.
Profile Lookup and Bulk People Enrichment
Profile Lookup 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, updatedAt for the record's age, and with contacts on, the emails and phones.
It also reads the input names other profile scrapers use (urls, publicIdentifiers), so an existing integration only changes the Actor id.
Bulk People Enrichment 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 ambiguous row with the holder count, never a guess, and rows stream into the dataset as they resolve.
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.
From an email, a name or a handle
Reverse Email Lookup turns any email into the person's full career row.
Email to Profile Finder is the lighter version: profile URL, name, headline, title, company and location, with a name beside a work address to find more. Name to Profile resolves "Jane Smith, acme.com" to the profile and career.
Social Handle Lookup does the same from a GitHub, X or Facebook handle. All four: an invalid or unmatched entry is a free row that says so.
The rest of the family, one line each
| You hold | Actor | You get |
|---|---|---|
| a Sales Navigator search URL | Sales Navigator Search | the people the search describes, count first, no cookies or seat |
| a filter box and calls to make | Leads with Phones | leads where every row has a verified mobile and a live email, the Lusha alternative |
| a competitor's domain | Former Employees Finder | alumni, when they left, where they are now |
| your target accounts | New Hires Finder | who joined in the last months, with title, start month and seniority |
| three good customers | Lookalike Company Finder | similar companies by industry, country and size, each row with its match reason |
| a domain and no name | Company Email Format Finder | the real address pattern, from addresses on record |
| a messy CSV | Waterfall Lead Enrichment | whatever key each row carries, resolved to a profile with contacts, the Clay alternative |
| a job search | Jobs Scraper | postings in bulk with the full description and the company card |
| personal emails | Email to Company | the employer and title behind a gmail address |
| emails or handles | Email to Phone, Name to Phone, the Facebook and X doors | the same person, from the key you have |
Work the table on your machine
Every run writes a dataset, and a dataset exports as JSON, CSV or XLSX from the Console or from one URL:
https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&clean=true&token=<APIFY_TOKEN>
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 WHERE in pandas.
SELECT fullName, jobTitle, companyName, email
FROM 'leads.csv'
WHERE emailType = 'work' AND _freshness IN ('fresh_90d', 'updated_1y')
Join on companyDomain to the company cards, dedupe on personId, 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.
Four combinations worth stealing
-
Hiring signal to inbox. Companies Hiring Now (the titles your product serves, agencies out, decision makers on), then Company Employees (
roles: ["vp", "director"],titleContainsfor the function), then Email Finder on the rows you picked. - Inbound in one minute. 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. The write-up.
-
Competitor alumni. People Search with
pastEmployerDomainsandleftPastEmployerAfterYear,marketfirst to see where they went, thenpeoplewithmustHave: ["email"]. -
CRM refresh. Bulk People Enrichment on the CRM export; rows whose current employer no longer matches the CRM, or whose
updatedAtis old, are the ones to re-check, and Company Employees on the old domain tells you who replaced them.
Wiring: Claude Code, MCP, REST, n8n
Pin the Actors you use in the server URL, so an agent loads only those definitions:
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 <APIFY_TOKEN>"
{
"mcpServers": {
"apify": {
"type": "http",
"url": "https://mcp.apify.com?tools=b2bsearch/b2b-leads-finder,b2bsearch/company-employees,b2bsearch/domain-to-company",
"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }
}
}
}
Tool names use a double hyphen (b2bsearch--company-employees). Any Actor is also one REST call that returns the rows in the response:
curl -X POST "https://api.apify.com/v2/acts/b2bsearch~domain-to-decision-makers/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"domains": ["acme.com"], "roles": ["founder", "cxo"], "maxPerCompany": 3}'
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.
FAQ
Is any of this scraped when I run it? 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.
Which Actor first? 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.
What happens on a miss? A free row with _status and a note. Not found, no email, ambiguous domain, namesake, skipped by mustHave: each has a name, and none is charged.
How fresh is the data? Rows carry _freshness and updatedAt, and the search Actors take updatedAfter. It is a database, so a record can be months old, and it tells you when.
Does the free plan get the same rows? Yes, with a cap per run and a monthly allowance per Actor; counts and previews are outside both.
For AI agents reading this
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:
- filters:
b2bsearch--b2b-leads-finder,b2bsearch--people-database-search(mode: "count"first),b2bsearch--company-database-search(previewOnly: truefirst) - domains:
b2bsearch--domain-to-company,b2bsearch--domain-to-decision-makers,b2bsearch--company-employees(compact: true) - profile URLs:
b2bsearch--linkedin-email-finder,b2bsearch--linkedin-to-phone,b2bsearch--profile-lookup - emails:
b2bsearch--email-to-linkedin,b2bsearch--reverse-email-lookup; a CSV:b2bsearch--bulk-people-enrichment - job titles:
b2bsearch--hiring-companies-finder,b2bsearch--linkedin-job-search-api(previewOnly: truefirst)
Every row has _status; rows other than found are free and explain themselves in _note or _error. Read results with get-dataset-items and a fields list. Set callOptions.maxTotalChargeUsd on every paid run; per-plan pricing is on each Actor page. Platform docs: Apify MCP server and apify.com/agents.md.
Top comments (0)