Collect publicly listed business contacts.
Website Contact Extractor
Extract public contact information from website URLs, including email addresses, phone numbers and social links where available.
What you can do
Enrich your own website research lists.
Export contact fields to your reporting workflow.
Set your sources
Open the scraper and enter your own URLs, search terms and limits.
Review & run
Check the cost estimate and confirm the task. Follow its progress in your account.
Use your data
Explore saved results and export CSV, JSON or XLSX. Downloads of saved results are free.
Sample data & output fields
These example values demonstrate the data shape; they are not a live scraper result. Available fields depend on the source, selected options and upstream data.
[
{
"websiteUrl": "https://example.com/result",
"primaryEmail": "[email protected]",
"allEmails": [],
"primaryPhone": "Example primary phone",
"status": "success"
}
]| Field | Type | Description |
|---|---|---|
websiteUrl | string | The normalized website URL that was crawled. |
primaryEmail | string | The highest-ranked email address. |
allEmails | array | Deduplicated email addresses ordered by outreach quality. |
primaryPhone | string | The highest-precision valid phone number in E.164 format. |
status | string | Whether the website produced contacts, produced no contacts, failed, or was skipped by a run guard. |
Example input
This is the configured parser input. Replace the example sources with your own and review all limits before running.
{
"urls": [
"konditorei-buchwald.de"
],
"maxPagesPerSite": 20,
"verifyEmails": false,
"maxConcurrency": 5,
"maxWebsitesConcurrency": 5,
"requestTimeoutSecs": 15,
"maxSiteDurationSecs": 90,
"respectRobotsTxt": true,
"jsFallback": false,
"useProxy": false,
"proxyConfiguration": {
"useApifyProxy": true
},
"verificationLevel": "mx",
"smtpFromAddress": "[email protected]",
"includePersonalNames": true
}Explore input fields
| Field | Type | Notes |
|---|---|---|
urls | array | Required. Add 1–10,000 bare domains or full website URLs, one per line. Inputs are normalized and deduplicated by company domain before scanning. |
maxPagesPerSite | integer | Maximum number of pages to inspect on each website, from 1 to 200. This setting does not affect the price. |
verifyEmails | boolean | Optionally check each found email at the selected verification level. This is charged once per email actually verified. |
maxConcurrency | integer | Maximum number of page requests running at once within a website, from 1 to 20. Requests to any single host remain sequential. |
maxWebsitesConcurrency | integer | Maximum number of different websites scanned at the same time, from 1 to 20. |
requestTimeoutSecs | integer | How many seconds to wait for an individual page before treating that request as failed. |
maxSiteDurationSecs | integer | Hard wall-clock limit for one website. This prevents a slow or broken site from delaying the rest of your lead list. |
respectRobotsTxt | boolean | Honor each website's robots.txt rules. Enabled by default; turn it off only when you have a lawful reason and permission to do so. |
jsFallback | boolean | When the HTTP scan finds no email, retry only the homepage and best contact page in a headless browser. Each website that uses this fallback triggers a separate charged event. |
useProxy | boolean | Route requests through the selected proxy configuration. Proxy traffic may add charges from your Apify proxy plan. |
proxyConfiguration | object | Choose Apify Proxy or your own proxy URLs. This setting is used only when “Use a proxy” is enabled and proxy traffic may add charges. |
verificationLevel | string | Choose format-only validation, mail-server (MX) lookup, or an SMTP mailbox probe. Higher levels can take longer; every email actually checked is charged once. |
smtpFromAddress | string | Optional. Use a sender address on a domain you own for SMTP probes; this can improve acceptance and accuracy. Used only with the SMTP verification level. |
includePersonalNames | boolean | Try to associate each public email with a nearby person's name and job title when the page provides that context. |
Run through the API
Create an API key in your account, send the input to the queued endpoint and use the returned task ID to retrieve results. Sending a live request uses credits.
curl --request POST 'https://extracto.cloud/api/v1/parsers/website-contact-extractor/queue' \
--header 'X-API-KEY: ext_your_api_key' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--data-binary @- <<'JSON'
{
"input": {
"urls": [
"konditorei-buchwald.de"
],
"maxPagesPerSite": 20,
"verifyEmails": false,
"maxConcurrency": 5,
"maxWebsitesConcurrency": 5,
"requestTimeoutSecs": 15,
"maxSiteDurationSecs": 90,
"respectRobotsTxt": true,
"jsFallback": false,
"useProxy": false,
"proxyConfiguration": {
"useApifyProxy": true
},
"verificationLevel": "mx",
"smtpFromAddress": "[email protected]",
"includePersonalNames": true
}
}
JSONYour next dataset starts here.
Choose your sources, review the price and run Website Contact Extractor.