Prospect Engine: B2B Company and Contact Enrichment avatar

Prospect Engine: B2B Company and Contact Enrichment

Pricing

from $10.50 / 1,000 contact verifieds

Go to Apify Store
Prospect Engine: B2B Company and Contact Enrichment

Prospect Engine: B2B Company and Contact Enrichment

Turn a domain or a hiring keyword into enriched company records and verified contacts. Resolves the real employer behind a job posting, scores ICP fit, and returns one flat Clay-ready row per entity with per-field provenance. Bring your own vendor keys.

Pricing

from $10.50 / 1,000 contact verifieds

Rating

0.0

(0)

Developer

Mamba Labs

Mamba Labs

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

3

Monthly active users

8 days ago

Last modified

Share

🚀 What can Prospect Engine do?

Find the companies hiring for a role, work out who is actually employing them, enrich the company, and find the people to talk to. One actor, one run, flat Clay-ready rows.

The thing this does that a job scraper does not: it reads the job description to decide whether the company named on the posting is the real employer or just the board that posted it. A job board, an industry association or a staffing agency posting on someone's behalf gets reported as the company by every search engine, and that attribution is wrong in a way that produces no error.

📦 What you get⚙️ Features and integrations
🏢 The real employer, resolved with a confidence score
🎯 ICP score and tier from configurable rules
👤 Contacts with an optional verified email
🧾 64 flat fields, snake_case, one row per result
🔀 Four modes, from company enrichment to full chain
One container, no sub-actor calls and no markup
🔍 Per-field provenance in field_sources
⬇️ Export to JSON, CSV, Excel, HTML or XML

Bought by teams running role-triggered outbound who keep hitting the same problem: the company on the posting is not the company doing the hiring.

🚫 This actor ships no vendor keys and marks up no vendor cost. You supply your own provider keys and each vendor bills you directly. What you pay here is the Apify per-event charge and nothing else. A missing key is never silently reported as an empty result: the run returns a named error saying which key is absent and how to supply it.

💡 Why use Prospect Engine?

If you wantRead these fields
Who really employs this roleemployer_name, employer_confidence, employer_resolution_method
To catch a bad attribution before you sendposter_is_employer, poster_shape, needs_review, review_reason
To prioritizeicp_score, icp_tier, icp_reasons
The company recordcompany_domain, employee_band, industry, hq_location, company_phone
Someone to contactcontact_full_name, contact_title, contact_email, contact_email_status
To trust any of itfield_sources, source_status, source_conflicts, data_completeness

🕵️ Employer resolution is the whole point

Every search engine reports the poster as the company. When the poster is a job board, an association or a staffing agency, that is wrong and nothing errors.

This actor resolves the real employer from the job description, reports employer_confidence and employer_resolution_method, and sets needs_review with a review_reason when it cannot be sure. A posting whose employer cannot be resolved is excluded by the ICP rules and is not billed.

🔀 Four modes

ModeTakesReturnsNeeds
enrich_companiesdomains or company namesone merged company record each: identity, firmographics, LinkedIn, social, per-field provenanceno vendor key
discover_jobskeywordsone row per posting, employer resolved, signal typed, ICP scored, dedupedSerpAPI key
find_contactsdomainspeople, with an optional verified emailan email finder key for the email step
fullkeywordsall three chained, with the originating job signal on every contact rowSerpAPI plus email keys

You can try it with no keys at all. enrich_companies runs on the company's own website and public sources, so the prefilled input returns a real enriched record without you configuring anything.

In full, the job signal travels onto every contact row, so you can write copy anchored to the posting without joining anything back together.

📋 What data can Prospect Engine extract?

64 fields, grouped by stage. row_type tells you which shape a row is.

GroupFields
The postingjob_title, job_url, posting_date, posting_age_days, source_board, location, is_remote, job_description_snippet, matched_keyword, is_new_posting
The signalsignal_type, signal_strength, signal_evidence
Employer resolutionposted_company, employer_name, employer_confidence, employer_resolution_method, poster_is_employer, poster_shape, needs_review, review_reason
The companycompany_name, company_domain, company_linkedin_url, linkedin_slug, employee_count, employee_band, industry, hq_location, company_description, company_phone, company_type, identity_confidence
Socialfacebook_url, instagram_url, x_url, youtube_url
ICPicp_score, icp_tier, icp_reasons, icp_excluded, icp_exclusion_reason
The contactcontact_full_name, contact_title, contact_seniority, contact_department, contact_linkedin_url, contact_email, contact_email_status, contact_email_source, contact_match_confidence
Trustfield_sources, source_status, source_conflicts, data_completeness, notice, error

⚠️ needs_review is not a warning you can ignore. It means the employer behind a posting could not be resolved with confidence, which is exactly the case where sending outreach embarrasses you. Filter it out, or route it to a human, before anything reaches a sequence.

