# Contact Page Audit & Business Channel Extractor (`taroyamada/contact-details-extractor`) Actor

Audit public contact, about, support, and policy pages from supplied websites for business-channel inventory, source URLs, and site QA workflows.

- **URL**: https://apify.com/taroyamada/contact-details-extractor.md
- **Developed by:** [naoki anzai](https://apify.com/taroyamada) (community)
- **Categories:** SEO tools, Business, Developer tools
- **Stats:** 10 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Contact Details Extractor

### Run the next report

Turn contact/about/support page observations into a capped QA report/export run:

- [Run a contact page audit report](https://apify.com/taroyamada/site-qa-contact-page-audit-scraper) when you need support-path, policy-link, and response-channel QA issues grouped into a reviewable report.

This follow-on actor is for site QA and compliance review of user-supplied public pages. Use it for support-path inventory, policy coverage checks, and reviewable audit exports.

RevOps, support ops, compliance reviewers, and data teams use this actor to turn public business contact pages from websites supplied by the user into a clean dataset for Site QA & Content Intelligence Pack.
Provide focused source inputs, keep the first run small, and expand only after the output shape is useful.
Each emitted row includes source context, timestamps, and fields designed for monitoring, QA, research, or workflow handoff.

### Store Quickstart

Start with owned or target-account contact/about/support pages. The actor emits public business contact-channel rows only; person-level private-contact candidates are suppressed and counted in warnings.

Recommended first run:

```json
{
  "urls": [
    "https://example.com/contact"
  ],
  "maxChargeUsd": 1,
  "delivery": "dataset",
  "dryRun": false
}
```

### Input examples

#### Company site

```json
{
  "urls": [
    "https://example.com/contact"
  ],
  "maxChargeUsd": 1,
  "delivery": "dataset",
  "dryRun": false
}
```

#### Account data hygiene

```json
{
  "domains": [
    "example.com"
  ],
  "paths": [
    "/contact",
    "/about"
  ],
  "maxChargeUsd": 1,
  "delivery": "dataset",
  "dryRun": false
}
```

#### Webhook validation

```json
{
  "urls": [
    "https://example.com/support"
  ],
  "delivery": "webhook",
  "webhookUrl": "https://example.com/webhook",
  "dryRun": false
}
```

### Sample output

```json
{
  "meta": {
    "actorName": "contact-details-extractor",
    "actorTitle": "Contact Details Extractor",
    "bundle": "Site QA & Content Intelligence Pack",
    "fetchedAt": "2026-05-06T00:00:00.000Z",
    "totalRows": 1
  },
  "rows": [
    {
      "actorName": "contact-details-extractor",
      "rowType": "public_contact_channel",
      "domain": "example.com",
      "sourceUrl": "https://example.com/contact",
      "supportChannel": "support form",
      "phone": "+1 555 0100",
      "socialUrls": [
        "https://www.linkedin.com/company/example"
      ],
      "fetchedAt": "2026-05-06T00:00:00.000Z"
    }
  ],
  "warnings": []
}
```

### Output fields

- `rowType`
- `domain`
- `sourceUrl`
- `supportChannel`
- `phone`
- `socialUrls`
- `confidence`
- `warnings`
- `fetchedAt`

Rows also include source URLs, fetch timestamps, warnings when a source is partial, and stable IDs when the workflow supports recurring change detection.

### Pricing and no-change runs

$0.001 actor start and $0.008 per verified public business contact-channel row. Empty scans, person-level-only pages, unverified rows, and policy-suppressed candidates should not create dataset charges.

The default dataset is the billable surface. Dry runs, validation-only runs, missing-key warnings, and unchanged recurring polls should not write payable default-dataset rows.

### Compliance guardrails

- Use with public business contact, about, support, location, legal, privacy, or company pages and a lawful basis for downstream processing.
- Designed for account data hygiene, support-channel inventory, and compliance review. Person-level private-contact candidates are suppressed rather than emitted.
- Individual contact harvesting, personal profile collection, bulk promotional messaging, and consent-free communication workflows are outside the intended use.
- Do not use provider emblems or wording that implies approval by an upstream data provider.

### See also

- [site-qa-contact-page-audit-scraper](https://apify.com/taroyamada/site-qa-contact-page-audit-scraper) - convert contact/about/support observations into a capped contact-page QA report.
- [site-qa-content-report-scraper](https://apify.com/taroyamada/site-qa-content-report-scraper) - review page content, metadata, and source coverage as a site QA report.
- [site-qa-broken-link-report-scraper](https://apify.com/taroyamada/site-qa-broken-link-report-scraper) - turn public URL checks into issue and report events.

> 💾 **Save it for later**: click the bookmark icon at the top of the Apify Store page if you'd like to come back to it. Bookmarks help other engineers find this actor via Apify's discovery surfaces.

### ⭐ Was Contact Page Audit & Business Channel Extractor useful for your public contact-page audit?

If this actor saved you time, **[please leave a 5★ rating on Apify Store](https://apify.com/taroyamada/contact-details-extractor/reviews)** — it takes 10 seconds, helps other engineers and analysts discover it, and keeps updates free.

Have a feature request, bug, or sample workflow you'd like to share? **[Open an issue](https://apify.com/taroyamada/contact-details-extractor/issues)** — we read every one and use them to prioritise the next release.

# Actor input Schema

## `urls` (type: `array`):

Contact, about, support, or company URLs to extract public business contact channels from (max 100). Person-level emails are suppressed.

## `concurrency` (type: `integer`):

Parallel requests (1-5 recommended for public contact pages).

## `timeoutMs` (type: `integer`):

Request timeout in milliseconds.

## `delivery` (type: `string`):

Non-dry-run Apify runs write canonical dataset rows first. Choose webhook to POST one full payload only after dataset output succeeds.

## `webhookUrl` (type: `string`):

URL to POST the full payload when delivery=webhook and dryRun=false, after dataset output succeeds.

## `dryRun` (type: `boolean`):

If true, skips dataset writes and webhook delivery; local output/result.json is still written.

## `maxChargeUsd` (type: `number`):

Safety cap for this run. Billable rows beyond this cap are returned as no-charge limit\_reached summaries.

## Actor input object example

```json
{
  "urls": [
    "https://www.icann.org/contact",
    "https://automattic.com/contact/"
  ],
  "concurrency": 5,
  "timeoutMs": 15000,
  "delivery": "dataset",
  "dryRun": false,
  "maxChargeUsd": 1
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://www.icann.org/contact",
        "https://automattic.com/contact/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("taroyamada/contact-details-extractor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "urls": [
        "https://www.icann.org/contact",
        "https://automattic.com/contact/",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("taroyamada/contact-details-extractor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.icann.org/contact",
    "https://automattic.com/contact/"
  ]
}' |
apify call taroyamada/contact-details-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,taroyamada/contact-details-extractor"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1DsM6JuHN1ySAcgPm/builds/ONDfgUVKNl54obI4r/openapi.json
