Lead List Enricher
Pricing
from $1.80 / 1,000 enrichments
Lead List Enricher
🏷️ From $1.80 / 1K | Paste a list of company names or domains and get one row per company with its website, emails, phones, social profiles and firmographics, read from each company's own site. Unresolved and empty companies cost nothing.
Pricing
from $1.80 / 1,000 enrichments
Rating
0.0
(0)
Developer
丂卩ㄖㄖҜㄚ
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
🔍 What does Lead List Enricher do?
Paste a list of companies and get back one row per company with its website, the email addresses and phone numbers it publishes, its social profiles and its firmographics: description, tagline, logo, industry, founding year, size band, postal addresses, registration and VAT numbers. Give it names, with a town, postcode or country where you have them, or give it a list of domains you already know, and Lead List Enricher reads each company's own website and fills the row in.
The easiest way to try it is to click Try for free and run it on the five domains already in the input box. Then paste your own list in, as domains or as company names, and it works the same way.
Two things make it a lead list enricher rather than a page scraper. When you supply names, every website in the output has passed an evidence gate: the page has to carry the company's name and something tying it to the company you meant, its postcode, its company number, or the full registered name in legal form, with a town or country accepted only for the name exactly as you wrote it. A domain that merely looks right is refused, and every row records what proved the match. Contacts are the company's own: legal and privacy pages are read for registration numbers only, regulator and agency details are refused, and a social profile has to carry the company's name or domain. And the pricing follows the product: you pay per delivered row, and a delivered row always carries something. Companies that could not be matched to a website, and websites that turned out empty, are counted in the run summary and cost you nothing.
📊 What data can I extract?
One row per company that resolved and carried something. A field the company does not publish comes back null or empty rather than guessed.
| Field | What it holds |
|---|---|
| 🏢 companyName | The name as supplied, or the site's own name when the input was a bare domain |
| 📥 input | The input row echoed back: name, country, website, postcode, town, companyNumber, so the output joins to your list |
| 🌐 domain | The company's own website domain, lowercased, no protocol or www |
| 🔗 website | Full URL of the homepage that answered, after any redirect |
| 🧭 resolutionMethod | How the website was found: domain-list, supplied, slug-exact or slug-fuzzy |
| 🧾 resolutionEvidence | What proved the match, for example name-legal+town or supplied-website |
| ✉️ emails | The company's own addresses, classified role, personal or unclassified, with free provider and on-domain flags. Off-domain addresses only when the site publishes none on its own domain, and never a regulator's or an agency's |
| 📞 phones | Phone numbers, one per number whatever the formatting, tel links first, with their source and an onSiteContext flag that is false when the words beside the number name a third party |
| 📱 socials | One profile per platform, and only a handle that carries the company's name or domain: linkedin, twitter, facebook, instagram, youtube, github, tiktok, crunchbase, bluesky, threads |
| 🏷️ siteName | Trading name the site declares, from schema.org, then Open Graph, then the page title |
| ⚖️ legalName | Registered legal name, only where the site declares one separately |
| 📝 description | What the company says it does |
| 💬 tagline | The slogan, or the strapline beside the name in the page title |
| 🖼️ logoUrl | Absolute URL of the logo or site icon |
| 🏭 industry | Sector, only where the site declares a specific schema.org business type |
| 📅 foundedYear | Year founded, from a declared date or from founded and established wording |
| 👥 employeeRange | Size band such as 11-50, only where the site states a headcount |
| 📮 addresses | Postal addresses from schema.org markup and address elements, each with street, city, region, postalCode, country, raw and source |
| 🔢 registrationNumbers | Company registration numbers in Companies House form, 8 digits or two letters and 6 digits, read beside Registered in England, Company No or Companies House |
| 🧮 vatNumbers | VAT numbers from legal text on the site, kept apart from the company number |
| 🛡️ icoNumbers | ICO data protection registration numbers, Z or ZA and digits, kept apart from the company number |
| 🗣️ languages | Language codes the homepage declares |
| 📬 contactPageUrl | The contact page that was read, where one was found |
| 📄 pagesCrawled | How many pages of the site were read |
| 📚 pagesRead | Every page URL actually read for this company |
| 🗃️ source | Where the row was assembled from |
| ⏱️ retrievedAt | When this run collected the row |
🆚 What about the official route?
There is no official route to a company's contact details. Companies House publishes the registered name, number and office address as open data, and it is a good register for what it holds, but it holds no website, no email and no phone number. The only source for those is the company's own website, which is what this Actor reads.
Doing it by hand is the alternative: guess the domain, open the site, find the contact page, copy the email, repeat for the next name. Lead List Enricher does that for every company on your list in one run, records the evidence for each website match, and hands back one clean row per company that you can join straight onto the list you started with. There is no directory subscription, no purchased database and no private source behind it. Every detail in the output was published by the company itself on its own site.
💡 Why enrich a lead list from the company's own website?
Because the website is the primary source and it is current on the day you run. A bought list decays from the moment it is sold, and a database tells you what it held when it was last crawled. Reading the site directly means the phone number is the one the company publishes today and the address is the one in its own schema.org markup, with the page it came from listed on the row.
- A conference delegate list with only company names. Add a country to each and get websites, emails and phones back, one row per company, ready to import.
- A CRM full of accounts with a website but no contact details. Run the domains and fill in the email, phone, socials and description columns.
- A Companies House export with names, numbers and postcodes. The postcode and the company number are exactly the corroboration the evidence gate wants, so a register export resolves with high confidence.
- A spreadsheet from a trade show or an awards shortlist. Trading names and towns work when the name is the one the site uses: the name as you wrote it plus the town on the company's own site proves the match. A registered name the site abbreviates needs a postcode or a company number beside it.
- A list of prospects for a phone campaign. Set requireContact and only rows with an email or a phone are delivered and charged.
- A partner or supplier list that needs registration numbers. The row carries the company number and VAT number where the site states them in its footer.
🚀 How do I use Lead List Enricher?
- Open the Actor. Choose one list per run: domains when you already know each company's website, companies when you only have names.
- For companies, give each a name and, wherever you have it, a postcode, companyNumber, town or country. A website given with a company is verified and used rather than guessed.
- Set maxCompanies to bound the run, and switch requireContact on if only rows with an email or phone are worth paying for.
- Run it. The log reports each company as it resolves, is refused, or is delivered.
- Export the dataset as CSV, Excel or JSON, or read it over the API. The RUN_SUMMARY record in the key-value store holds the whole funnel.
⬇️ Input
| Field | Type | What it does |
|---|---|---|
| domains | array | Website domains to enrich directly, one per line. Resolution is skipped |
| companies | array | Objects with a name and optionally postcode, companyNumber, town, country and website |
| maxCompanies | integer | The most companies the run attempts, 1 to 500. Default 100 |
| includeEmails | boolean | Read email addresses. Default on |
| includeFirmographics | boolean | Read description, logo, addresses, registration numbers and the rest. Default on |
| maxPagesPerDomain | integer | Pages to read per site, homepage included, 1 to 8, each capped at 1MB. Default 5 |
| requireContact | boolean | When on, a row needs an email or a phone to be delivered and charged. Default off |
Domains mode:
{"domains": ["monzo.com", "octopus.energy", "pimlicoplumbers.com"]}
Companies mode:
{"companies": [{ "name": "Alfie Marketing Ltd", "town": "High Wycombe", "postcode": "HP14 3GA" },{ "name": "Pimlico Plumbers Limited", "town": "London", "companyNumber": "02012715" },{ "name": "Octopus Energy", "website": "octopus.energy" }],"requireContact": false}
Supply one list per run. A run given both is refused with the reason named, before any request is made, as is an IP address or a local network name given as a website.
⬆️ Output
Table view
One row per delivered company, with the company, its domain, the emails, phones and socials, the website, the description and the evidence side by side.
Run summary
Every run writes a RUN_SUMMARY record to its key-value store with the funnel in numbers: companies received, websites resolved, rows that qualified, rows delivered, and the companies that were unresolved, resolved but empty, uncharged because the spend cap arrived, errored or abandoned at the run timeout. The buckets always add up to the companies received. It also carries the HTTP fetch count by stage, timing per company, every unresolved company with the reason, and any internal fault by name, which is the first place to look when a list delivers fewer rows than it has names.
JSON
A real row, as delivered for { "name": "Pimlico Plumbers Limited", "town": "London" } on 25 August 2026:
{"companyName": "Pimlico Plumbers Limited","input": { "name": "Pimlico Plumbers Limited", "country": null, "website": null, "postcode": null, "town": "London", "companyNumber": null },"domain": "pimlicoplumbers.com","website": "https://www.pimlicoplumbers.com/","resolutionMethod": "slug-exact","resolutionEvidence": "name-legal+town","emails": [{ "email": "sales@pimlicoplumbers.com", "type": "role", "isFreeProvider": false, "onSiteDomain": true },{ "email": "recruitment@pimlicoplumbers.com", "type": "role", "isFreeProvider": false, "onSiteDomain": true },{ "email": "franchiseerecruitment@pimlicoplumbers.com", "type": "unclassified", "isFreeProvider": false, "onSiteDomain": true },{ "email": "accounts@pimlicoplumbers.com", "type": "role", "isFreeProvider": false, "onSiteDomain": true },{ "email": "customerservices@pimlicoplumbers.com", "type": "unclassified", "isFreeProvider": false, "onSiteDomain": true }],"phones": [{ "phone": "+442081080808", "source": "tel-link", "onSiteContext": true },{ "phone": "+442079288888", "source": "tel-link", "onSiteContext": true }],"socials": {"twitter": "https://twitter.com/pimlicoplumbers","facebook": "https://www.facebook.com/pimlicoplumbersltd","instagram": "https://www.instagram.com/pimlicoplumbers"},"siteName": "Pimlico Plumbers","legalName": null,"description": "Pimlico is London’s leading property maintenance service company, handling all your plumbing, heating, electrical, drainage, building, renovation and HVAC needs.","tagline": "Property Maintenance Services in London","logoUrl": "https://www.pimlicoplumbers.com/wp-content/uploads/2022/04/pimlico-plumbers-logo-2.png","industry": null,"foundedYear": 1979,"employeeRange": null,"addresses": [],"registrationNumbers": ["02012715"],"vatNumbers": ["522222539"],"icoNumbers": ["ZA783115"],"languages": ["en"],"contactPageUrl": "https://www.pimlicoplumbers.com/contact/","pagesCrawled": 5,"pagesRead": ["https://www.pimlicoplumbers.com/", "https://www.pimlicoplumbers.com/contact/", "https://www.pimlicoplumbers.com/about-us/", "https://www.pimlicoplumbers.com/policies/terms-of-use/", "https://www.pimlicoplumbers.com/policies/privacy-policy/"],"source": "the company website","retrievedAt": "2026-08-25T09:14:50.424Z"}
🧭 How the evidence gate works
Matching a name to a domain is a judgement, not a lookup, and the failure is expensive: a plausible wrong website in an outreach list. So when you supply a name without a website, at most eight candidate domains built from the name are fetched, most likely first, and a candidate is accepted only when its page shows the company name and one of these, in descending strength:
- the postcode you supplied appears on the page, or
- the company number you supplied appears on the page, or
- the page carries the full registered name in legal form, such as Alfie Marketing Ltd, which is itself a claim to be that company, or
- the town or country you supplied appears, and only for the name exactly as you wrote it. A shortened form of the name, Aspect Maintenance for Aspect Maintenance Services Limited, is never accepted on a town alone, because London is on a huge share of UK trade sites. And when you gave a postcode that the page does not carry, the town does not count either.
Two measured cases this design encodes. DAWLISH LIMITED, a London company, must not match dawlish.com, the Devon town website, however well the name fits. And Aspect Maintenance Services Limited of London SW18 must not match aspectmaintenance.co.uk, an Essex grounds maintenance firm whose page says "Essex, Kent & London", on the shortened name plus the word London. A page that offers the reader other businesses is refused as a directory, a parked domain is refused, and a domain that matches a second company in the same run is treated as a site that publishes company data rather than anyone's own website and blocked for the rest of the run.
A website you supply with a company is treated as your assertion. It is fetched and verified to answer with its own page, not an anti-bot challenge, a parking page or a business directory, and then used as given. In domains mode every domain is handled that way.
🧹 Whose contacts are they?
A company's own pages quote other people's details all the time: the ombudsman to complain to, the ICO's helpline, the credit reference agencies in a privacy policy, the gas emergency line, the PR agency in a press footer, the Bootstrap licence in a template. Those were all delivered as company contacts once. Now legal, privacy, terms and cookie pages are read for registration numbers only, a known list of regulator and agency domains and phone numbers is refused everywhere, an off-domain email is delivered only when the site publishes nothing on its own domain and only under a contact mailbox such as info or enquiries, a phone whose surrounding words name a third party is flagged onSiteContext false, and a social handle is taken only when it carries the company's name or domain.
🎯 Honest limits
- Coverage follows web presence. Many registered small companies have no findable website. They are counted as unresolved in the run summary and never charged.
- Names alone are weak input. A bare brand name with no town, postcode or country only resolves when the page carries the full legal name, and a registered name the site shortens needs a postcode or company number. Add a postcode or company number to every row you can.
- Contact pages that render only in JavaScript are missed. Everything is plain HTTP, which keeps runs fast and cheap. A site that publishes its email only through a script comes back with what its HTML carries.
- Big sites are sampled, not crawled. Up to eight pages per company, contact, about, team and legal pages first. Each page is capped at 1MB.
- Sites behind an anti-bot challenge are unresolved, not guessed at, and cost nothing.
- A partner's number can still slip through. Regulators and agencies are refused by list and by the words beside the number, but a commercial partner quoted on a contact page with no such wording, a boiler installer's quote line for instance, reads like the company's own. The onSiteContext flag and the page list on the row are there for that check.
💰 How much does it cost?
You are charged per delivered row, and only for delivered rows. A row is delivered when the website resolved and at least one substantive field came back: an email, a phone, a social profile, a description, an address or a registration number. With requireContact on, a row needs an email or a phone. Companies that could not be matched to a website and websites that came back empty cost nothing however much work they took, and maxCompanies is therefore a ceiling on the run's time, not a guess at its bill. The current price per row is on this page's pricing tab.
Apify also charges its standard Actor start event once per run. This Actor needs no browser and is capped at 256MB of memory, so that start charge is the smallest it can be. If you set a per run spend cap, the run charges up to the cap and reports in the summary how many qualified rows were left uncharged, so nothing is delivered unbilled and nothing is billed undelivered.
🔌 Integrations
Lead List Enricher runs on Apify, so you can schedule it (say, every Monday against the week's new sign-ups), push results to Google Sheets, HubSpot, Salesforce or anywhere else through Apify integrations, trigger it from Make or Zapier, and set webhooks on run completion.
It is also callable by AI agents through the Apify MCP server. An agent asked to "find the website, email and phone for these forty companies" can discover and run spookyweb/lead-list-enricher directly, read the structured output, and chain it into whatever it is building. The output schema is declared, so agents can consume the dataset without guessing its shape.
🔗 Using Lead List Enricher with the Apify API
curl "https://api.apify.com/v2/acts/spookyweb~lead-list-enricher/run-sync-get-dataset-items?token=YOUR_TOKEN" \-X POST \-H "Content-Type: application/json" \-d '{ "companies": [{ "name": "Alfie Marketing Ltd", "town": "High Wycombe" }, { "name": "Pimlico Plumbers Limited", "town": "London" }] }'
The run's dataset is plain JSON, one object per delivered company, and the Apify API gives you the same data as CSV or Excel with a query parameter. The run summary is at the RUN_SUMMARY key of the run's default key-value store.
❓ FAQ
What exactly am I charged for?
One charge per delivered row, nothing else. If a run receives 100 companies, resolves 60 websites and 45 of those carry something, you pay for 45. The other 55 are named in the run summary with the reason, and cost nothing.
What counts as something?
By default any of an email, a phone, a social profile, a description, an address or a registration number. A site name, a logo and a language code on their own do not count, because a row carrying only those tells you nothing you could not get from the domain. Switch requireContact on and only an email or a phone counts.
Should I give domains or names?
Domains whenever you have them. Resolution is the step that can fail, and a domain you supply skips it. When you only have names, add a town, postcode or country to each: a postcode is the strongest signal, and a bare brand name with no location only resolves when the site carries the company's full legal name.
How accurate are the website matches?
Every row records its evidence. A supplied website is your own assertion. A guessed one with postcode or company number evidence is as strong as it gets without a human check. Town or country evidence is only ever accepted for the name exactly as you wrote it, and the resolutionEvidence field exists so you can drop those rows if your outreach demands certainty.
Measured on 25 August 2026 against a 24 name UK trades list with towns only, no postcodes: 9 of 24 resolved and were delivered, 15 were refused or found no site, and on a hand check of the 9 every domain was the company's own, with one, a trading name matched on its town, not independently verifiable. No delivered row carried a regulator's, an agency's or a framework's contact. The same list before this release delivered 8 rows, one of them the wrong company, with the ombudsman, the ICO, Equifax, Experian and the gas emergency line among the phones and emails.
Why was a company unresolved when I know it has a website?
Usually because none of the candidate domains built from the name is the real one, for instance a trading name that differs from the registered name, or a .com where the name suggested .co.uk was tried first and something else answered. Supply the website with the company and it is verified and used. The run summary names every unresolved company with the reason.
Are Gmail and other free provider addresses included?
Yes, when the site publishes nothing on its own domain, with isFreeProvider set true so you can filter them. Small businesses often publish a free mailbox as their only contact, and throwing it away would lose real leads.
Does it use a browser or a proxy?
No. Everything is plain HTTP from the company's own site, which is why runs are fast and cheap. It reads at most eight pages per company and never more than 1MB per page.
How long does a run take?
Companies are worked six at a time and every request is bounded, so a list of 100 companies finishes in a few minutes. The run stops itself 45 seconds before its timeout, issues no further charges, waits for any charge already in flight, then writes the summary and the status message from one snapshot; anything unfinished is counted as abandoned and not charged.
What happens if something goes wrong mid run?
A company that hits an internal error is skipped, counted as errored, named in the run summary and not charged, and the run carries on. A run that has charged for a row always finishes SUCCEEDED with that row in its dataset, whatever happens after. The only run that fails is one given invalid input, which is refused by field name before any request is made.
⚖️ Is it legal to enrich a lead list this way?
This reads details a business has published on its own website so customers can reach it, which is business contact information. It reads only public pages and never anything behind a login, and it sends a handful of ordinary requests per company.
Where a detail identifies a named person, for example a personal mailbox on a small firm's site, UK GDPR applies and you are the data controller for what you do next. You need a lawful basis, typically legitimate interest for B2B contact, you must honour opt outs, and PECR governs how you may approach them. Apify's ethical scraping guide covers the wider picture.
👍 Your feedback
Found a bug, a site the gate refuses that it should accept, or a field you need that is not here? Open an issue on the Actor's Issues tab. Problems get fixed fast, and custom variants can be built on request.
🔎 You might also like
- Company Domain Finder to resolve one company name to its domain with a confidence score and the runners up
- Company Email Finder to find the work email pattern for a domain and verify it against MX records
- Company Data Enrichment for the deeper firmographic profile of a domain, including the technology stack
- UK B2B Lead Finder to build the list in the first place, from an industry and a UK town
- Website Contact Scraper for a full contact crawl of one site, with JavaScript rendering when it is needed