# Website SEO & Mobile Audit — Agency Lead Review (`analytical_gratefulness/website-opportunity-audit`) Actor

Audit public HTTPS homepages for SEO and mobile configuration signals. Evidence-based website review queue for agencies; no login or external AI key. $0.005 per completed website audit.

- **URL**: https://apify.com/analytical\_gratefulness/website-opportunity-audit.md
- **Developed by:** [black cow](https://apify.com/analytical_gratefulness) (community)
- **Categories:** SEO tools, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 completed website audits

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

## Website SEO & Mobile Audit — Agency Lead Review

Turn a list of public business homepages into a review queue with concrete server-HTML evidence. Useful after a Maps/directory export when a web or SEO agency wants to inspect websites before deciding what work to propose.

Paste up to **10 homepage addresses**. Bare domains and copied `http://` addresses are normalized to HTTPS; the Actor never makes an HTTP request. Get one row per unique website with title length, description, mobile viewport, noindex, H1, language, canonical-link, image-alt and contact-link observations. Findings include a fixed explanation of what to review next.

**$0.005 per successfully audited website ($5 per 1,000), platform usage included.** No start fee. No custom audit event for the synthetic demo, rejected input, robots blocks, failed fetches, challenge pages, or non-HTML responses. An audited site with zero findings still counts as one completed audit. A maximum of 10 unique websites means at most $0.05 of audit events per supported run. Previous successful audits can remain charged if a later storage failure stops the run. When the platform reports the spending limit reached, the Actor stops before requesting the next website; `PARTIAL_SPENDING_LIMIT` and `deferred_count` identify unprocessed sites when a summary can be saved.

### Quick start

1. Start with **Synthetic demo** to see an example without fetching any website.
2. Select **Audit public websites** and enter homepage URLs, such as `https://example.com/`.
3. Run the Actor and open **Website review queue**. Filter `status = AUDITED` and sort `review_count` or `finding_count` to select pages for manual review.
4. Export CSV, Excel or JSON. `website` identifies the input and `final_website` shows any supported redirect destination. The findings view explains each code.

The `websites` input accepts an array of URL strings. If you already have a Google Maps scraper dataset, copy its website URL column; this Actor does not invoke that scraper or pay its fees for you. Duplicate normalized URLs are inspected and charged once.

```json
{"mode":"audit","websites":["https://example.com/"],"delete_input_after_read":true}
```

### See a result before running

Synthetic example: a repair studio has a title and H1, but no device-width viewport or description and one image without an alt attribute. The review queue reports:

```json
{"status":"AUDITED","review_count":1,"evidence":{"title_characters":20,"device_width_viewport_observed":false,"description_observed":false,"images_without_alt_attribute":1},"recommended_next_step":"manual_review"}
```

This excerpt uses invented data. The full output adds all observations and fixed advice. It does not say the business will buy a service. Start with the free synthetic demo; change to **Audit public websites** only when you want to inspect your own list.

### What the observations mean

- **Title/description:** whether those fields appeared in the server HTML; page text is not returned.
- **Mobile viewport:** whether `width=device-width` appeared. This is one configuration check, not a rendered mobile usability test.
- **Noindex:** an observed generic/Googlebot instruction in HTML or X-Robots-Tag; review whether it is intentional.
- **Images:** counts missing the alt attribute and counts with empty alt. Empty alt can be appropriate for decorative images.
- **Contact link:** recognized mail, telephone or contact-page links. Link destinations, phone numbers and email addresses are not collected into results. A general form can be a search box, so its presence does not prove a contact route.
- **Canonical:** reports presence only, without asserting that the target is correct.

No numeric SEO score, conversion forecast, company revenue or buying intent is invented. Missing server-HTML evidence may be supplied by JavaScript or a linked page. A site with no listed findings has not passed a full SEO, accessibility or security audit.

### Supported sites and limits

- Public **HTTPS root requests only**, standard port 443, no credentials, query, fragment or non-root path. Copied bare domains and `http://` roots are upgraded to HTTPS. Sites that do not support HTTPS and redirects to HTTP or language/login paths remain unsupported.
- Public DNS addresses are checked and pinned to the connection; private, loopback, link-local and transition addresses are rejected, including redirected targets. TLS certificate verification stays enabled.
- Robots.txt is checked before the homepage and again for a redirected origin. Disallowed roots, unavailable policies, unsupported request-rate rules or crawl delays above 2 seconds are skipped. This conservative policy can skip sites another crawler can read.
- No login, browser, JavaScript, cookies, CAPTCHA workaround, paid proxy, third-party AI, Maps API, forms submission or outreach.
- Maximum 10 input URLs, 60 requests, four root attempts per site, 1 MiB HTML response, 128 KiB robots response, UTF-8 HTML only. Identity and gzip responses are supported; both compressed and decompressed bodies must fit these size limits. Other compression formats are skipped. Network time budget 85 seconds, hosted hard timeout 120 seconds. A stalled DNS lookup is ultimately bounded by the hosted timeout.
- `NOT_AUDITED` includes a fixed reason code; it is not evidence that a website is broken. Unavailable targets are not classified as sales prospects.

### Privacy and storage

Apify receives the URL input and performs network requests on its servers. The target receives the Actor's public-network request and User-Agent. The developer's PC files, environment secrets and browser accounts are not needed.

By default the current run's INPUT record is explicitly deleted after reading it. Disable `delete_input_after_read` only if you want that record retained. Deletion does not prove erasure from platform backups, caches or other copies. The dataset and OUTPUT retain website URLs, numeric/boolean observations and fixed advice; raw HTML, page title text, contacts and response headers are not stored. Keep result access private. This product does not independently verify Apify's internal administration or isolation.

### Offline HTML review

The included Python package also audits an explicitly supplied UTF-8 HTML file without any network request. The core/CLI use the standard library. The Apify adapter requires the separately declared runtime extra. Output is created with owner-only permissions and cannot overwrite an existing file.

```text
python -m site_audit examples/demo.html --output report.json
```

Offline analysis does not test TLS, robots or HTTP response headers. It remains a server-HTML evidence check.

### Related products

For Shopify import files, use [Catalog Preflight](https://apify.com/analytical_gratefulness/shopify-catalog-preflight) for one-file checks or [CSV ChangeGuard](https://apify.com/analytical_gratefulness/shopify-catalog-changeguard) for before/after change risks. These are separate tools and are not called or charged by this Actor.

### Demo input boundary

Demo mode accepts no supplied website list. Choose `mode=audit` to inspect your public homepages. Rejected input is available in the dataset and OUTPUT without an audit event. Demo results describe only the synthetic example.

# Actor input Schema

## `mode` (type: `string`):

Demo uses synthetic HTML. Audit checks each unique public HTTPS homepage. Failed or blocked targets have no custom audit event.

## `websites` (type: `array`):

1–10 homepage addresses, e.g. example.com or https://example.com/. Bare domains and http:// entries are upgraded to HTTPS; no HTTP request is sent. Root only: no path, login, query, fragment, or private host. Duplicates are checked once. Maximum $0.05 of audit events per run.

## `delete_input_after_read` (type: `boolean`):

Recommended for privacy. Output retains website URLs and summarized evidence. INPUT deletion does not guarantee erasure from platform backups or other copies.

## Actor input object example

```json
{
  "mode": "demo",
  "delete_input_after_read": true
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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 = {
    "mode": "demo"
};

// Run the Actor and wait for it to finish
const run = await client.actor("analytical_gratefulness/website-opportunity-audit").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 = { "mode": "demo" }

# Run the Actor and wait for it to finish
run = client.actor("analytical_gratefulness/website-opportunity-audit").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 '{
  "mode": "demo"
}' |
apify call analytical_gratefulness/website-opportunity-audit --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,analytical_gratefulness/website-opportunity-audit"
        }
    }
}

```

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/ARhq4SJCeYgdhpkA0/builds/ehxRLMEC4f7YRi2YL/openapi.json
