Versions follow MAJOR.MINOR.PATCH (src/version.py); Apify shows MAJOR.MINOR from .actor/actor.json.
Every run logs its version and records it in the RUN_STATS key-value record.
First release.
- One row per website: emails, E.164 phone numbers (libphonenumber) with format, type, country and source, ten social
networks, contact page, contact form, address from structured data; optional one row per email.
- Websites from
urls, or a dataset and field (datasetId, datasetUrlField, keepFields). A Google Maps item's
countryCode sets the country for its local numbers.
- Reads the start page, then the same site's contact, legal-notice, about, team and privacy pages, best first, up to
maxPagesPerSite; tries common addresses when the start page links to none. Language copies of a page count once.
- Charged per page read (
page-scanned), with rows free. Failed, missing, blocked and disallowed pages aren't charged.
The maximum cost per run limits the pages fetched, and maxResults the websites.
- Limited permissions: the dataset is read through the resource-picker field. An integration has to set it to
{{resource.defaultDatasetId}}; a dataset id only in payload gets a 403 (runs jTtW6z2bwLhur78Qi and
A8YcasE2IRRHJm5Q1, 2026-11-04), and the run ends with no charge and a message saying what to set.
- Failure isolation: a failing website only affects its own row.
Source check (checklist section 6): the actor has no fixed source. It reads the public pages of websites the user names,
with no login, through the shared guarded client: honest User-Agent, robots.txt and Crawl-delay honoured, no proxies
(checklist 2b), and bot checks reported, never worked around. Terms differ per website, so the README's legal section
leaves that check, and the data-protection duties for what comes back, with the user. Same model as page-to-markdown,
seo-audit and tech-stack-detector.