Spanish Business Email Finder
Pricing
from $2.00 / 1,000 email founds
Spanish Business Email Finder
Find the verified contact email of Spanish businesses from their websites. Exploits the legally mandatory "Aviso Legal" page (LSSI law) that Google Maps and generic extractors miss. 84% hit rate measured on real businesses. Chain it after any Google Maps scraper. Pay only for emails found.
Pricing
from $2.00 / 1,000 email founds
Rating
0.0
(0)
Developer
RodimuxAI
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Find the contact email of Spanish businesses from their website.
Google Maps gives you the name, phone, address and website. It does not give you the email — and email is the one field you can actually do outreach with at scale.
This Actor closes that gap: feed it websites (typically the output of any Google Maps scraper) and it returns the verified contact email of each business.
84% hit rate, 100% precision on a ground-truth sample of 43 real Spanish businesses, averaging 1.23 pages crawled per site. Only delivered emails are charged.
Why it beats generic email extractors on Spanish sites
Three things generic extractors don't do:
1. It exploits the Aviso Legal. Spanish law (LSSI, art. 10) requires every commercial website in Spain to publish its contact details on a legal-notice page. That page holds the company's official email — and almost nobody crawls it. Here it gets top crawl priority and the highest scoring weight.
2. It reads JSON-LD in the <head>. WordPress + Yoast emits schema.org/Organization structured data with an email field. It lives in the <head>, so extractors that only read visible text miss it — and half of small-business Spain runs on WordPress. It's the highest-confidence source there is: the business declaring its own contact. In validation, JSON-LD decided 1 in 7 delivered emails.
3. It understands the Spanish micro-business. In a small clinic, the business email often is the owner's surname (nasser@clinicanasser.es). A naive filter throws it away for "looking personal". Here, if the prefix is part of the trade name, it's recognized as the business identity — not an employee.
How to use it
Option A — paste websites. Paste the list into Business websites, hit Start, export the table as CSV or Excel when done.
Option B — chain it after a Google Maps scraper. Run any Maps scraper, copy that run's dataset ID and paste it into Source dataset ID. This Actor reads the websites straight from there: no CSV export, no copying columns by hand.
URLs are deduplicated by domain, so it doesn't matter if the source brings several pages of the same business: it's processed — and charged — once.
What it does, in order
- Opens the homepage and extracts candidates from
mailto:links, JSON-LD and visible text (de-obfuscatinginfo (arroba) clinica.es,info [at] clinica.es,hola @ clinica . es). - If it already has a business email, it stops there — no more pages spent.
- Otherwise it queues same-domain pages by priority: legal notice → contact → privacy → about.
- Scores all candidates (source, page type, domain match, role prefix) and picks the best.
- Verifies the domain has MX records, discarding dead domains.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
startUrls | array | — | Business websites. |
sourceDatasetId | string | — | Run ID of another Actor (e.g. a Google Maps scraper). Websites are read from there directly. Alternative to startUrls. |
sourceDatasetField | string | auto | Field holding the URL in that dataset. Empty = autodetected (website, url, web, site, domain…). |
maxPagesPerSite | int | 6 | Page budget per site. |
includePersonalEmails | bool | false | Include emails that look like a specific person's. See §Legal. |
requireMx | bool | true | Discard emails whose domain can't receive mail. |
maxConcurrency | int | 5 | Parallel requests. |
Output
One record per website:
{"domain": "raiolanetworks.es","bestEmail": "info@raiolanetworks.es","emails": ["info@raiolanetworks.es"],"foundOn": "https://raiolanetworks.es/","sourceType": "jsonld","emailKind": "role","pagesVisited": 1,"status": "found"}
(Real output. The email lived only in the page's JSON-LD — a text-only extractor would have returned nothing.)
status is found, not_found or error. sourceType tells you where it came from: jsonld, legal, contact, privacy, about, other.
Pricing
Pay per event: only email-found is charged. If a site has no findable email, you don't pay for it. Failed attempts cost nothing.
Legal — read before using
- By default only business role emails are returned (
info@,citas@,contacto@, or the trade name). Emails that look like a specific person's are excluded unless you deliberately enableincludePersonalEmails. - A personal email is personal data under GDPR even if published. Published ≠ free to use.
- The Actor respects each site's
robots.txt. - You are the data controller for whatever you extract and how you use it. In Spain, commercial email is regulated by LSSI (art. 21) and GDPR: you need a legal basis, transparency and opt-out. This tool gives you the data; compliance is on you.
- Don't use it for unqualified mass cold mailing.
Development
npm installnpm test # 18 tests of the pure functions, no network, no Apify# Real local run: edit storage/key_value_stores/default/INPUT.jsonnode src/main.js
src/extract.js is all pure functions (extraction, classification, scoring) and tests without spending a run. src/main.js only orchestrates crawling and charging.