🛠️ How to build a prospect list from a hiring signal

  1. Open the Input tab and set mode. Start with enrich_companies if you have no keys yet.
  2. For discover_jobs or full, put role titles in keywords and add your serpapi_key.
  3. Set min_icp_score to your threshold and pick an icp_preset.
  4. Click Start.
  5. Drop rows where needs_review is true, then work by icp_tier.

🧪 Using it in Clay

Add an Apify enrichment column. Every input is accepted as a string, which is what Clay sends, and every output field is a flat column.

Use full when you want one row per contact already carrying the job signal that found them. Use enrich_companies when you already have the account list.

🎯 ICP scoring is configurable rules, not a hardcoded profile

Two presets ship: editorial_services, which encodes real drafted-versus-skipped decisions from a live outbound pipeline, and generic_b2b.

Hard excludes: government and public sector, student and campus media, clinical records work inside an EMR, staffing and recruitment platforms, and any posting whose employer cannot be resolved.

Scores up: contract, temporary and on-call roles, because a company posting one is already shopping for the thing a managed service sells.

Size is not a disqualifier. Large employers score neutral and carry a buyer-check note telling you to target functional owners rather than the C-suite.

🔑 Vendor keys

KeyNeeded for
serpapi_keydiscover_jobs and full. Note this is SerpAPI, not Serper
serper_api_keyfind_contacts needs this in practice. See the callout below
icypeas_api_key or prospeo_api_keyfinding emails
bounceban_api_keyverifying emails

💵 How much does it cost to run a prospecting pipeline?

Charged on output only. You are charged for a result once it carries the thing being sold, never for making a request. The primary event is contact-verified.

EventFreeBronzeSilverGold
Company enriched, full$0.0800$0.0720$0.0640$0.0560
Company enriched, basic$0.0200$0.0180$0.0160$0.0140
Contact verified$0.0150$0.0135$0.0120$0.0105
Job posting discovered$0.0100$0.0090$0.0080$0.0070

There is also an Actor start event at $0.00005, charged once per run per GB of memory.

Running full is cheaper again. The chained path bills its own event set at 25% below the single-mode rates, because one run doing all three stages costs less to serve than three runs doing one each. It is applied automatically; there is nothing to configure.

Assembling the same work from the individual Mamba Labs actors costs more:

What you getHereAs separate actorsYou save
Company enriched, basic$0.0200$0.032038%
Company enriched, full$0.0800$0.177055%
Job posting discovered$0.0100$0.020050%

💳 Nothing is charged for a miss. A contact found without an email is free. A company no external source could enrich is free. A posting whose employer could not be resolved is free. A cache hit is free. A notice row is free. Free Apify plans get 10 charged results a month; when the limit is reached the run finishes normally, returns what it produced, adds a row explaining the limit and charges nothing past it. Vendor API costs are yours and are not marked up.

⌨️ Input

Everything is on the Input tab. The options worth explaining:

FieldTypeDefaultWhat it does
modestringenrich_companiesenrich_companies, discover_jobs, find_contacts or full.
domains, company_namesarray[]Input for the company and contact modes.
keywordsarrayeditorial presetRole titles for the discovery modes.
country, location, remote_onlystringusGeographic scoping.
lookback_daysstring30Posting age ceiling.
max_results, max_pagesstring25, 1Discovery depth.
new_postings_only, previous_run_datestringfalseDelta detection.
exclude_staffing, exclude_marketplaces, extra_marketplacesstring, arraytrueNoise filters.
fetch_posting_pagestringtrueRead the description. Employer resolution depends on this.
target_contactsstring3People wanted per company.
job_titles, seniority, departmentsarray[]Contact filters.
include_email, verify_emailstringfalse, trueEmail discovery and verification.
score_icp, icp_preset, min_icp_scorestringtrue, editorial_services, 45Scoring.
include_socialstringtrueSocial profile enrichment.
source_timeout_secsstring30Per-source ceiling.
skip_cachestringfalseIgnore the 7 day cache.

📤 Output

Flat rows, exportable as JSON, CSV, Excel, HTML or XML.

{
"mode": "full",
"row_type": "contact",
"job_title": "Contract Copy Editor",
"job_url": "https://example.com/jobs/123",
"posting_date": "2026-08-01",
"posted_company": "MediaBistro Job Board",
"employer_name": "Example Publishing",
"employer_confidence": 0.91,
"employer_resolution_method": "description_entity",
"poster_is_employer": false,
"needs_review": false,
"company_domain": "examplepublishing.com",
"employee_band": "201-500",
"industry": "Publishing",
"icp_score": 78,
"icp_tier": "A",
"contact_full_name": "Jane Doe",
"contact_title": "Managing Editor",
"contact_seniority": "head",
"contact_email": "jane.doe@examplepublishing.com",
"contact_email_status": "valid",
"data_completeness": 82
}

