Prospect Engine: B2B Company and Contact Enrichment
Pricing
from $10.50 / 1,000 contact verifieds
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
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
3
Monthly active users
8 days ago
Last modified
Categories
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 want | Read these fields |
|---|---|
| Who really employs this role | employer_name, employer_confidence, employer_resolution_method |
| To catch a bad attribution before you send | poster_is_employer, poster_shape, needs_review, review_reason |
| To prioritize | icp_score, icp_tier, icp_reasons |
| The company record | company_domain, employee_band, industry, hq_location, company_phone |
| Someone to contact | contact_full_name, contact_title, contact_email, contact_email_status |
| To trust any of it | field_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
| Mode | Takes | Returns | Needs |
|---|---|---|---|
enrich_companies | domains or company names | one merged company record each: identity, firmographics, LinkedIn, social, per-field provenance | no vendor key |
discover_jobs | keywords | one row per posting, employer resolved, signal typed, ICP scored, deduped | SerpAPI key |
find_contacts | domains | people, with an optional verified email | an email finder key for the email step |
full | keywords | all three chained, with the originating job signal on every contact row | SerpAPI 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.
| Group | Fields |
|---|---|
| The posting | job_title, job_url, posting_date, posting_age_days, source_board, location, is_remote, job_description_snippet, matched_keyword, is_new_posting |
| The signal | signal_type, signal_strength, signal_evidence |
| Employer resolution | posted_company, employer_name, employer_confidence, employer_resolution_method, poster_is_employer, poster_shape, needs_review, review_reason |
| The company | company_name, company_domain, company_linkedin_url, linkedin_slug, employee_count, employee_band, industry, hq_location, company_description, company_phone, company_type, identity_confidence |
| Social | facebook_url, instagram_url, x_url, youtube_url |
| ICP | icp_score, icp_tier, icp_reasons, icp_excluded, icp_exclusion_reason |
| The contact | contact_full_name, contact_title, contact_seniority, contact_department, contact_linkedin_url, contact_email, contact_email_status, contact_email_source, contact_match_confidence |
| Trust | field_sources, source_status, source_conflicts, data_completeness, notice, error |
⚠️
needs_reviewis 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
- Open the Input tab and set
mode. Start withenrich_companiesif you have no keys yet. - For
discover_jobsorfull, put role titles inkeywordsand add yourserpapi_key. - Set
min_icp_scoreto your threshold and pick anicp_preset. - Click Start.
- Drop rows where
needs_reviewis true, then work byicp_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
| Key | Needed for |
|---|---|
serpapi_key | discover_jobs and full. Note this is SerpAPI, not Serper |
serper_api_key | find_contacts needs this in practice. See the callout below |
icypeas_api_key or prospeo_api_key | finding emails |
bounceban_api_key | verifying 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.
| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| 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 get | Here | As separate actors | You save |
|---|---|---|---|
| Company enriched, basic | $0.0200 | $0.0320 | 38% |
| Company enriched, full | $0.0800 | $0.1770 | 55% |
| Job posting discovered | $0.0100 | $0.0200 | 50% |
💳 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:
| Field | Type | Default | What it does |
|---|---|---|---|
mode | string | enrich_companies | enrich_companies, discover_jobs, find_contacts or full. |
domains, company_names | array | [] | Input for the company and contact modes. |
keywords | array | editorial preset | Role titles for the discovery modes. |
country, location, remote_only | string | us | Geographic scoping. |
lookback_days | string | 30 | Posting age ceiling. |
max_results, max_pages | string | 25, 1 | Discovery depth. |
new_postings_only, previous_run_date | string | false | Delta detection. |
exclude_staffing, exclude_marketplaces, extra_marketplaces | string, array | true | Noise filters. |
fetch_posting_page | string | true | Read the description. Employer resolution depends on this. |
target_contacts | string | 3 | People wanted per company. |
job_titles, seniority, departments | array | [] | Contact filters. |
include_email, verify_email | string | false, true | Email discovery and verification. |
score_icp, icp_preset, min_icp_score | string | true, editorial_services, 45 | Scoring. |
include_social | string | true | Social profile enrichment. |
source_timeout_secs | string | 30 | Per-source ceiling. |
skip_cache | string | false | Ignore 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_companiesfirst with no keys at all. It is the cheapest way to see whether the output shape fits your table. - Keep
fetch_posting_pageon. Employer resolution reads the description, and turning it off removes the actor's main advantage. - Use
fullrather than three separate runs. The chained event set is 25% cheaper and the job signal arrives already attached to the contact. - Filter
needs_reviewbeforeicp_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_contactsneeds 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/teamor/about-us/teampage, and most companies do not publish one in that shape. Afind_contactsrun 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_companiesanddiscover_jobsdo 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.
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_jobsengine 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.