Spanish Business Email Finder avatar

Spanish Business Email Finder

Pricing

from $2.00 / 1,000 email founds

Go to Apify Store
Spanish Business Email Finder

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

RodimuxAI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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

  1. Opens the homepage and extracts candidates from mailto: links, JSON-LD and visible text (de-obfuscating info (arroba) clinica.es, info [at] clinica.es, hola @ clinica . es).
  2. If it already has a business email, it stops there — no more pages spent.
  3. Otherwise it queues same-domain pages by priority: legal notice → contact → privacy → about.
  4. Scores all candidates (source, page type, domain match, role prefix) and picks the best.
  5. Verifies the domain has MX records, discarding dead domains.

Input

FieldTypeDefaultWhat it does
startUrlsarrayBusiness websites.
sourceDatasetIdstringRun ID of another Actor (e.g. a Google Maps scraper). Websites are read from there directly. Alternative to startUrls.
sourceDatasetFieldstringautoField holding the URL in that dataset. Empty = autodetected (website, url, web, site, domain…).
maxPagesPerSiteint6Page budget per site.
includePersonalEmailsboolfalseInclude emails that look like a specific person's. See §Legal.
requireMxbooltrueDiscard emails whose domain can't receive mail.
maxConcurrencyint5Parallel 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.

  • 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 enable includePersonalEmails.
  • 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 install
npm test # 18 tests of the pure functions, no network, no Apify
# Real local run: edit storage/key_value_stores/default/INPUT.json
node 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.