💡 Tips

  • Run enrich_companies first with no keys at all. It is the cheapest way to see whether the output shape fits your table.
  • Keep fetch_posting_page on. Employer resolution reads the description, and turning it off removes the actor's main advantage.
  • Use full rather than three separate runs. The chained event set is 25% cheaper and the job signal arrives already attached to the contact.
  • Filter needs_review before icp_score. A high score on an unresolved employer is a confident wrong answer.
  • Enable the Apify Proxy with the residential group. Search engines and LinkedIn block datacenter IPs from the platform, which lowers name-to-domain and LinkedIn resolution rates without it.

⚠️ Known limits

Contact discovery is the least proven part of this actor. The people cascade and the email waterfall are written against each vendor's documented API and covered by tests, but they have not been run against live vendor accounts. Treat contact output as less proven than company output.

full takes about 53 seconds on a four-company run, roughly 13 seconds per company. That is over the 20 to 25 second per-company target the architecture was chosen against. The saving over a fan-out design is real, but it is a saving on container starts, not on network time, and network time dominates once the containers are gone. Measured mode timings: discover_jobs 6s for 6 postings, find_contacts 7s for 1 company, enrich_companies 9s for 2 companies.

⚠️ find_contacts needs a Serper key in practice, and the listing used to call it optional. Corrected 2026-08-12. Without a key the actor falls back to a free DuckDuckGo search, and Apify's IP ranges are reliably served an anti-bot challenge on it: measured on four domains on 2026-08-12, DuckDuckGo answered HTTP 202 with zero result blocks on every attempt. What survives without a key is only the people the actor can read off the company's own /team, /about/team or /about-us/team page, and most companies do not publish one in that shape. A find_contacts run with no key and no reachable team page returns a notice row and no contacts. You are not charged for contacts that were not found, and the run log now says so explicitly. enrich_companies and discover_jobs do not need this key.

Discovery needs a SerpAPI key, and it is SerpAPI, not Serper. The two are different products with similar names.

Employer resolution is a judgment, not a lookup. employer_confidence and needs_review exist because it is sometimes wrong, and they are there to be filtered on.

Without a residential proxy, resolution rates drop. Datacenter IPs from the platform are blocked by the search and social sources this depends on.

Results are cached for 7 days. Re-running the same company inside that window costs nothing.

❓ FAQ

Can I try it without any API keys?

Yes. enrich_companies runs on the company's own website and public sources and needs no vendor key. The prefilled input returns a real enriched record.

What happens if I forget a key?

The run returns a named error saying which key is absent and how to supply it. A missing key is never reported as an empty result.

Why is posted_company different from employer_name?

Because the poster is not always the employer. That gap is the reason this actor exists. poster_shape tells you what kind of poster it was.

Does it call other actors?

No. Everything runs in one container. There are no sub-actor calls, so you are not paying a second actor's list price on top of this one.

How do the chained rates work?

Automatically. Running full bills a separate event set priced 25% below the single-mode rates. There is nothing to opt into.

🧩 Want other GTM data?

Mamba Labs builds custom actors for B2B go-to-market teams. The public versions of that work live here on the Store, so our users get the same tooling we build under contract.

🧑‍💼 GTM Hiring Signal Scraper🧱 Tech Stack Detector
📡 B2B Buying Signals Aggregator🔑 Job Board Keyword Scanner
🔗 Domain to LinkedIn URL Resolver🎯 ICP Fit Scorer
📋 Job Posting Monitor📬 Domain Deliverability Checker
🏢 Company Firmographic Enricher🌐 Company Social Presence Mapper
🪪 Company Identity Resolver💰 Funding and Press Signal Scanner
🔄 Company Change-Event Feed👤 People Finder and Email Verifier
🤖 AI Tooling Detector📮 Outbound Stack Detector
📝 Publishing Frequency Tracker✉️ Work Email Waterfall Finder
Sequencer Lead Push🏅 Workplace Program Detector
👥 Team Page People Extractor🧭 Company Discovery List Builder

Every actor in the suite takes a domain or a company and returns one flat row, so they stack in the same Clay table without reshaping anything.

🛠️ Need something custom built for you or your team? Tell us what you are trying to find and we will build it. Talk to Mamba Labs.

🆘 Support

Something wrong, or an employer resolved incorrectly? Open an issue on the Issues tab with the posting URL and the row, and we will look at it.

ℹ️ Sourcing and legal. Postings come from the SerpAPI google_jobs engine against your own key and from public job boards. Company data comes from the company's own website and public structured data. Contact data comes from public sources and the licensed provider APIs you supply keys for. Contact records are personal data under GDPR and similar laws; you are the data controller and are responsible for your own lawful basis for contacting anyone. Vendor keys you supply are used for the run and are never written to the output.

Built by Mamba Labs.