# On-Page SEO Checker - Bulk Website SEO Audit (`wrenfield-data/on-page-seo-checker`) Actor

Audit any list of URLs for on-page SEO: 0-100 score, prioritized issues with a fix for each, title/meta/H1 checks, keyword placement, page speed, structured data. 50+ checks, no crawl limits, from $0.006 per page.

- **URL**: https://apify.com/wrenfield-data/on-page-seo-checker.md
- **Developed by:** [Wrenfield Data](https://apify.com/wrenfield-data) (community)
- **Categories:** SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.50 / 1,000 page audits

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## On-Page SEO Checker - Bulk Website SEO Audit

**On-Page SEO Checker** audits a list of URLs (up to 2,000 per run) and returns one row per page with an **SEO score (0-100) and A-F grade, every issue ranked by severity with the exact fix, title / meta description / H1 checks, target-keyword placement, content depth, structured data, and technical health**. Run it on a whole site's key pages in minutes and export to CSV, Excel or Google Sheets.

Built for SEO audits, agency client reports, pre-launch QA and monitoring pages after a release. **From $0.006 per page** ($6 per 1,000), no crawl limits, no subscription, no API key.

- 🧮 **SEO score and grade** per page: starts at 100 and loses points for each critical, high, medium and low issue, so a page with no H1 and no description cannot score an A.
- 🛠️ **Prioritized fix list**: every issue has a severity and a one-line fix, ready to paste into a ticket or client report.
- 🎯 **Target keyword check**: is the keyword in the title, H1, meta description and URL? Set one keyword for all pages or one per line (`url | keyword`).
- 📝 **Page facts**: title and description length, H1s, heading counts, canonical, word count, readability, internal / external links, images, Open Graph tags.
- 🧩 **Structured data**: lists the schema.org types found (Organization, FAQPage, Product, Article...) and flags pages with none.
- ⚡ **Technical health**: HTTP status, HTML fetch time, page size, render-blocking resources, compression, HTTPS, mixed content, broken links.
- 🌐 **JavaScript rendering** (optional) for React / Vue / single-page sites, with a browser-measured load time.
- 📊 **Run summary**: average score, the lowest-scoring pages, and the issues that repeat across most of your pages.

### How to run a bulk on-page SEO audit

1. Paste your **URLs** (one per line; `https://` is added when missing).
2. Optionally add a **target keyword**, or write `https://example.com/page | keyword` for per-page keywords.
3. Click **Start**. About 50 pages take under a minute. Export the dataset, or read the **Run summary** for the site-wide issue list.

### Input example

```json
{
    "urls": [
        "https://www.helpscout.com/pricing/",
        "https://www.helpscout.com/ | help desk software"
    ],
    "targetKeyword": "customer support software",
    "renderJavaScript": false
}
```

### Output example

One dataset row per page (shortened here):

```json
{
    "url": "https://www.helpscout.com/pricing/",
    "status": "ok",
    "http_status": 200,
    "seo_score": 69,
    "grade": "D",
    "technical_score": 94.2,
    "issues_high": 1,
    "issues_medium": 5,
    "issues": [
        {
            "id": "keyword_not_in_title",
            "severity": "high",
            "issue": "Target keyword \"help desk pricing\" is not in the title",
            "fix": "Work the exact keyword into the title, ideally near the start."
        },
        {
            "id": "duplicate_meta_tags",
            "severity": "medium",
            "issue": "Duplicate meta tags",
            "fix": "Remove repeated title/description/robots meta tags so each appears once."
        }
    ],
    "title": "Help Scout Pricing: Affordable Customer Support Software",
    "title_length": 56,
    "meta_description": "Discover Help Scout’s pricing plans for customer support software that’s built for growing businesses at a fraction of the cost of competitive tools.",
    "meta_description_length": 149,
    "h1": [
        "Deliver delightful support at every stage of growth"
    ],
    "word_count": 1836,
    "html_fetch_ms": 46,
    "page_size_bytes": 658234,
    "broken_links": false,
    "target_keyword": "help desk pricing",
    "keyword_in_title": false,
    "keyword_in_h1": false,
    "keyword_in_description": false,
    "keyword_in_url": false
}
```

The **Run summary** (key-value store record `SUMMARY`) lists the average score, the 10 lowest-scoring pages and the top site-wide issues with how many pages each affects.

### What is checked

| Area | Examples |
| --- | --- |
| Title and snippet | missing, too short (under 30), too long (over 60), duplicate or mismatched title; missing or mismatched meta description |
| Headings | missing H1, several H1s, no H2s |
| Keyword placement | keyword missing from title, H1, meta description or URL |
| Content | thin content, low text-to-HTML ratio, hard-to-read copy, placeholder text |
| Images and links | images without alt text, broken links, HTTPS pages linking to HTTP |
| Indexing | canonical tag, redirects, 4xx / 5xx errors, meta-refresh redirects |
| Markup | schema.org types present or missing, Open Graph tags, doctype, charset, favicon, deprecated tags |
| Speed and delivery | slow server response, render-blocking resources, no gzip / brotli, pages over 3 MB |

### Pricing

Pay-per-event pricing. Paid Apify plans get automatic volume discounts (Bronze, Silver, Gold).

| Event | Price |
| --- | --- |
| Page audit (`page-audit`) | **$0.006** per URL audited ($6 per 1,000) |
| JavaScript render (`javascript-render`) | **$0.004** extra per URL, only when **Render JavaScript** is on |

Pages that cannot be fetched (domain not found, blocked, timed out) are **never charged**. Set the maximum cost per run in the run options and the Actor stops cleanly when it is reached.

**Free Apify plan:** 10 URLs per run.

### Use it through the API, on a schedule or with AI agents

**One-link MCP setup:** `https://mcp.apify.com?tools=wrenfield-data/on-page-seo-checker` (Claude, Cursor, VS Code or any MCP client). Set `maxTotalChargeUsd` on the run to cap what it can charge.

Schedule a weekly audit of your money pages, call it from the [Apify API](https://docs.apify.com/api/v2), or connect it to Make, Zapier, n8n and Google Sheets. One page takes about 2-5 seconds.

### FAQ

**How is the SEO score calculated?**
Every page starts at 100. Each critical issue costs 20 points, high 8, medium 4 and low 1. A score of 90+ is an A, 80+ B, 70+ C, 60+ D. The `technical_score` field also gives the crawler's own 0-100 health score for HTML, speed and markup.

**Does it crawl my whole site?**
No. It audits exactly the URLs you give it, so you pay only for the pages you care about. To audit a full site, paste the URLs from your sitemap.

**Why do I need JavaScript rendering?**
Pages built with React, Vue or Angular may show an empty shell without it. Turn it on when word counts or headings look empty.

**Why was my page not audited?**
The domain does not exist, the site blocks automated requests, or it timed out. The row says which, and failed pages are not charged.

**Is a high score a ranking guarantee?**
No. The score measures page-level SEO hygiene. Rankings also depend on links, competition and search intent.

### Related tools

From the same developer:

- [Bulk PageSpeed & Core Web Vitals Checker](https://apify.com/wrenfield-data/bulk-pagespeed-checker): Lighthouse scores and real-user Core Web Vitals
- [Website Tech Stack Detector](https://apify.com/wrenfield-data/website-tech-stack-detector): CMS, frameworks, analytics and ad tags
- [Keyword Search Volume](https://apify.com/wrenfield-data/keyword-search-volume): pick the target keyword before you audit the page
- [SEO Toolkit All-in-One](https://apify.com/wrenfield-data/seo-toolkit): traffic, keywords, competitors and backlinks of any domain

### Feedback and support

Missing a check, hit an error, or want another output field? Open an issue on the **Issues** tab and include the run ID. We read every issue and reply there.

### Acceptable use

- This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by Google.
- Only audit websites you own or have a legitimate reason to audit, and don't use it to load-test or attack websites.
- The Actor may not be used from, or for people or organizations in, Russia, Belarus, Cuba, Iran, Syria, Myanmar, North Korea, Crimea or the Russian-occupied territories of Ukraine.
- You are responsible for using the results lawfully.

# Actor input Schema

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

One page per line (up to 2,000). <code>https://</code> is added when missing. To check a target keyword for one page, write <code>https://example.com/page | your keyword</code>.

## `targetKeyword` (type: `string`):

Checks that this keyword is in the title, H1, meta description and URL of every page (a per-line keyword after | overrides it).

## `renderJavaScript` (type: `boolean`):

Turn on for single-page apps (React, Vue) whose content only appears after scripts run. Adds a small per-page fee.

## `includeRawChecks` (type: `boolean`):

Adds every raw pass/fail check flag to each row.

## Actor input object example

```json
{
  "urls": [
    "https://www.helpscout.com/",
    "https://apify.com/pricing",
    "https://example.com"
  ],
  "renderJavaScript": false,
  "includeRawChecks": false
}
```

# Actor output Schema

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

No description

## `allFields` (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 = {
    "urls": [
        "https://www.helpscout.com/",
        "https://apify.com/pricing",
        "https://example.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("wrenfield-data/on-page-seo-checker").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.helpscout.com/",
        "https://apify.com/pricing",
        "https://example.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("wrenfield-data/on-page-seo-checker").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.helpscout.com/",
    "https://apify.com/pricing",
    "https://example.com"
  ]
}' |
apify call wrenfield-data/on-page-seo-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,wrenfield-data/on-page-seo-checker"
        }
    }
}
```

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/Yd2Y0SXjUg4pWXDPX/builds/PRlFBqskISrgLKD40/openapi.json
