{
  "data": {
    "id": "dQGvRqqlOq6MOtryc",
    "actId": "dVdgOhanoyG0MakwT",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-11-10T16:07:10.475Z",
    "finishedAt": "2026-11-10T16:07:42.678Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 32099,
      "runTimeSecs": 32.099,
      "computeUnits": 0.035665555555555555,
      "imageSizeBytes": 3245741056
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Website Contact Finder Input\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"urls\": {\n      \"title\": \"Website URLs\",\n      \"type\": \"array\",\n      \"description\": \"Websites to scan for public contact details. You can paste full URLs or bare domains; duplicates are removed.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"https://apify.com\"\n      ]\n    },\n    \"maxPagesPerSite\": {\n      \"title\": \"Max Pages Per Site\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of pages to fetch per website. Contact, about, team and imprint pages are prioritised.\",\n      \"default\": 20,\n      \"prefill\": 5,\n      \"minimum\": 1,\n      \"maximum\": 200,\n      \"editor\": \"number\"\n    },\n    \"maxConcurrency\": {\n      \"title\": \"Page Concurrency Per Site\",\n      \"type\": \"integer\",\n      \"description\": \"How many pages of the same website may be fetched in parallel.\",\n      \"default\": 5,\n      \"prefill\": 5,\n      \"minimum\": 1,\n      \"maximum\": 20,\n      \"editor\": \"number\"\n    },\n    \"maxSitesConcurrency\": {\n      \"title\": \"Website Concurrency\",\n      \"type\": \"integer\",\n      \"description\": \"How many websites are scanned in parallel. Lower this if you hit rate limits.\",\n      \"default\": 3,\n      \"prefill\": 3,\n      \"minimum\": 1,\n      \"maximum\": 10,\n      \"editor\": \"number\"\n    },\n    \"requestTimeoutSecs\": {\n      \"title\": \"Request Timeout (seconds)\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum time to wait for one page before trying the next proxy tier.\",\n      \"default\": 15,\n      \"prefill\": 15,\n      \"minimum\": 5,\n      \"maximum\": 60,\n      \"editor\": \"number\"\n    },\n    \"defaultCountry\": {\n      \"title\": \"Default phone country\",\n      \"type\": \"string\",\n      \"description\": \"ISO 3166-1 alpha-2 country used to interpret phone numbers written without an international prefix. Leave empty to infer from the website domain.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"AC\",\n        \"AD\",\n        \"AE\",\n        \"AF\",\n        \"AG\",\n        \"AI\",\n        \"AL\",\n        \"AM\",\n        \"AO\",\n        \"AR\",\n        \"AS\",\n        \"AT\",\n        \"AU\",\n        \"AW\",\n        \"AX\",\n        \"AZ\",\n        \"BA\",\n        \"BB\",\n        \"BD\",\n        \"BE\",\n        \"BF\",\n        \"BG\",\n        \"BH\",\n        \"BI\",\n        \"BJ\",\n        \"BL\",\n        \"BM\",\n        \"BN\",\n        \"BO\",\n        \"BQ\",\n        \"BR\",\n        \"BS\",\n        \"BT\",\n        \"BW\",\n        \"BY\",\n        \"BZ\",\n        \"CA\",\n        \"CC\",\n        \"CD\",\n        \"CF\",\n        \"CG\",\n        \"CH\",\n        \"CI\",\n        \"CK\",\n        \"CL\",\n        \"CM\",\n        \"CN\",\n        \"CO\",\n        \"CR\",\n        \"CU\",\n        \"CV\",\n        \"CW\",\n        \"CX\",\n        \"CY\",\n        \"CZ\",\n        \"DE\",\n        \"DJ\",\n        \"DK\",\n        \"DM\",\n        \"DO\",\n        \"DZ\",\n        \"EC\",\n        \"EE\",\n        \"EG\",\n        \"EH\",\n        \"ER\",\n        \"ES\",\n        \"ET\",\n        \"FI\",\n        \"FJ\",\n        \"FK\",\n        \"FM\",\n        \"FO\",\n        \"FR\",\n        \"GA\",\n        \"GB\",\n        \"GD\",\n        \"GE\",\n        \"GF\",\n        \"GG\",\n        \"GH\",\n        \"GI\",\n        \"GL\",\n        \"GM\",\n        \"GN\",\n        \"GP\",\n        \"GQ\",\n        \"GR\",\n        \"GT\",\n        \"GU\",\n        \"GW\",\n        \"GY\",\n        \"HK\",\n        \"HN\",\n        \"HR\",\n        \"HT\",\n        \"HU\",\n        \"ID\",\n        \"IE\",\n        \"IL\",\n        \"IM\",\n        \"IN\",\n        \"IO\",\n        \"IQ\",\n        \"IR\",\n        \"IS\",\n        \"IT\",\n        \"JE\",\n        \"JM\",\n        \"JO\",\n        \"JP\",\n        \"KE\",\n        \"KG\",\n        \"KH\",\n        \"KI\",\n        \"KM\",\n        \"KN\",\n        \"KP\",\n        \"KR\",\n        \"KW\",\n        \"KY\",\n        \"KZ\",\n        \"LA\",\n        \"LB\",\n        \"LC\",\n        \"LI\",\n        \"LK\",\n        \"LR\",\n        \"LS\",\n        \"LT\",\n        \"LU\",\n        \"LV\",\n        \"LY\",\n        \"MA\",\n        \"MC\",\n        \"MD\",\n        \"ME\",\n        \"MF\",\n        \"MG\",\n        \"MH\",\n        \"MK\",\n        \"ML\",\n        \"MM\",\n        \"MN\",\n        \"MO\",\n        \"MP\",\n        \"MQ\",\n        \"MR\",\n        \"MS\",\n        \"MT\",\n        \"MU\",\n        \"MV\",\n        \"MW\",\n        \"MX\",\n        \"MY\",\n        \"MZ\",\n        \"NA\",\n        \"NC\",\n        \"NE\",\n        \"NF\",\n        \"NG\",\n        \"NI\",\n        \"NL\",\n        \"NO\",\n        \"NP\",\n        \"NR\",\n        \"NU\",\n        \"NZ\",\n        \"OM\",\n        \"PA\",\n        \"PE\",\n        \"PF\",\n        \"PG\",\n        \"PH\",\n        \"PK\",\n        \"PL\",\n        \"PM\",\n        \"PR\",\n        \"PS\",\n        \"PT\",\n        \"PW\",\n        \"PY\",\n        \"QA\",\n        \"RE\",\n        \"RO\",\n        \"RS\",\n        \"RU\",\n        \"RW\",\n        \"SA\",\n        \"SB\",\n        \"SC\",\n        \"SD\",\n        \"SE\",\n        \"SG\",\n        \"SH\",\n        \"SI\",\n        \"SJ\",\n        \"SK\",\n        \"SL\",\n        \"SM\",\n        \"SN\",\n        \"SO\",\n        \"SR\",\n        \"SS\",\n        \"ST\",\n        \"SV\",\n        \"SX\",\n        \"SY\",\n        \"SZ\",\n        \"TA\",\n        \"TC\",\n        \"TD\",\n        \"TG\",\n        \"TH\",\n        \"TJ\",\n        \"TK\",\n        \"TL\",\n        \"TM\",\n        \"TN\",\n        \"TO\",\n        \"TR\",\n        \"TT\",\n        \"TV\",\n        \"TW\",\n        \"TZ\",\n        \"UA\",\n        \"UG\",\n        \"US\",\n        \"UY\",\n        \"UZ\",\n        \"VA\",\n        \"VC\",\n        \"VE\",\n        \"VG\",\n        \"VI\",\n        \"VN\",\n        \"VU\",\n        \"WF\",\n        \"WS\",\n        \"XK\",\n        \"YE\",\n        \"YT\",\n        \"ZA\",\n        \"ZM\",\n        \"ZW\"\n      ],\n      \"enumTitles\": [\n        \"Auto-detect from domain\",\n        \"AC\",\n        \"Andorra\",\n        \"United Arab Emirates\",\n        \"Afghanistan\",\n        \"Antigua and Barbuda\",\n        \"Anguilla\",\n        \"Albania\",\n        \"Armenia\",\n        \"Angola\",\n        \"Argentina\",\n        \"American Samoa\",\n        \"Austria\",\n        \"Australia\",\n        \"Aruba\",\n        \"Åland Islands\",\n        \"Azerbaijan\",\n        \"Bosnia and Herzegovina\",\n        \"Barbados\",\n        \"Bangladesh\",\n        \"Belgium\",\n        \"Burkina Faso\",\n        \"Bulgaria\",\n        \"Bahrain\",\n        \"Burundi\",\n        \"Benin\",\n        \"Saint Barthélemy\",\n        \"Bermuda\",\n        \"Brunei Darussalam\",\n        \"Bolivia, Plurinational State of\",\n        \"Bonaire, Sint Eustatius and Saba\",\n        \"Brazil\",\n        \"Bahamas\",\n        \"Bhutan\",\n        \"Botswana\",\n        \"Belarus\",\n        \"Belize\",\n        \"Canada\",\n        \"Cocos (Keeling) Islands\",\n        \"Congo, The Democratic Republic of the\",\n        \"Central African Republic\",\n        \"Congo\",\n        \"Switzerland\",\n        \"Côte d'Ivoire\",\n        \"Cook Islands\",\n        \"Chile\",\n        \"Cameroon\",\n        \"China\",\n        \"Colombia\",\n        \"Costa Rica\",\n        \"Cuba\",\n        \"Cabo Verde\",\n        \"Curaçao\",\n        \"Christmas Island\",\n        \"Cyprus\",\n        \"Czechia\",\n        \"Germany\",\n        \"Djibouti\",\n        \"Denmark\",\n        \"Dominica\",\n        \"Dominican Republic\",\n        \"Algeria\",\n        \"Ecuador\",\n        \"Estonia\",\n        \"Egypt\",\n        \"Western Sahara\",\n        \"Eritrea\",\n        \"Spain\",\n        \"Ethiopia\",\n        \"Finland\",\n        \"Fiji\",\n        \"Falkland Islands (Malvinas)\",\n        \"Micronesia, Federated States of\",\n        \"Faroe Islands\",\n        \"France\",\n        \"Gabon\",\n        \"United Kingdom\",\n        \"Grenada\",\n        \"Georgia\",\n        \"French Guiana\",\n        \"Guernsey\",\n        \"Ghana\",\n        \"Gibraltar\",\n        \"Greenland\",\n        \"Gambia\",\n        \"Guinea\",\n        \"Guadeloupe\",\n        \"Equatorial Guinea\",\n        \"Greece\",\n        \"Guatemala\",\n        \"Guam\",\n        \"Guinea-Bissau\",\n        \"Guyana\",\n        \"Hong Kong\",\n        \"Honduras\",\n        \"Croatia\",\n        \"Haiti\",\n        \"Hungary\",\n        \"Indonesia\",\n        \"Ireland\",\n        \"Israel\",\n        \"Isle of Man\",\n        \"India\",\n        \"British Indian Ocean Territory\",\n        \"Iraq\",\n        \"Iran, Islamic Republic of\",\n        \"Iceland\",\n        \"Italy\",\n        \"Jersey\",\n        \"Jamaica\",\n        \"Jordan\",\n        \"Japan\",\n        \"Kenya\",\n        \"Kyrgyzstan\",\n        \"Cambodia\",\n        \"Kiribati\",\n        \"Comoros\",\n        \"Saint Kitts and Nevis\",\n        \"Korea, Democratic People's Republic of\",\n        \"Korea, Republic of\",\n        \"Kuwait\",\n        \"Cayman Islands\",\n        \"Kazakhstan\",\n        \"Lao People's Democratic Republic\",\n        \"Lebanon\",\n        \"Saint Lucia\",\n        \"Liechtenstein\",\n        \"Sri Lanka\",\n        \"Liberia\",\n        \"Lesotho\",\n        \"Lithuania\",\n        \"Luxembourg\",\n        \"Latvia\",\n        \"Libya\",\n        \"Morocco\",\n        \"Monaco\",\n        \"Moldova, Republic of\",\n        \"Montenegro\",\n        \"Saint Martin (French part)\",\n        \"Madagascar\",\n        \"Marshall Islands\",\n        \"North Macedonia\",\n        \"Mali\",\n        \"Myanmar\",\n        \"Mongolia\",\n        \"Macao\",\n        \"Northern Mariana Islands\",\n        \"Martinique\",\n        \"Mauritania\",\n        \"Montserrat\",\n        \"Malta\",\n        \"Mauritius\",\n        \"Maldives\",\n        \"Malawi\",\n        \"Mexico\",\n        \"Malaysia\",\n        \"Mozambique\",\n        \"Namibia\",\n        \"New Caledonia\",\n        \"Niger\",\n        \"Norfolk Island\",\n        \"Nigeria\",\n        \"Nicaragua\",\n        \"Netherlands\",\n        \"Norway\",\n        \"Nepal\",\n        \"Nauru\",\n        \"Niue\",\n        \"New Zealand\",\n        \"Oman\",\n        \"Panama\",\n        \"Peru\",\n        \"French Polynesia\",\n        \"Papua New Guinea\",\n        \"Philippines\",\n        \"Pakistan\",\n        \"Poland\",\n        \"Saint Pierre and Miquelon\",\n        \"Puerto Rico\",\n        \"Palestine, State of\",\n        \"Portugal\",\n        \"Palau\",\n        \"Paraguay\",\n        \"Qatar\",\n        \"Réunion\",\n        \"Romania\",\n        \"Serbia\",\n        \"Russian Federation\",\n        \"Rwanda\",\n        \"Saudi Arabia\",\n        \"Solomon Islands\",\n        \"Seychelles\",\n        \"Sudan\",\n        \"Sweden\",\n        \"Singapore\",\n        \"Saint Helena, Ascension and Tristan da Cunha\",\n        \"Slovenia\",\n        \"Svalbard and Jan Mayen\",\n        \"Slovakia\",\n        \"Sierra Leone\",\n        \"San Marino\",\n        \"Senegal\",\n        \"Somalia\",\n        \"Suriname\",\n        \"South Sudan\",\n        \"Sao Tome and Principe\",\n        \"El Salvador\",\n        \"Sint Maarten (Dutch part)\",\n        \"Syrian Arab Republic\",\n        \"Eswatini\",\n        \"TA\",\n        \"Turks and Caicos Islands\",\n        \"Chad\",\n        \"Togo\",\n        \"Thailand\",\n        \"Tajikistan\",\n        \"Tokelau\",\n        \"Timor-Leste\",\n        \"Turkmenistan\",\n        \"Tunisia\",\n        \"Tonga\",\n        \"Türkiye\",\n        \"Trinidad and Tobago\",\n        \"Tuvalu\",\n        \"Taiwan, Province of China\",\n        \"Tanzania, United Republic of\",\n        \"Ukraine\",\n        \"Uganda\",\n        \"United States\",\n        \"Uruguay\",\n        \"Uzbekistan\",\n        \"Holy See (Vatican City State)\",\n        \"Saint Vincent and the Grenadines\",\n        \"Venezuela, Bolivarian Republic of\",\n        \"Virgin Islands, British\",\n        \"Virgin Islands, U.S.\",\n        \"Viet Nam\",\n        \"Vanuatu\",\n        \"Wallis and Futuna\",\n        \"Samoa\",\n        \"XK\",\n        \"Yemen\",\n        \"Mayotte\",\n        \"South Africa\",\n        \"Zambia\",\n        \"Zimbabwe\"\n      ],\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"useProxy\": {\n      \"title\": \"Use Proxy First\",\n      \"type\": \"boolean\",\n      \"description\": \"Start with the Apify proxy ladder instead of trying direct requests first. The actor always retries blocked requests through the proxy ladder automatically.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"smartPrioritise\": {\n      \"title\": \"Smart Page Prioritisation\",\n      \"type\": \"boolean\",\n      \"description\": \"Try common contact, about, team, imprint and support paths first, and queue contact-like links ahead of other internal links.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"respectRobotsTxt\": {\n      \"title\": \"Respect robots.txt\",\n      \"type\": \"boolean\",\n      \"description\": \"Skip pages that the website's robots.txt disallows. Turn this off only when you own the site or have permission to crawl it.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"useSitemap\": {\n      \"title\": \"Discover Pages From Sitemap\",\n      \"type\": \"boolean\",\n      \"description\": \"Read sitemap.xml and robots.txt sitemap entries to find contact and about pages that are not linked from the homepage.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"renderFallback\": {\n      \"title\": \"Render JavaScript Pages When Needed\",\n      \"type\": \"boolean\",\n      \"description\": \"If plain HTML contains no email or phone, render up to two pages in a headless browser to capture contacts loaded by JavaScript.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"onlyWithContacts\": {\n      \"title\": \"Only Output Sites With Contacts\",\n      \"type\": \"boolean\",\n      \"description\": \"Drop records for websites where no email, phone, social profile or contact form was found.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeNamedEmails\": {\n      \"title\": \"Include Personal Emails\",\n      \"type\": \"boolean\",\n      \"description\": \"Include personal addresses such as jane.smith@company.com. When off, only role addresses such as info@, sales@ and support@ are kept.\",\n      \"default\": true,\n      \"prefill\": true\n    }\n  },\n  \"required\": [\n    \"urls\"\n  ]\n}",
    "readme": "# Website Contact Page Email & Phone Crawler\n\nTurn a list of company websites into one clean contact record per site. The actor crawls the homepage plus contact, about, team, support and imprint-style pages, then extracts public emails, normalised phone numbers, social profiles, the company name, postal address and contact forms — with the page each value came from.\n\nIt starts with explicit `mailto:`/`tel:` links, then reads visible text, then JSON-LD and microdata, and finally decodes common obfuscation such as `[at]`/`[dot]`, HTML entities, full-width characters and Cloudflare email protection. Inline script bundles are never scanned, so analytics keys and image filenames do not end up in your dataset.\n\n## What this actor does\n\n- Crawls the registrable domain, so `www.example.com`, `example.com` and `shop.example.com` are treated as one site\n- Prioritises contact, about, team, support, imprint and legal-notice pages in English, German, French, Spanish, Italian, Portuguese and Dutch\n- Discovers unlinked contact pages from `robots.txt` sitemap entries and `sitemap.xml`\n- Extracts emails from `mailto:` links, visible text, JSON-LD, microdata, Cloudflare `data-cfemail` / `/cdn-cgi/l/email-protection`, and common obfuscated forms\n- Normalises phone numbers to E.164 with country and line type, using the website's country domain or your `defaultCountry`\n- Suppresses dates, prices, VAT/company-registry numbers, opening hours, fax labels and placeholder numbers\n- Keeps up to 19 social platforms, filtering share buttons, login pages and generic platform links\n- Renders up to two pages in a headless browser only when plain HTML contains no email or phone, blocking images, fonts and media\n- Omits empty fields instead of writing `null`, `\"\"`, `[]` or `{}`\n\n## Output per website\n\nOne dataset item per input website. Fields are omitted when empty.\n\n| Field | Description |\n|---|---|\n| `type` | Always `website_contacts`. |\n| `websiteUrl` | The normalised input URL. |\n| `status` | `success` when an email, phone, social profile or contact form was found; `no_contacts` when pages loaded but none was found; `failed` when nothing could be fetched. |\n| `failureReason` | On failed rows: `invalid_url`, `blocked`, `no_pages_fetched` or `crawl_error`. |\n| `error` | Human-readable explanation on failed rows. |\n| `companyName` | Organisation name from JSON-LD, `og:site_name`, the page title or microdata. |\n| `companyNameSource` | `jsonld`, `og_site_name`, `title` or `microdata`. |\n| `emails` | Sorted unique email addresses. |\n| `primaryEmail` | Best role address on the site's own domain, preferring `contact`, `info`, `hello`, `sales`, `support`. |\n| `roleEmails` | Addresses such as `info@`, `sales@`, `support@`. |\n| `namedEmails` | Personal addresses such as `jane.smith@`. |\n| `emailDetails` | Per address: `email`, `type`, `sourceUrl`, `method`, `confidence`. |\n| `phones` | Sorted unique E.164 numbers. |\n| `primaryPhone` | Best number for the site's country, preferring fixed lines over mobiles. |\n| `phoneDetails` | Per number: `phone`, `raw`, `country`, `type`, `sourceUrl`, `method`, `confidence`. |\n| `socialLinks` | Object keyed by platform with one profile URL per platform. |\n| `socialProfiles` | Every profile: `platform`, `url`, `sourceUrl`, `method`. |\n| `address` | Postal address from the site's own organisation JSON-LD/microdata: `streetAddress`, `addressLocality`, `addressRegion`, `postalCode`, `addressCountry`. |\n| `contactPageUrl` | Highest-scoring contact-like page found. |\n| `contactForms` | Up to five contact forms: `actionUrl`, `method`, `fieldCount`, `sourceUrl`. |\n| `pagesCrawled` | Successfully fetched HTML pages. |\n| `pagesCrawledUrls` | URLs of those pages. |\n| `maxDepthReached` | Deepest link level reached from the start page. |\n| `skippedByRobots` | URLs skipped because `robots.txt` disallowed them. |\n| `browserUsed` | `true` when the JavaScript fallback rendered a page. |\n| `crawledAt` | ISO 8601 UTC timestamp. |\n\n`emailDetails` and `phoneDetails` carry provenance: the exact page and the extraction method (`mailto`, `tel`, `visible_text`, `jsonld`, `microdata`, `cfemail`, `obfuscated`) plus a confidence score from 0.75 to 0.98.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `urls` | array | – | Websites to scan. Required. Bare domains are accepted. |\n| `maxPagesPerSite` | integer | `20` | Pages fetched per site (1–200). |\n| `maxConcurrency` | integer | `5` | Pages fetched in parallel per site (1–20). |\n| `maxSitesConcurrency` | integer | `3` | Websites scanned in parallel (1–10). |\n| `requestTimeoutSecs` | integer | `15` | Per-page timeout in seconds (5–60). |\n| `defaultCountry` | select | auto | ISO 3166-1 alpha-2 country used for phone numbers without an international prefix. Empty means infer from the domain ending. |\n| `useProxy` | boolean | `false` | Start with the Apify proxy ladder instead of direct requests. The actor retries blocked requests through the ladder automatically either way. |\n| `smartPrioritise` | boolean | `true` | Try common contact/about/team/imprint paths first. |\n| `respectRobotsTxt` | boolean | `true` | Skip pages disallowed by `robots.txt`. |\n| `useSitemap` | boolean | `true` | Discover contact pages from sitemaps. |\n| `renderFallback` | boolean | `true` | Render up to two pages in a headless browser when plain HTML has no email or phone. |\n| `onlyWithContacts` | boolean | `false` | Drop records with no email, phone, social profile or contact form. |\n| `includeNamedEmails` | boolean | `true` | Keep personal addresses; turn off to keep only role addresses. |\n\n### Example: scan a single company site\n\n```json\n{\n  \"urls\": [\"https://apify.com\"],\n  \"maxPagesPerSite\": 10,\n  \"defaultCountry\": \"US\"\n}\n```\n\n### Example: several sites, only rows with contacts\n\n```json\n{\n  \"urls\": [\"company-a.com\", \"https://company-b.co.uk\", \"https://company-c.de\"],\n  \"maxPagesPerSite\": 15,\n  \"onlyWithContacts\": true,\n  \"includeNamedEmails\": false\n}\n```\n\n### Example: a JavaScript-heavy site through the proxy ladder\n\n```json\n{\n  \"urls\": [\"https://example-spa.com\"],\n  \"maxPagesPerSite\": 8,\n  \"renderFallback\": true,\n  \"useProxy\": true\n}\n```\n\n## Use cases\n\n- **Sales outreach** — turn a list of target company websites into verified emails and phone numbers.\n- **Lead enrichment** — fill missing email, phone, address or social links in an existing CRM export.\n- **Partnership scouting** — find the right contact page and social presence before reaching out.\n- **Directory building** — seed a business directory with the contact details each company publishes itself.\n- **Vendor research** — compare how a set of suppliers presents contact channels.\n\n## FAQ\n\n**Do I need a proxy?**\nNo. Direct requests work for most sites. When a site blocks the datacenter IP, the actor retries through the Apify proxy ladder automatically; `useProxy` only makes it start there.\n\n**Does this render JavaScript?**\nOnly when needed. If plain HTML has no email or phone, the actor renders up to two pages (usually the homepage and the best contact page) in a headless browser, with images, fonts and media blocked. Content that requires a login, a captcha solve, or several clicks is not reached.\n\n**Why are some emails excluded?**\nPlaceholder domains (`example.com`, `yourdomain.com`), noreply-style addresses, image/font filename lookalikes, sentry/analytics addresses and addresses on asset CDNs are dropped. Inline script bundles are never scanned.\n\n**Why is a phone number missing?**\nA number must be a valid, dialable number with 7–15 digits. Dates, prices, VAT and registry numbers, opening hours, fax labels and repeated-digit placeholders are rejected. National-format numbers need either a country-code domain or `defaultCountry`; otherwise only international `+` numbers are accepted.\n\n**Why are some phone numbers not in the format shown on the site?**\n`phones` and `phoneDetails[].phone` are E.164 (`+49374222388`). The original text is kept in `phoneDetails[].raw`.\n\n**Why is `socialLinks` missing a platform?**\nOnly profiles linked from crawled pages or declared in JSON-LD `sameAs` are included. Share buttons, intent links, login pages and generic platform pages are skipped.\n\n**Why did a site return fewer pages than `maxPagesPerSite`?**\nThe crawl stops when it runs out of same-site links, reaches `maxPagesPerSite`, or hits robots.txt restrictions. Non-HTML responses and error pages are not counted.\n\n**Why can an output URL return 403?**\nA site that blocked the crawler may still be recovered through the browser fallback, while the same URL returns 403 to a clean HTTP client. Some social platforms return 400/403 to non-browser clients. These are anti-bot responses, not broken URLs; the record states how the page was reached with `browserUsed`/`proxyUsed`.\n\n**Is this affiliated with any social platform?**\nNo. This is an independent, third-party actor that reads publicly available website content.\n\n## Limitations\n\n- Contact forms are detected, not submitted; the actor does not send messages.\n- Emails shown only inside images or a logged-in area cannot be extracted. A 30-site OCR trial found zero true image-only contacts and produced false positives, so OCR is intentionally not shipped.\n- Some sites serve a Cloudflare/Akamai/AWS WAF challenge to every datacenter and proxy IP; those rows are returned as `failed` with `failureReason: \"blocked\"` rather than guessed. The browser fallback tries direct first, then AUTO, then RESIDENTIAL only after a real block.\n- The JavaScript fallback is capped at two pages per site; a 20-site trial showed a 2.4× runtime increase for almost no additional contacts, so this is a deliberate design limit.\n- Pages larger than 5 MB are still downloaded in full before being skipped. Streaming the first 5 MB is a possible future optimization, not a shipped guarantee. Sitemap discovery is capped at three sitemaps, five sitemap-index children and twenty contact-like URLs; `.xml.gz` sitemaps are decompressed. Emails carry `ownDomain` and `domainType` (`own`, `free_provider`, `third_party`) so legal-page regulator/partner addresses can be filtered.\n- A company with several branches may publish several addresses; `address` uses the organisation's own JSON-LD address and omits branch `Place` entries when an organisation address exists.\n\n## Use it as an API (server mode)\n\nNeed one answer right away instead of a batch job? Send the input as an HTTP request and the results come back in the response. There's no run to start and poll.\n\n```bash\ncurl -H \"Authorization: Bearer $APIFY_TOKEN\" \\\n  \"https://nimbryxo-studio--website-contact-page-email-and-phone-crawler.apify.actor/?urls=https%3A%2F%2Fapify.com&maxPagesPerSite=5\"\n```\n\nOr POST the same input as JSON:\n\n```bash\ncurl -X POST -H \"Authorization: Bearer $APIFY_TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"urls\": [\"https://apify.com\"], \"maxPagesPerSite\": 5}' \\\n  \"https://nimbryxo-studio--website-contact-page-email-and-phone-crawler.apify.actor/\"\n```\n\n- The fields are the same as in the input above. With GET, repeat a parameter once for each value in a list.\n- You get back a JSON array with the same records a normal run saves. They're saved to the run's dataset too.\n- Each request is capped at 10 results and 4 minutes. For bigger jobs, start a normal run.\n- The request runs in your own Apify account at the Actor's normal price (a start fee plus a price per result). The server shuts down after a minute with no requests.\n- The Server tab on this page lists every parameter and lets you try a request from your browser.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "website-contact-page-email-and-phone-crawler",
      "title": "Website Contact Page Email & Phone Crawler",
      "description": "Crawl a website's contact, about and team pages and collect its public emails, phone numbers, and social media profile links in one normalized record per site.",
      "version": "1.1",
      "buildTag": "latest",
      "defaultMemoryMbytes": 2048,
      "minMemoryMbytes": 1024,
      "input": {
        "title": "Website Contact Finder Input",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "urls": {
            "title": "Website URLs",
            "type": "array",
            "description": "Websites to scan for public contact details. You can paste full URLs or bare domains; duplicates are removed.",
            "editor": "stringList",
            "prefill": [
              "https://apify.com"
            ]
          },
          "maxPagesPerSite": {
            "title": "Max Pages Per Site",
            "type": "integer",
            "description": "Maximum number of pages to fetch per website. Contact, about, team and imprint pages are prioritised.",
            "default": 20,
            "prefill": 5,
            "minimum": 1,
            "maximum": 200,
            "editor": "number"
          },
          "maxConcurrency": {
            "title": "Page Concurrency Per Site",
            "type": "integer",
            "description": "How many pages of the same website may be fetched in parallel.",
            "default": 5,
            "prefill": 5,
            "minimum": 1,
            "maximum": 20,
            "editor": "number"
          },
          "maxSitesConcurrency": {
            "title": "Website Concurrency",
            "type": "integer",
            "description": "How many websites are scanned in parallel. Lower this if you hit rate limits.",
            "default": 3,
            "prefill": 3,
            "minimum": 1,
            "maximum": 10,
            "editor": "number"
          },
          "requestTimeoutSecs": {
            "title": "Request Timeout (seconds)",
            "type": "integer",
            "description": "Maximum time to wait for one page before trying the next proxy tier.",
            "default": 15,
            "prefill": 15,
            "minimum": 5,
            "maximum": 60,
            "editor": "number"
          },
          "defaultCountry": {
            "title": "Default phone country",
            "type": "string",
            "description": "ISO 3166-1 alpha-2 country used to interpret phone numbers written without an international prefix. Leave empty to infer from the website domain.",
            "editor": "select",
            "enum": [
              "",
              "AC",
              "AD",
              "AE",
              "AF",
              "AG",
              "AI",
              "AL",
              "AM",
              "AO",
              "AR",
              "AS",
              "AT",
              "AU",
              "AW",
              "AX",
              "AZ",
              "BA",
              "BB",
              "BD",
              "BE",
              "BF",
              "BG",
              "BH",
              "BI",
              "BJ",
              "BL",
              "BM",
              "BN",
              "BO",
              "BQ",
              "BR",
              "BS",
              "BT",
              "BW",
              "BY",
              "BZ",
              "CA",
              "CC",
              "CD",
              "CF",
              "CG",
              "CH",
              "CI",
              "CK",
              "CL",
              "CM",
              "CN",
              "CO",
              "CR",
              "CU",
              "CV",
              "CW",
              "CX",
              "CY",
              "CZ",
              "DE",
              "DJ",
              "DK",
              "DM",
              "DO",
              "DZ",
              "EC",
              "EE",
              "EG",
              "EH",
              "ER",
              "ES",
              "ET",
              "FI",
              "FJ",
              "FK",
              "FM",
              "FO",
              "FR",
              "GA",
              "GB",
              "GD",
              "GE",
              "GF",
              "GG",
              "GH",
              "GI",
              "GL",
              "GM",
              "GN",
              "GP",
              "GQ",
              "GR",
              "GT",
              "GU",
              "GW",
              "GY",
              "HK",
              "HN",
              "HR",
              "HT",
              "HU",
              "ID",
              "IE",
              "IL",
              "IM",
              "IN",
              "IO",
              "IQ",
              "IR",
              "IS",
              "IT",
              "JE",
              "JM",
              "JO",
              "JP",
              "KE",
              "KG",
              "KH",
              "KI",
              "KM",
              "KN",
              "KP",
              "KR",
              "KW",
              "KY",
              "KZ",
              "LA",
              "LB",
              "LC",
              "LI",
              "LK",
              "LR",
              "LS",
              "LT",
              "LU",
              "LV",
              "LY",
              "MA",
              "MC",
              "MD",
              "ME",
              "MF",
              "MG",
              "MH",
              "MK",
              "ML",
              "MM",
              "MN",
              "MO",
              "MP",
              "MQ",
              "MR",
              "MS",
              "MT",
              "MU",
              "MV",
              "MW",
              "MX",
              "MY",
              "MZ",
              "NA",
              "NC",
              "NE",
              "NF",
              "NG",
              "NI",
              "NL",
              "NO",
              "NP",
              "NR",
              "NU",
              "NZ",
              "OM",
              "PA",
              "PE",
              "PF",
              "PG",
              "PH",
              "PK",
              "PL",
              "PM",
              "PR",
              "PS",
              "PT",
              "PW",
              "PY",
              "QA",
              "RE",
              "RO",
              "RS",
              "RU",
              "RW",
              "SA",
              "SB",
              "SC",
              "SD",
              "SE",
              "SG",
              "SH",
              "SI",
              "SJ",
              "SK",
              "SL",
              "SM",
              "SN",
              "SO",
              "SR",
              "SS",
              "ST",
              "SV",
              "SX",
              "SY",
              "SZ",
              "TA",
              "TC",
              "TD",
              "TG",
              "TH",
              "TJ",
              "TK",
              "TL",
              "TM",
              "TN",
              "TO",
              "TR",
              "TT",
              "TV",
              "TW",
              "TZ",
              "UA",
              "UG",
              "US",
              "UY",
              "UZ",
              "VA",
              "VC",
              "VE",
              "VG",
              "VI",
              "VN",
              "VU",
              "WF",
              "WS",
              "XK",
              "YE",
              "YT",
              "ZA",
              "ZM",
              "ZW"
            ],
            "enumTitles": [
              "Auto-detect from domain",
              "AC",
              "Andorra",
              "United Arab Emirates",
              "Afghanistan",
              "Antigua and Barbuda",
              "Anguilla",
              "Albania",
              "Armenia",
              "Angola",
              "Argentina",
              "American Samoa",
              "Austria",
              "Australia",
              "Aruba",
              "Åland Islands",
              "Azerbaijan",
              "Bosnia and Herzegovina",
              "Barbados",
              "Bangladesh",
              "Belgium",
              "Burkina Faso",
              "Bulgaria",
              "Bahrain",
              "Burundi",
              "Benin",
              "Saint Barthélemy",
              "Bermuda",
              "Brunei Darussalam",
              "Bolivia, Plurinational State of",
              "Bonaire, Sint Eustatius and Saba",
              "Brazil",
              "Bahamas",
              "Bhutan",
              "Botswana",
              "Belarus",
              "Belize",
              "Canada",
              "Cocos (Keeling) Islands",
              "Congo, The Democratic Republic of the",
              "Central African Republic",
              "Congo",
              "Switzerland",
              "Côte d'Ivoire",
              "Cook Islands",
              "Chile",
              "Cameroon",
              "China",
              "Colombia",
              "Costa Rica",
              "Cuba",
              "Cabo Verde",
              "Curaçao",
              "Christmas Island",
              "Cyprus",
              "Czechia",
              "Germany",
              "Djibouti",
              "Denmark",
              "Dominica",
              "Dominican Republic",
              "Algeria",
              "Ecuador",
              "Estonia",
              "Egypt",
              "Western Sahara",
              "Eritrea",
              "Spain",
              "Ethiopia",
              "Finland",
              "Fiji",
              "Falkland Islands (Malvinas)",
              "Micronesia, Federated States of",
              "Faroe Islands",
              "France",
              "Gabon",
              "United Kingdom",
              "Grenada",
              "Georgia",
              "French Guiana",
              "Guernsey",
              "Ghana",
              "Gibraltar",
              "Greenland",
              "Gambia",
              "Guinea",
              "Guadeloupe",
              "Equatorial Guinea",
              "Greece",
              "Guatemala",
              "Guam",
              "Guinea-Bissau",
              "Guyana",
              "Hong Kong",
              "Honduras",
              "Croatia",
              "Haiti",
              "Hungary",
              "Indonesia",
              "Ireland",
              "Israel",
              "Isle of Man",
              "India",
              "British Indian Ocean Territory",
              "Iraq",
              "Iran, Islamic Republic of",
              "Iceland",
              "Italy",
              "Jersey",
              "Jamaica",
              "Jordan",
              "Japan",
              "Kenya",
              "Kyrgyzstan",
              "Cambodia",
              "Kiribati",
              "Comoros",
              "Saint Kitts and Nevis",
              "Korea, Democratic People's Republic of",
              "Korea, Republic of",
              "Kuwait",
              "Cayman Islands",
              "Kazakhstan",
              "Lao People's Democratic Republic",
              "Lebanon",
              "Saint Lucia",
              "Liechtenstein",
              "Sri Lanka",
              "Liberia",
              "Lesotho",
              "Lithuania",
              "Luxembourg",
              "Latvia",
              "Libya",
              "Morocco",
              "Monaco",
              "Moldova, Republic of",
              "Montenegro",
              "Saint Martin (French part)",
              "Madagascar",
              "Marshall Islands",
              "North Macedonia",
              "Mali",
              "Myanmar",
              "Mongolia",
              "Macao",
              "Northern Mariana Islands",
              "Martinique",
              "Mauritania",
              "Montserrat",
              "Malta",
              "Mauritius",
              "Maldives",
              "Malawi",
              "Mexico",
              "Malaysia",
              "Mozambique",
              "Namibia",
              "New Caledonia",
              "Niger",
              "Norfolk Island",
              "Nigeria",
              "Nicaragua",
              "Netherlands",
              "Norway",
              "Nepal",
              "Nauru",
              "Niue",
              "New Zealand",
              "Oman",
              "Panama",
              "Peru",
              "French Polynesia",
              "Papua New Guinea",
              "Philippines",
              "Pakistan",
              "Poland",
              "Saint Pierre and Miquelon",
              "Puerto Rico",
              "Palestine, State of",
              "Portugal",
              "Palau",
              "Paraguay",
              "Qatar",
              "Réunion",
              "Romania",
              "Serbia",
              "Russian Federation",
              "Rwanda",
              "Saudi Arabia",
              "Solomon Islands",
              "Seychelles",
              "Sudan",
              "Sweden",
              "Singapore",
              "Saint Helena, Ascension and Tristan da Cunha",
              "Slovenia",
              "Svalbard and Jan Mayen",
              "Slovakia",
              "Sierra Leone",
              "San Marino",
              "Senegal",
              "Somalia",
              "Suriname",
              "South Sudan",
              "Sao Tome and Principe",
              "El Salvador",
              "Sint Maarten (Dutch part)",
              "Syrian Arab Republic",
              "Eswatini",
              "TA",
              "Turks and Caicos Islands",
              "Chad",
              "Togo",
              "Thailand",
              "Tajikistan",
              "Tokelau",
              "Timor-Leste",
              "Turkmenistan",
              "Tunisia",
              "Tonga",
              "Türkiye",
              "Trinidad and Tobago",
              "Tuvalu",
              "Taiwan, Province of China",
              "Tanzania, United Republic of",
              "Ukraine",
              "Uganda",
              "United States",
              "Uruguay",
              "Uzbekistan",
              "Holy See (Vatican City State)",
              "Saint Vincent and the Grenadines",
              "Venezuela, Bolivarian Republic of",
              "Virgin Islands, British",
              "Virgin Islands, U.S.",
              "Viet Nam",
              "Vanuatu",
              "Wallis and Futuna",
              "Samoa",
              "XK",
              "Yemen",
              "Mayotte",
              "South Africa",
              "Zambia",
              "Zimbabwe"
            ],
            "default": "",
            "prefill": ""
          },
          "useProxy": {
            "title": "Use Proxy First",
            "type": "boolean",
            "description": "Start with the Apify proxy ladder instead of trying direct requests first. The actor always retries blocked requests through the proxy ladder automatically.",
            "default": false,
            "prefill": false
          },
          "smartPrioritise": {
            "title": "Smart Page Prioritisation",
            "type": "boolean",
            "description": "Try common contact, about, team, imprint and support paths first, and queue contact-like links ahead of other internal links.",
            "default": true,
            "prefill": true
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt",
            "type": "boolean",
            "description": "Skip pages that the website's robots.txt disallows. Turn this off only when you own the site or have permission to crawl it.",
            "default": true,
            "prefill": true
          },
          "useSitemap": {
            "title": "Discover Pages From Sitemap",
            "type": "boolean",
            "description": "Read sitemap.xml and robots.txt sitemap entries to find contact and about pages that are not linked from the homepage.",
            "default": true,
            "prefill": true
          },
          "renderFallback": {
            "title": "Render JavaScript Pages When Needed",
            "type": "boolean",
            "description": "If plain HTML contains no email or phone, render up to two pages in a headless browser to capture contacts loaded by JavaScript.",
            "default": true,
            "prefill": true
          },
          "onlyWithContacts": {
            "title": "Only Output Sites With Contacts",
            "type": "boolean",
            "description": "Drop records for websites where no email, phone, social profile or contact form was found.",
            "default": false,
            "prefill": false
          },
          "includeNamedEmails": {
            "title": "Include Personal Emails",
            "type": "boolean",
            "description": "Include personal addresses such as jane.smith@company.com. When off, only role addresses such as info@, sales@ and support@ are kept.",
            "default": true,
            "prefill": true
          }
        },
        "required": [
          "urls"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Website Contact Page Email & Phone Crawler Output",
        "description": "One record per scanned website with source-backed emails, E.164 phone numbers, social profiles, company name, address, contact forms, crawl diagnostics and status.",
        "properties": {
          "contacts": {
            "type": "string",
            "title": "Website contact records",
            "description": "Dataset containing one contact record per scanned website.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "readme": "# Website Contact Page Email & Phone Crawler\n\nTurn a list of company websites into one clean contact record per site. The actor crawls the homepage plus contact, about, team, support and imprint-style pages, then extracts public emails, normalised phone numbers, social profiles, the company name, postal address and contact forms — with the page each value came from.\n\nIt starts with explicit `mailto:`/`tel:` links, then reads visible text, then JSON-LD and microdata, and finally decodes common obfuscation such as `[at]`/`[dot]`, HTML entities, full-width characters and Cloudflare email protection. Inline script bundles are never scanned, so analytics keys and image filenames do not end up in your dataset.\n\n## What this actor does\n\n- Crawls the registrable domain, so `www.example.com`, `example.com` and `shop.example.com` are treated as one site\n- Prioritises contact, about, team, support, imprint and legal-notice pages in English, German, French, Spanish, Italian, Portuguese and Dutch\n- Discovers unlinked contact pages from `robots.txt` sitemap entries and `sitemap.xml`\n- Extracts emails from `mailto:` links, visible text, JSON-LD, microdata, Cloudflare `data-cfemail` / `/cdn-cgi/l/email-protection`, and common obfuscated forms\n- Normalises phone numbers to E.164 with country and line type, using the website's country domain or your `defaultCountry`\n- Suppresses dates, prices, VAT/company-registry numbers, opening hours, fax labels and placeholder numbers\n- Keeps up to 19 social platforms, filtering share buttons, login pages and generic platform links\n- Renders up to two pages in a headless browser only when plain HTML contains no email or phone, blocking images, fonts and media\n- Omits empty fields instead of writing `null`, `\"\"`, `[]` or `{}`\n\n## Output per website\n\nOne dataset item per input website. Fields are omitted when empty.\n\n| Field | Description |\n|---|---|\n| `type` | Always `website_contacts`. |\n| `websiteUrl` | The normalised input URL. |\n| `status` | `success` when an email, phone, social profile or contact form was found; `no_contacts` when pages loaded but none was found; `failed` when nothing could be fetched. |\n| `failureReason` | On failed rows: `invalid_url`, `blocked`, `no_pages_fetched` or `crawl_error`. |\n| `error` | Human-readable explanation on failed rows. |\n| `companyName` | Organisation name from JSON-LD, `og:site_name`, the page title or microdata. |\n| `companyNameSource` | `jsonld`, `og_site_name`, `title` or `microdata`. |\n| `emails` | Sorted unique email addresses. |\n| `primaryEmail` | Best role address on the site's own domain, preferring `contact`, `info`, `hello`, `sales`, `support`. |\n| `roleEmails` | Addresses such as `info@`, `sales@`, `support@`. |\n| `namedEmails` | Personal addresses such as `jane.smith@`. |\n| `emailDetails` | Per address: `email`, `type`, `sourceUrl`, `method`, `confidence`. |\n| `phones` | Sorted unique E.164 numbers. |\n| `primaryPhone` | Best number for the site's country, preferring fixed lines over mobiles. |\n| `phoneDetails` | Per number: `phone`, `raw`, `country`, `type`, `sourceUrl`, `method`, `confidence`. |\n| `socialLinks` | Object keyed by platform with one profile URL per platform. |\n| `socialProfiles` | Every profile: `platform`, `url`, `sourceUrl`, `method`. |\n| `address` | Postal address from the site's own organisation JSON-LD/microdata: `streetAddress`, `addressLocality`, `addressRegion`, `postalCode`, `addressCountry`. |\n| `contactPageUrl` | Highest-scoring contact-like page found. |\n| `contactForms` | Up to five contact forms: `actionUrl`, `method`, `fieldCount`, `sourceUrl`. |\n| `pagesCrawled` | Successfully fetched HTML pages. |\n| `pagesCrawledUrls` | URLs of those pages. |\n| `maxDepthReached` | Deepest link level reached from the start page. |\n| `skippedByRobots` | URLs skipped because `robots.txt` disallowed them. |\n| `browserUsed` | `true` when the JavaScript fallback rendered a page. |\n| `crawledAt` | ISO 8601 UTC timestamp. |\n\n`emailDetails` and `phoneDetails` carry provenance: the exact page and the extraction method (`mailto`, `tel`, `visible_text`, `jsonld`, `microdata`, `cfemail`, `obfuscated`) plus a confidence score from 0.75 to 0.98.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `urls` | array | – | Websites to scan. Required. Bare domains are accepted. |\n| `maxPagesPerSite` | integer | `20` | Pages fetched per site (1–200). |\n| `maxConcurrency` | integer | `5` | Pages fetched in parallel per site (1–20). |\n| `maxSitesConcurrency` | integer | `3` | Websites scanned in parallel (1–10). |\n| `requestTimeoutSecs` | integer | `15` | Per-page timeout in seconds (5–60). |\n| `defaultCountry` | select | auto | ISO 3166-1 alpha-2 country used for phone numbers without an international prefix. Empty means infer from the domain ending. |\n| `useProxy` | boolean | `false` | Start with the Apify proxy ladder instead of direct requests. The actor retries blocked requests through the ladder automatically either way. |\n| `smartPrioritise` | boolean | `true` | Try common contact/about/team/imprint paths first. |\n| `respectRobotsTxt` | boolean | `true` | Skip pages disallowed by `robots.txt`. |\n| `useSitemap` | boolean | `true` | Discover contact pages from sitemaps. |\n| `renderFallback` | boolean | `true` | Render up to two pages in a headless browser when plain HTML has no email or phone. |\n| `onlyWithContacts` | boolean | `false` | Drop records with no email, phone, social profile or contact form. |\n| `includeNamedEmails` | boolean | `true` | Keep personal addresses; turn off to keep only role addresses. |\n\n### Example: scan a single company site\n\n```json\n{\n  \"urls\": [\"https://apify.com\"],\n  \"maxPagesPerSite\": 10,\n  \"defaultCountry\": \"US\"\n}\n```\n\n### Example: several sites, only rows with contacts\n\n```json\n{\n  \"urls\": [\"company-a.com\", \"https://company-b.co.uk\", \"https://company-c.de\"],\n  \"maxPagesPerSite\": 15,\n  \"onlyWithContacts\": true,\n  \"includeNamedEmails\": false\n}\n```\n\n### Example: a JavaScript-heavy site through the proxy ladder\n\n```json\n{\n  \"urls\": [\"https://example-spa.com\"],\n  \"maxPagesPerSite\": 8,\n  \"renderFallback\": true,\n  \"useProxy\": true\n}\n```\n\n## Use cases\n\n- **Sales outreach** — turn a list of target company websites into verified emails and phone numbers.\n- **Lead enrichment** — fill missing email, phone, address or social links in an existing CRM export.\n- **Partnership scouting** — find the right contact page and social presence before reaching out.\n- **Directory building** — seed a business directory with the contact details each company publishes itself.\n- **Vendor research** — compare how a set of suppliers presents contact channels.\n\n## FAQ\n\n**Do I need a proxy?**\nNo. Direct requests work for most sites. When a site blocks the datacenter IP, the actor retries through the Apify proxy ladder automatically; `useProxy` only makes it start there.\n\n**Does this render JavaScript?**\nOnly when needed. If plain HTML has no email or phone, the actor renders up to two pages (usually the homepage and the best contact page) in a headless browser, with images, fonts and media blocked. Content that requires a login, a captcha solve, or several clicks is not reached.\n\n**Why are some emails excluded?**\nPlaceholder domains (`example.com`, `yourdomain.com`), noreply-style addresses, image/font filename lookalikes, sentry/analytics addresses and addresses on asset CDNs are dropped. Inline script bundles are never scanned.\n\n**Why is a phone number missing?**\nA number must be a valid, dialable number with 7–15 digits. Dates, prices, VAT and registry numbers, opening hours, fax labels and repeated-digit placeholders are rejected. National-format numbers need either a country-code domain or `defaultCountry`; otherwise only international `+` numbers are accepted.\n\n**Why are some phone numbers not in the format shown on the site?**\n`phones` and `phoneDetails[].phone` are E.164 (`+49374222388`). The original text is kept in `phoneDetails[].raw`.\n\n**Why is `socialLinks` missing a platform?**\nOnly profiles linked from crawled pages or declared in JSON-LD `sameAs` are included. Share buttons, intent links, login pages and generic platform pages are skipped.\n\n**Why did a site return fewer pages than `maxPagesPerSite`?**\nThe crawl stops when it runs out of same-site links, reaches `maxPagesPerSite`, or hits robots.txt restrictions. Non-HTML responses and error pages are not counted.\n\n**Why can an output URL return 403?**\nA site that blocked the crawler may still be recovered through the browser fallback, while the same URL returns 403 to a clean HTTP client. Some social platforms return 400/403 to non-browser clients. These are anti-bot responses, not broken URLs; the record states how the page was reached with `browserUsed`/`proxyUsed`.\n\n**Is this affiliated with any social platform?**\nNo. This is an independent, third-party actor that reads publicly available website content.\n\n## Limitations\n\n- Contact forms are detected, not submitted; the actor does not send messages.\n- Emails shown only inside images or a logged-in area cannot be extracted. A 30-site OCR trial found zero true image-only contacts and produced false positives, so OCR is intentionally not shipped.\n- Some sites serve a Cloudflare/Akamai/AWS WAF challenge to every datacenter and proxy IP; those rows are returned as `failed` with `failureReason: \"blocked\"` rather than guessed. The browser fallback tries direct first, then AUTO, then RESIDENTIAL only after a real block.\n- The JavaScript fallback is capped at two pages per site; a 20-site trial showed a 2.4× runtime increase for almost no additional contacts, so this is a deliberate design limit.\n- Pages larger than 5 MB are still downloaded in full before being skipped. Streaming the first 5 MB is a possible future optimization, not a shipped guarantee. Sitemap discovery is capped at three sitemaps, five sitemap-index children and twenty contact-like URLs; `.xml.gz` sitemaps are decompressed. Emails carry `ownDomain` and `domainType` (`own`, `free_provider`, `third_party`) so legal-page regulator/partner addresses can be filtered.\n- A company with several branches may publish several addresses; `address` uses the organisation's own JSON-LD address and omits branch `Place` entries when an organisation address exists.\n\n## Use it as an API (server mode)\n\nNeed one answer right away instead of a batch job? Send the input as an HTTP request and the results come back in the response. There's no run to start and poll.\n\n```bash\ncurl -H \"Authorization: Bearer $APIFY_TOKEN\" \\\n  \"https://nimbryxo-studio--website-contact-page-email-and-phone-crawler.apify.actor/?urls=https%3A%2F%2Fapify.com&maxPagesPerSite=5\"\n```\n\nOr POST the same input as JSON:\n\n```bash\ncurl -X POST -H \"Authorization: Bearer $APIFY_TOKEN\" -H \"Content-Type: application/json\" \\\n  -d '{\"urls\": [\"https://apify.com\"], \"maxPagesPerSite\": 5}' \\\n  \"https://nimbryxo-studio--website-contact-page-email-and-phone-crawler.apify.actor/\"\n```\n\n- The fields are the same as in the input above. With GET, repeat a parameter once for each value in a list.\n- You get back a JSON array with the same records a normal run saves. They're saved to the run's dataset too.\n- Each request is capped at 10 results and 4 minutes. For bigger jobs, start a normal run.\n- The request runs in your own Apify account at the Actor's normal price (a start fee plus a price per result). The server shuts down after a minute with no requests.\n- The Server tab on this page lists every parameter and lets you try a request from your browser.\n",
      "storages": {},
      "webServerSchema": {
        "openapi": "3.0.3",
        "info": {
          "title": "Website Contact Page Email & Phone Crawler (server mode)",
          "version": "1.1",
          "description": "Send one lookup and get the results back in the response. It takes the same input as a normal run: query parameters with GET, or a JSON body with POST. At most 10 results and 240 seconds per request; start a normal run for bigger jobs. Requests run in your own Apify account at the Actor's normal price.",
          "x-oa-server-mode": "1.1"
        },
        "paths": {
          "/": {
            "get": {
              "operationId": "lookupGet",
              "summary": "Run one lookup (query parameters)",
              "parameters": [
                {
                  "name": "urls",
                  "in": "query",
                  "required": true,
                  "description": "Websites to scan for public contact details. You can paste full URLs or bare domains; duplicates are removed. (GET: repeat the parameter once per value.)",
                  "schema": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "maxItems": 3
                  },
                  "style": "form",
                  "explode": true,
                  "example": [
                    "https://apify.com"
                  ]
                },
                {
                  "name": "maxPagesPerSite",
                  "in": "query",
                  "required": false,
                  "description": "Maximum number of pages to fetch per website. Contact, about, team and imprint pages are prioritised.",
                  "schema": {
                    "type": "integer",
                    "default": 10,
                    "minimum": 1,
                    "maximum": 10
                  },
                  "example": 5
                },
                {
                  "name": "maxConcurrency",
                  "in": "query",
                  "required": false,
                  "description": "How many pages of the same website may be fetched in parallel.",
                  "schema": {
                    "type": "integer",
                    "default": 5,
                    "minimum": 1,
                    "maximum": 20
                  }
                },
                {
                  "name": "maxSitesConcurrency",
                  "in": "query",
                  "required": false,
                  "description": "How many websites are scanned in parallel. Lower this if you hit rate limits.",
                  "schema": {
                    "type": "integer",
                    "default": 3,
                    "minimum": 1,
                    "maximum": 10
                  }
                },
                {
                  "name": "requestTimeoutSecs",
                  "in": "query",
                  "required": false,
                  "description": "Maximum time to wait for one page before trying the next proxy tier.",
                  "schema": {
                    "type": "integer",
                    "default": 15,
                    "minimum": 5,
                    "maximum": 60
                  }
                },
                {
                  "name": "defaultCountry",
                  "in": "query",
                  "required": false,
                  "description": "ISO 3166-1 alpha-2 country used to interpret phone numbers written without an international prefix. Leave empty to infer from the website domain.",
                  "schema": {
                    "type": "string",
                    "enum": [
                      "",
                      "AC",
                      "AD",
                      "AE",
                      "AF",
                      "AG",
                      "AI",
                      "AL",
                      "AM",
                      "AO",
                      "AR",
                      "AS",
                      "AT",
                      "AU",
                      "AW",
                      "AX",
                      "AZ",
                      "BA",
                      "BB",
                      "BD",
                      "BE",
                      "BF",
                      "BG",
                      "BH",
                      "BI",
                      "BJ",
                      "BL",
                      "BM",
                      "BN",
                      "BO",
                      "BQ",
                      "BR",
                      "BS",
                      "BT",
                      "BW",
                      "BY",
                      "BZ",
                      "CA",
                      "CC",
                      "CD",
                      "CF",
                      "CG",
                      "CH",
                      "CI",
                      "CK",
                      "CL",
                      "CM",
                      "CN",
                      "CO",
                      "CR",
                      "CU",
                      "CV",
                      "CW",
                      "CX",
                      "CY",
                      "CZ",
                      "DE",
                      "DJ",
                      "DK",
                      "DM",
                      "DO",
                      "DZ",
                      "EC",
                      "EE",
                      "EG",
                      "EH",
                      "ER",
                      "ES",
                      "ET",
                      "FI",
                      "FJ",
                      "FK",
                      "FM",
                      "FO",
                      "FR",
                      "GA",
                      "GB",
                      "GD",
                      "GE",
                      "GF",
                      "GG",
                      "GH",
                      "GI",
                      "GL",
                      "GM",
                      "GN",
                      "GP",
                      "GQ",
                      "GR",
                      "GT",
                      "GU",
                      "GW",
                      "GY",
                      "HK",
                      "HN",
                      "HR",
                      "HT",
                      "HU",
                      "ID",
                      "IE",
                      "IL",
                      "IM",
                      "IN",
                      "IO",
                      "IQ",
                      "IR",
                      "IS",
                      "IT",
                      "JE",
                      "JM",
                      "JO",
                      "JP",
                      "KE",
                      "KG",
                      "KH",
                      "KI",
                      "KM",
                      "KN",
                      "KP",
                      "KR",
                      "KW",
                      "KY",
                      "KZ",
                      "LA",
                      "LB",
                      "LC",
                      "LI",
                      "LK",
                      "LR",
                      "LS",
                      "LT",
                      "LU",
                      "LV",
                      "LY",
                      "MA",
                      "MC",
                      "MD",
                      "ME",
                      "MF",
                      "MG",
                      "MH",
                      "MK",
                      "ML",
                      "MM",
                      "MN",
                      "MO",
                      "MP",
                      "MQ",
                      "MR",
                      "MS",
                      "MT",
                      "MU",
                      "MV",
                      "MW",
                      "MX",
                      "MY",
                      "MZ",
                      "NA",
                      "NC",
                      "NE",
                      "NF",
                      "NG",
                      "NI",
                      "NL",
                      "NO",
                      "NP",
                      "NR",
                      "NU",
                      "NZ",
                      "OM",
                      "PA",
                      "PE",
                      "PF",
                      "PG",
                      "PH",
                      "PK",
                      "PL",
                      "PM",
                      "PR",
                      "PS",
                      "PT",
                      "PW",
                      "PY",
                      "QA",
                      "RE",
                      "RO",
                      "RS",
                      "RU",
                      "RW",
                      "SA",
                      "SB",
                      "SC",
                      "SD",
                      "SE",
                      "SG",
                      "SH",
                      "SI",
                      "SJ",
                      "SK",
                      "SL",
                      "SM",
                      "SN",
                      "SO",
                      "SR",
                      "SS",
                      "ST",
                      "SV",
                      "SX",
                      "SY",
                      "SZ",
                      "TA",
                      "TC",
                      "TD",
                      "TG",
                      "TH",
                      "TJ",
                      "TK",
                      "TL",
                      "TM",
                      "TN",
                      "TO",
                      "TR",
                      "TT",
                      "TV",
                      "TW",
                      "TZ",
                      "UA",
                      "UG",
                      "US",
                      "UY",
                      "UZ",
                      "VA",
                      "VC",
                      "VE",
                      "VG",
                      "VI",
                      "VN",
                      "VU",
                      "WF",
                      "WS",
                      "XK",
                      "YE",
                      "YT",
                      "ZA",
                      "ZM",
                      "ZW"
                    ],
                    "default": ""
                  }
                },
                {
                  "name": "useProxy",
                  "in": "query",
                  "required": false,
                  "description": "Start with the Apify proxy ladder instead of trying direct requests first. The actor always retries blocked requests through the proxy ladder automatically.",
                  "schema": {
                    "type": "boolean",
                    "default": false
                  }
                },
                {
                  "name": "smartPrioritise",
                  "in": "query",
                  "required": false,
                  "description": "Try common contact, about, team, imprint and support paths first, and queue contact-like links ahead of other internal links.",
                  "schema": {
                    "type": "boolean",
                    "default": true
                  }
                },
                {
                  "name": "respectRobotsTxt",
                  "in": "query",
                  "required": false,
                  "description": "Skip pages that the website's robots.txt disallows. Turn this off only when you own the site or have permission to crawl it.",
                  "schema": {
                    "type": "boolean",
                    "default": true
                  }
                },
                {
                  "name": "useSitemap",
                  "in": "query",
                  "required": false,
                  "description": "Read sitemap.xml and robots.txt sitemap entries to find contact and about pages that are not linked from the homepage.",
                  "schema": {
                    "type": "boolean",
                    "default": true
                  }
                },
                {
                  "name": "renderFallback",
                  "in": "query",
                  "required": false,
                  "description": "If plain HTML contains no email or phone, render up to two pages in a headless browser to capture contacts loaded by JavaScript.",
                  "schema": {
                    "type": "boolean",
                    "default": true
                  }
                },
                {
                  "name": "onlyWithContacts",
                  "in": "query",
                  "required": false,
                  "description": "Drop records for websites where no email, phone, social profile or contact form was found.",
                  "schema": {
                    "type": "boolean",
                    "default": false
                  }
                },
                {
                  "name": "includeNamedEmails",
                  "in": "query",
                  "required": false,
                  "description": "Include personal addresses such as jane.smith@company.com. When off, only role addresses such as info@, sales@ and support@ are kept.",
                  "schema": {
                    "type": "boolean",
                    "default": true
                  }
                }
              ],
              "responses": {
                "200": {
                  "description": "The results as a JSON array (at most 10). They are also saved to the run's dataset and billed per result, like a normal run.",
                  "headers": {
                    "X-Item-Count": {
                      "schema": {
                        "type": "integer"
                      },
                      "description": "Results returned."
                    },
                    "X-Status-Message": {
                      "schema": {
                        "type": "string"
                      },
                      "description": "The Actor's last status message, e.g. why nothing was found."
                    }
                  },
                  "content": {
                    "application/json": {
                      "schema": {
                        "type": "array",
                        "items": {
                          "$ref": "#/components/schemas/Item"
                        }
                      },
                      "example": [
                        {
                          "type": "website_contacts",
                          "websiteUrl": "https://apify.com",
                          "status": "success",
                          "pagesCrawled": 5,
                          "maxDepthReached": 1,
                          "crawledAt": "2026-11-10T15:32:38Z",
                          "emails": [
                            "hello@apify.com",
                            "support@apify.com"
                          ],
                          "primaryEmail": "hello@apify.com",
                          "roleEmails": [
                            "hello@apify.com",
                            "support@apify.com"
                          ],
                          "emailDetails": [
                            {
                              "email": "hello@apify.com",
                              "type": "role",
                              "sourceUrl": "https://apify.com/contact",
                              "method": "mailto",
                              "confidence": 0.98,
                              "ownDomain": true,
                              "domainType": "own"
                            },
                            {
                              "email": "support@apify.com",
                              "type": "role",
                              "sourceUrl": "https://apify.com/",
                              "method": "jsonld",
                              "confidence": 0.95,
                              "ownDomain": true,
                              "domainType": "own"
                            }
                          ],
                          "socialLinks": {
                            "discord": "https://discord.com/invite/jyEM2PRvMU",
                            "github": "https://github.com/apify",
                            "linkedin": "https://linkedin.com/company/apify",
                            "tiktok": "https://tiktok.com/@apifyoffice",
                            "twitter": "https://x.com/apify"
                          },
                          "socialProfiles": [
                            {
                              "platform": "discord",
                              "url": "https://discord.com/invite/jyEM2PRvMU",
                              "sourceUrl": "https://apify.com/",
                              "method": "href"
                            },
                            {
                              "platform": "discord",
                              "url": "https://discord.gg/w3e2v7rWDw",
                              "sourceUrl": "https://apify.com/",
                              "method": "href"
                            },
                            {
                              "platform": "github",
                              "url": "https://github.com/apify",
                              "sourceUrl": "https://apify.com/",
                              "method": "href"
                            }
                          ],
                          "companyName": "Apify Technologies s.r.o.",
                          "companyNameSource": "jsonld",
                          "address": {
                            "streetAddress": "Na Příkopě 959/27",
                            "addressLocality": "Prague",
                            "postalCode": "11000",
                            "addressCountry": "CZ"
                          },
                          "contactPageUrl": "https://apify.com/contact",
                          "contactForms": [
                            {
                              "actionUrl": "https://apify.com/contact-sales",
                              "method": "get",
                              "fieldCount": 4,
                              "sourceUrl": "https://apify.com/contact-sales"
                            }
                          ],
                          "pagesCrawledUrls": [
                            "https://apify.com/",
                            "https://apify.com/about",
                            "https://apify.com/change-log/scrapy-support-and-new-integration-guides"
                          ]
                        }
                      ]
                    }
                  }
                },
                "400": {
                  "description": "Invalid, missing or unknown input fields. Nothing ran.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/Error"
                      },
                      "example": {
                        "error": "invalid_input",
                        "errorDescription": "urls: required"
                      }
                    }
                  }
                },
                "422": {
                  "description": "The Actor could not complete this request (for example, nothing matches). No results were delivered.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/Error"
                      }
                    }
                  }
                },
                "500": {
                  "description": "Unexpected failure. Safe to retry.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/Error"
                      }
                    }
                  }
                },
                "504": {
                  "description": "The request used up its 240 s budget. The results found so far are in partialItems.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "allOf": [
                          {
                            "$ref": "#/components/schemas/Error"
                          },
                          {
                            "type": "object",
                            "properties": {
                              "partialItems": {
                                "type": "array",
                                "items": {
                                  "$ref": "#/components/schemas/Item"
                                }
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            },
            "post": {
              "operationId": "lookupPost",
              "summary": "Run one lookup (JSON body)",
              "requestBody": {
                "required": true,
                "content": {
                  "application/json": {
                    "schema": {
                      "type": "object",
                      "properties": {
                        "urls": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "maxItems": 3,
                          "description": "Websites to scan for public contact details. You can paste full URLs or bare domains; duplicates are removed."
                        },
                        "maxPagesPerSite": {
                          "type": "integer",
                          "default": 10,
                          "minimum": 1,
                          "maximum": 10,
                          "description": "Maximum number of pages to fetch per website. Contact, about, team and imprint pages are prioritised."
                        },
                        "maxConcurrency": {
                          "type": "integer",
                          "default": 5,
                          "minimum": 1,
                          "maximum": 20,
                          "description": "How many pages of the same website may be fetched in parallel."
                        },
                        "maxSitesConcurrency": {
                          "type": "integer",
                          "default": 3,
                          "minimum": 1,
                          "maximum": 10,
                          "description": "How many websites are scanned in parallel. Lower this if you hit rate limits."
                        },
                        "requestTimeoutSecs": {
                          "type": "integer",
                          "default": 15,
                          "minimum": 5,
                          "maximum": 60,
                          "description": "Maximum time to wait for one page before trying the next proxy tier."
                        },
                        "defaultCountry": {
                          "type": "string",
                          "enum": [
                            "",
                            "AC",
                            "AD",
                            "AE",
                            "AF",
                            "AG",
                            "AI",
                            "AL",
                            "AM",
                            "AO",
                            "AR",
                            "AS",
                            "AT",
                            "AU",
                            "AW",
                            "AX",
                            "AZ",
                            "BA",
                            "BB",
                            "BD",
                            "BE",
                            "BF",
                            "BG",
                            "BH",
                            "BI",
                            "BJ",
                            "BL",
                            "BM",
                            "BN",
                            "BO",
                            "BQ",
                            "BR",
                            "BS",
                            "BT",
                            "BW",
                            "BY",
                            "BZ",
                            "CA",
                            "CC",
                            "CD",
                            "CF",
                            "CG",
                            "CH",
                            "CI",
                            "CK",
                            "CL",
                            "CM",
                            "CN",
                            "CO",
                            "CR",
                            "CU",
                            "CV",
                            "CW",
                            "CX",
                            "CY",
                            "CZ",
                            "DE",
                            "DJ",
                            "DK",
                            "DM",
                            "DO",
                            "DZ",
                            "EC",
                            "EE",
                            "EG",
                            "EH",
                            "ER",
                            "ES",
                            "ET",
                            "FI",
                            "FJ",
                            "FK",
                            "FM",
                            "FO",
                            "FR",
                            "GA",
                            "GB",
                            "GD",
                            "GE",
                            "GF",
                            "GG",
                            "GH",
                            "GI",
                            "GL",
                            "GM",
                            "GN",
                            "GP",
                            "GQ",
                            "GR",
                            "GT",
                            "GU",
                            "GW",
                            "GY",
                            "HK",
                            "HN",
                            "HR",
                            "HT",
                            "HU",
                            "ID",
                            "IE",
                            "IL",
                            "IM",
                            "IN",
                            "IO",
                            "IQ",
                            "IR",
                            "IS",
                            "IT",
                            "JE",
                            "JM",
                            "JO",
                            "JP",
                            "KE",
                            "KG",
                            "KH",
                            "KI",
                            "KM",
                            "KN",
                            "KP",
                            "KR",
                            "KW",
                            "KY",
                            "KZ",
                            "LA",
                            "LB",
                            "LC",
                            "LI",
                            "LK",
                            "LR",
                            "LS",
                            "LT",
                            "LU",
                            "LV",
                            "LY",
                            "MA",
                            "MC",
                            "MD",
                            "ME",
                            "MF",
                            "MG",
                            "MH",
                            "MK",
                            "ML",
                            "MM",
                            "MN",
                            "MO",
                            "MP",
                            "MQ",
                            "MR",
                            "MS",
                            "MT",
                            "MU",
                            "MV",
                            "MW",
                            "MX",
                            "MY",
                            "MZ",
                            "NA",
                            "NC",
                            "NE",
                            "NF",
                            "NG",
                            "NI",
                            "NL",
                            "NO",
                            "NP",
                            "NR",
                            "NU",
                            "NZ",
                            "OM",
                            "PA",
                            "PE",
                            "PF",
                            "PG",
                            "PH",
                            "PK",
                            "PL",
                            "PM",
                            "PR",
                            "PS",
                            "PT",
                            "PW",
                            "PY",
                            "QA",
                            "RE",
                            "RO",
                            "RS",
                            "RU",
                            "RW",
                            "SA",
                            "SB",
                            "SC",
                            "SD",
                            "SE",
                            "SG",
                            "SH",
                            "SI",
                            "SJ",
                            "SK",
                            "SL",
                            "SM",
                            "SN",
                            "SO",
                            "SR",
                            "SS",
                            "ST",
                            "SV",
                            "SX",
                            "SY",
                            "SZ",
                            "TA",
                            "TC",
                            "TD",
                            "TG",
                            "TH",
                            "TJ",
                            "TK",
                            "TL",
                            "TM",
                            "TN",
                            "TO",
                            "TR",
                            "TT",
                            "TV",
                            "TW",
                            "TZ",
                            "UA",
                            "UG",
                            "US",
                            "UY",
                            "UZ",
                            "VA",
                            "VC",
                            "VE",
                            "VG",
                            "VI",
                            "VN",
                            "VU",
                            "WF",
                            "WS",
                            "XK",
                            "YE",
                            "YT",
                            "ZA",
                            "ZM",
                            "ZW"
                          ],
                          "default": "",
                          "description": "ISO 3166-1 alpha-2 country used to interpret phone numbers written without an international prefix. Leave empty to infer from the website domain."
                        },
                        "useProxy": {
                          "type": "boolean",
                          "default": false,
                          "description": "Start with the Apify proxy ladder instead of trying direct requests first. The actor always retries blocked requests through the proxy ladder automatically."
                        },
                        "smartPrioritise": {
                          "type": "boolean",
                          "default": true,
                          "description": "Try common contact, about, team, imprint and support paths first, and queue contact-like links ahead of other internal links."
                        },
                        "respectRobotsTxt": {
                          "type": "boolean",
                          "default": true,
                          "description": "Skip pages that the website's robots.txt disallows. Turn this off only when you own the site or have permission to crawl it."
                        },
                        "useSitemap": {
                          "type": "boolean",
                          "default": true,
                          "description": "Read sitemap.xml and robots.txt sitemap entries to find contact and about pages that are not linked from the homepage."
                        },
                        "renderFallback": {
                          "type": "boolean",
                          "default": true,
                          "description": "If plain HTML contains no email or phone, render up to two pages in a headless browser to capture contacts loaded by JavaScript."
                        },
                        "onlyWithContacts": {
                          "type": "boolean",
                          "default": false,
                          "description": "Drop records for websites where no email, phone, social profile or contact form was found."
                        },
                        "includeNamedEmails": {
                          "type": "boolean",
                          "default": true,
                          "description": "Include personal addresses such as jane.smith@company.com. When off, only role addresses such as info@, sales@ and support@ are kept."
                        }
                      },
                      "additionalProperties": false,
                      "required": [
                        "urls"
                      ]
                    },
                    "example": {
                      "urls": [
                        "https://apify.com"
                      ],
                      "maxPagesPerSite": 5
                    }
                  }
                }
              },
              "responses": {
                "200": {
                  "description": "The results as a JSON array (at most 10). They are also saved to the run's dataset and billed per result, like a normal run.",
                  "headers": {
                    "X-Item-Count": {
                      "schema": {
                        "type": "integer"
                      },
                      "description": "Results returned."
                    },
                    "X-Status-Message": {
                      "schema": {
                        "type": "string"
                      },
                      "description": "The Actor's last status message, e.g. why nothing was found."
                    }
                  },
                  "content": {
                    "application/json": {
                      "schema": {
                        "type": "array",
                        "items": {
                          "$ref": "#/components/schemas/Item"
                        }
                      },
                      "example": [
                        {
                          "type": "website_contacts",
                          "websiteUrl": "https://apify.com",
                          "status": "success",
                          "pagesCrawled": 5,
                          "maxDepthReached": 1,
                          "crawledAt": "2026-11-10T15:32:38Z",
                          "emails": [
                            "hello@apify.com",
                            "support@apify.com"
                          ],
                          "primaryEmail": "hello@apify.com",
                          "roleEmails": [
                            "hello@apify.com",
                            "support@apify.com"
                          ],
                          "emailDetails": [
                            {
                              "email": "hello@apify.com",
                              "type": "role",
                              "sourceUrl": "https://apify.com/contact",
                              "method": "mailto",
                              "confidence": 0.98,
                              "ownDomain": true,
                              "domainType": "own"
                            },
                            {
                              "email": "support@apify.com",
                              "type": "role",
                              "sourceUrl": "https://apify.com/",
                              "method": "jsonld",
                              "confidence": 0.95,
                              "ownDomain": true,
                              "domainType": "own"
                            }
                          ],
                          "socialLinks": {
                            "discord": "https://discord.com/invite/jyEM2PRvMU",
                            "github": "https://github.com/apify",
                            "linkedin": "https://linkedin.com/company/apify",
                            "tiktok": "https://tiktok.com/@apifyoffice",
                            "twitter": "https://x.com/apify"
                          },
                          "socialProfiles": [
                            {
                              "platform": "discord",
                              "url": "https://discord.com/invite/jyEM2PRvMU",
                              "sourceUrl": "https://apify.com/",
                              "method": "href"
                            },
                            {
                              "platform": "discord",
                              "url": "https://discord.gg/w3e2v7rWDw",
                              "sourceUrl": "https://apify.com/",
                              "method": "href"
                            },
                            {
                              "platform": "github",
                              "url": "https://github.com/apify",
                              "sourceUrl": "https://apify.com/",
                              "method": "href"
                            }
                          ],
                          "companyName": "Apify Technologies s.r.o.",
                          "companyNameSource": "jsonld",
                          "address": {
                            "streetAddress": "Na Příkopě 959/27",
                            "addressLocality": "Prague",
                            "postalCode": "11000",
                            "addressCountry": "CZ"
                          },
                          "contactPageUrl": "https://apify.com/contact",
                          "contactForms": [
                            {
                              "actionUrl": "https://apify.com/contact-sales",
                              "method": "get",
                              "fieldCount": 4,
                              "sourceUrl": "https://apify.com/contact-sales"
                            }
                          ],
                          "pagesCrawledUrls": [
                            "https://apify.com/",
                            "https://apify.com/about",
                            "https://apify.com/change-log/scrapy-support-and-new-integration-guides"
                          ]
                        }
                      ]
                    }
                  }
                },
                "400": {
                  "description": "Invalid, missing or unknown input fields. Nothing ran.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/Error"
                      },
                      "example": {
                        "error": "invalid_input",
                        "errorDescription": "urls: required"
                      }
                    }
                  }
                },
                "422": {
                  "description": "The Actor could not complete this request (for example, nothing matches). No results were delivered.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/Error"
                      }
                    }
                  }
                },
                "500": {
                  "description": "Unexpected failure. Safe to retry.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/Error"
                      }
                    }
                  }
                },
                "504": {
                  "description": "The request used up its 240 s budget. The results found so far are in partialItems.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "allOf": [
                          {
                            "$ref": "#/components/schemas/Error"
                          },
                          {
                            "type": "object",
                            "properties": {
                              "partialItems": {
                                "type": "array",
                                "items": {
                                  "$ref": "#/components/schemas/Item"
                                }
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "components": {
          "schemas": {
            "Item": {
              "type": "object",
              "description": "One result, the same record a normal run saves to its dataset.",
              "properties": {
                "type": {
                  "type": "string"
                },
                "websiteUrl": {
                  "type": "string"
                },
                "status": {
                  "type": "string"
                },
                "pagesCrawled": {
                  "type": "integer"
                },
                "maxDepthReached": {
                  "type": "integer"
                },
                "crawledAt": {
                  "type": "string"
                },
                "emails": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "primaryEmail": {
                  "type": "string"
                },
                "roleEmails": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "emailDetails": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                },
                "socialLinks": {
                  "type": "object"
                },
                "socialProfiles": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                },
                "companyName": {
                  "type": "string"
                },
                "companyNameSource": {
                  "type": "string"
                },
                "address": {
                  "type": "object"
                },
                "contactPageUrl": {
                  "type": "string"
                },
                "contactForms": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                },
                "pagesCrawledUrls": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "example": {
                "type": "website_contacts",
                "websiteUrl": "https://apify.com",
                "status": "success",
                "pagesCrawled": 5,
                "maxDepthReached": 1,
                "crawledAt": "2026-11-10T15:32:38Z",
                "emails": [
                  "hello@apify.com",
                  "support@apify.com"
                ],
                "primaryEmail": "hello@apify.com",
                "roleEmails": [
                  "hello@apify.com",
                  "support@apify.com"
                ],
                "emailDetails": [
                  {
                    "email": "hello@apify.com",
                    "type": "role",
                    "sourceUrl": "https://apify.com/contact",
                    "method": "mailto",
                    "confidence": 0.98,
                    "ownDomain": true,
                    "domainType": "own"
                  },
                  {
                    "email": "support@apify.com",
                    "type": "role",
                    "sourceUrl": "https://apify.com/",
                    "method": "jsonld",
                    "confidence": 0.95,
                    "ownDomain": true,
                    "domainType": "own"
                  }
                ],
                "socialLinks": {
                  "discord": "https://discord.com/invite/jyEM2PRvMU",
                  "github": "https://github.com/apify",
                  "linkedin": "https://linkedin.com/company/apify",
                  "tiktok": "https://tiktok.com/@apifyoffice",
                  "twitter": "https://x.com/apify"
                },
                "socialProfiles": [
                  {
                    "platform": "discord",
                    "url": "https://discord.com/invite/jyEM2PRvMU",
                    "sourceUrl": "https://apify.com/",
                    "method": "href"
                  },
                  {
                    "platform": "discord",
                    "url": "https://discord.gg/w3e2v7rWDw",
                    "sourceUrl": "https://apify.com/",
                    "method": "href"
                  },
                  {
                    "platform": "github",
                    "url": "https://github.com/apify",
                    "sourceUrl": "https://apify.com/",
                    "method": "href"
                  }
                ],
                "companyName": "Apify Technologies s.r.o.",
                "companyNameSource": "jsonld",
                "address": {
                  "streetAddress": "Na Příkopě 959/27",
                  "addressLocality": "Prague",
                  "postalCode": "11000",
                  "addressCountry": "CZ"
                },
                "contactPageUrl": "https://apify.com/contact",
                "contactForms": [
                  {
                    "actionUrl": "https://apify.com/contact-sales",
                    "method": "get",
                    "fieldCount": 4,
                    "sourceUrl": "https://apify.com/contact-sales"
                  }
                ],
                "pagesCrawledUrls": [
                  "https://apify.com/",
                  "https://apify.com/about",
                  "https://apify.com/change-log/scrapy-support-and-new-integration-guides"
                ]
              }
            },
            "Error": {
              "type": "object",
              "required": [
                "error",
                "errorDescription"
              ],
              "properties": {
                "error": {
                  "type": "string",
                  "enum": [
                    "invalid_input",
                    "request_failed",
                    "internal_error",
                    "timeout",
                    "busy",
                    "not_found",
                    "method_not_allowed",
                    "payload_too_large"
                  ]
                },
                "errorDescription": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "buildNumber": "1.1.3",
    "imageDigest": "03c51906b90c7e71fe92d6dbd4a39ffee5f718450338d5258e5ab60c4a3b8286",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.035665555555555555
    }
  }
}