Find Decision Makers and Contact Information from Company Names
Finds senior decision-makers (Director, VP, Head, C Suite, Owner, Partner) and their emails for a list of companies using MoltSets, filtered by deliverability risk score (A/B/C/D/F). Works for any CSV of company names + domains, not just exhibitor lists. Handles messy real-world data like name collisions, missing domains, and emails that aren't indexed under the obvious search.
example prompts
-
find people at these companies -
get me contacts for this exhibitor list -
senior execs at each of these companies
about this skill
What this skill does
Turns a raw list of companies (name + domain, typically from an event exhibitor list) into a table of senior contacts with verified, risk-scored email addresses. Built from hard-won trial and error against messy small-business data — most companies on a list like this are NOT well-indexed, and the naive approach (search_people with a company_domain filter, stop after 2 hits) misses the majority of real, findable emails.
Chain
CSV of company name + domain
to search_people (free-text query first, then exact company name for the fuller roster)
to linkedin_to_best_email / search_business_email_by_name (chase an email per qualifying person)
to reverse_linkedin_lookup (confirm an email genuinely doesn't exist)
to reverse_email_lookup (pattern-guess common conventions, batched)
each email checked against acceptable risk score (A/B/C/D/F) before it counts toward the target
Inputs
- Company list — name + domain per row (exhibitor list, prospect list, account list)
- Target seniorities — default: Director, VP, Head, C Suite, Owner, Partner
- Emails per company — asked up front, never silently defaulted
- Acceptable risk scores — asked up front; recommended default is A, B, C, F (D excluded, since D means a confirmed bounce, complaint, or spam trap)
- LinkedIn-only fallback — whether to fill the count with LinkedIn-only rows when an acceptable-score email comes up short
When it activates
- "find people at these companies"
- "get me contacts for this exhibitor list"
- "senior execs at each of these companies"
- A CSV with company name/website columns uploaded alongside a request for contacts
Output
A CSV: row, company, domain, contact_name, title, seniority, email, email_type, risk_score, verification_status, linkedin_url, notes. Every match is tagged VERIFIED / INFERRED / UNVERIFIED / NOT FOUND so rows are safe to act on — LinkedIn-only fills, stale addresses, and out-of-range risk scores are flagged, not silently mixed in.
Search filters
search_people filters on query, company, company_domain, country, state, city, seniority, department or functional_area, industry, linkedin_industry, naics_code, employee_range, and revenue_range.
- Filters are free precision - execution cost comes from the free-text
query, so a filters-only search runs ~40x cheaper and lands more precisely. A barequeryis never the right shape; at minimum it getscountryattached (~99% fill rate). - Size and revenue apply to the person's current employer - "VPs at 51-200 employee software companies" is one call, not a company search followed by a people search.
- Three industry vocabularies - broad
industrybuckets, LinkedIn's ~150 niche labels, or a NAICS code at any depth. Shortening the code widens the net. - Sparse filters are the usual cause of a thin result set -
seniority/industry/departmentare ~60% filled andnaics_code/linkedin_industry~50%, and every filter is exact-match, silently dropping records where the field is empty. - Sizing is free -
count_only: truereturns a match count without fetching data or charging tokens, and every response carriesresults.totalto read before paginating.
Tips
- Free-text
querybeats the exactcompanyandcompany_domainfilters on messy small-business data —companyis an analysed match, so every word you pass must appear in the stored name, and one extra word zeroes the result. Start withquery(pluscountry— never bare), then use the exact stored name to pull the fuller roster. This is the one workflow where a query-led search is right; everywhere else, filters first - Chase order per person: email in the search result →
linkedin_to_best_email→search_business_email_by_name→reverse_linkedin_lookup→ pattern-guessing, checking each result's risk score as it surfaces and moving on if it's outside the acceptable set - Pattern-guess a standard 6-convention set through
reverse_email_lookup(batched, up to 100 per call, no token cost on misses) before giving up — it finds real emails the forward tools miss - Calibrate on a ~20-row batch first; expect roughly half to two-thirds of small/local exhibitors to yield usable contacts