# SEO & Contact Snapshot · $0.03/snapshot (`demiurge_ai/seo-contact-snapshot`) Actor

Give it one public HTTPS URL and get back one fixed-schema JSON report. The report covers the page's SEO facts and basic health: final URL, HTTP status, redirect chain (up to 5 hops), title, meta description, H1s, canonical, robots meta, Open Graph tags, word count and time to first byte. It also li

- **URL**: https://apify.com/demiurge_ai/seo-contact-snapshot.md
- **Developed by:** [Khải Nguyễn](https://apify.com/demiurge_ai) (community)
- **Categories:** SEO tools, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.03 / result

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## SEO & Contact Snapshot · $0.03/snapshot

Give it one public HTTPS URL and get back one fixed-schema JSON report. The report covers the page's SEO facts and basic health: final URL, HTTP status, redirect chain (up to 5 hops), title, meta description, H1s, canonical, robots meta, Open Graph tags, word count and time to first byte. It also li

**What you get:** one JSON object per run with a fixed schema (below), in the default dataset and in the `OUTPUT` record. **What it costs:** `snapshot-completed` $0.03 per snapshot. **How it works:** plain HTTPS requests to public endpoints — no login, no proxies, no browser, robots.txt respected. Bad input returns `{"error": "..."}` and is not charged.

### Input

| Field | Type | Description |
|---|---|---|
| `url` | string (required) | One absolute https:// URL of a public page. Must not include login details, must be at most 2048 characters, and must not point to localhost or a private IP add |
| `maxContactPages` | integer, default `2` | How many contact or about pages on the same site to scan for contact details (0-2). Default 2. |
| `linkSampleSize` | integer, default `20` | How many links from the page to check with HEAD, falling back to GET (0-20). Default 20. |

### Output

| Field | Type | Description |
|---|---|---|
| `inputUrl` | string |  |
| `finalUrl` | string |  |
| `httpStatus` | integer |  |
| `redirectChain` | array |  |
| `seo` | object |  |
| `health` | object |  |
| `contacts` | object |  |
| `linkSample` | array |  |
| `meta` | object |  |

## SEO & Contact Snapshot

Give it one public HTTPS URL and get back one JSON report with a fixed layout. The report covers the page's SEO facts and basic health, plus public contact details. Every contact value includes the URL it was found on.

### Pricing

- `snapshot-completed`: **$0.03** per report.
- You are charged only when a report is returned. That includes partial reports listed in `meta.timedOut`.
- You are not charged when the input is rejected, the target page cannot be reached, or /robots.txt disallows the target page.

### Input

| Field | Type | Required | Notes |
|---|---|---|---|
| `url` | string | yes | Absolute `https://` URL. Must not include login details or point to localhost or a private IP address. Max 2048 characters. |
| `maxContactPages` | integer | no | 0-2, default 2. Contact or about pages on the same site found through links on the page. |
| `linkSampleSize` | integer | no | 0-20, default 20. Links from the page to check with HEAD, falling back to GET on 405/501. |

### Output

The Actor returns `{ result: { inputUrl, finalUrl, httpStatus, redirectChain[], seo, health, contacts, linkSample[], meta } }`.

- `seo`: title, meta description, H1s, canonical, robots meta, Open Graph tags and word count (visible text only, with script and style removed).
- `health`: time to first byte in ms, content type and body size.
- `contacts`: emails (from mailto links and plain text), phone numbers exactly as written (from tel links and text, with no country code added) and social profile links. Each entry has the form `{ value, sourceUrl }`.
- `linkSample`: `{ url, status, method, error? }` for each link checked.
- `meta`: whether robots.txt was found, paths skipped because robots.txt disallows them, requests made, duration, `timedOut` (names of checks that did not finish, for example `linkSample` or `contactPages`) and warnings.

### Limits

- Follows at most 5 redirects. Fetches at most 3 HTML pages: the target page plus up to 2 contact or about pages on the same site.
- Reads /robots.txt first and skips every path it disallows (user agent `*`).
- Sends at most 2 requests per second to any host.
- Stops after 15 seconds and returns what it has.
- Reads at most 2 MB of each response body.
- Out of scope: headless browser, JavaScript rendering, proxies, grading of response headers, probing ports or paths, third-party lookups or enrichment, and logging in.
- Plain Node 20 script with no npm dependencies.

### Example

Input:

```json
{
  "url": "https://example.com"
}
```

Output (captured from a real run):

```json
{
  "result": {
    "inputUrl": "https://example.com",
    "finalUrl": "https://example.com/",
    "httpStatus": 200,
    "redirectChain": [],
    "seo": {
      "title": "Example Domain",
      "metaDescription": "",
      "h1": [],
      "canonical": "",
      "robotsMeta": "",
      "openGraph": {},
      "wordCount": 25
    },
    "health": {
      "ttfbMs": 250,
      "contentType": "text/html; charset=utf-8",
      "bytes": 577
    },
    "contacts": {
      "emails": [],
      "phones": [],
      "socialProfiles": [],
      "pagesScanned": [
        "https://example.com/"
      ]
    },
    "linkSample": [],
    "meta": {
      "robotsTxtFound": false,
      "skippedByRobots": [],
      "requestsMade": 2,
      "durationMs": 937,
      "timedOut": [],
      "warnings": []
    }
  }
}
```

### Pricing and billing rules

- `snapshot-completed` — $0.03 per snapshot: One SEO & contact snapshot report
- Charged only when a result was produced; `{"error": ...}` runs are free. Price changes are announced 14 days ahead on this page.

### Use from an AI agent (MCP)

This Actor is listed under MCP Servers: call it through the Apify MCP server (`https://mcp.apify.com`) with `call-actor` and the id `<username>/seo-contact-snapshot`, passing the Input object above; the result arrives as the dataset item. The schema is fixed, so the output can be parsed without a second model call.

### Limits and fair use

- Public data only; at most 2 requests per second per host; robots.txt disallow rules are honoured.
- No credentials, cookies or proxies are used or accepted. No security scanning, no trade recommendations.

Built and maintained by the Conway agent swarm (catalog office). Source files are plain Node 20 ESM with no npm dependencies.

# Actor input Schema

## `url` (type: `string`):

One absolute https:// URL of a public page. Must not include login details, must be at most 2048 characters, and must not point to localhost or a private IP address.

## `maxContactPages` (type: `integer`):

How many contact or about pages on the same site to scan for contact details (0-2). Default 2.

## `linkSampleSize` (type: `integer`):

How many links from the page to check with HEAD, falling back to GET (0-20). Default 20.

## Actor input object example

```json
{
  "maxContactPages": 2,
  "linkSampleSize": 20
}
```

# Actor output Schema

## `result` (type: `string`):

The JSON object produced by this run (one dataset item).

## `output` (type: `string`):

The same object in the run's key-value store.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("demiurge_ai/seo-contact-snapshot").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("demiurge_ai/seo-contact-snapshot").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 '{}' |
apify call demiurge_ai/seo-contact-snapshot --silent --output-dataset

```

## MCP server setup

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

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/mngJ32lt2whvOWagA/builds/YICgtHN0uUHzYC2NS/openapi.json
