# On-Page SEO Checker - Bulk Website SEO Audit

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

- Category: Rank tracking & site SEO
- Price: $6 per 1,000 × page audit, billed per result by Apify (no subscription); any other billed events are listed on the Store page. Cap any run with `maxTotalChargeUsd`.
- Store page: https://apify.com/wrenfield-data/on-page-seo-checker
- Human page: https://wrenfielddata.com/tools/on-page-seo-checker/
- OpenAPI 3 spec: https://api.apify.com/v2/acts/wrenfield-data~on-page-seo-checker/builds/default/openapi.json
- MCP tool: https://mcp.apify.com?tools=wrenfield-data/on-page-seo-checker (appears as `wrenfield-data--on-page-seo-checker`)

## Call it

Synchronous run that returns the dataset rows as JSON (use `/runs` for long jobs and poll; see the OpenAPI spec):

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/wrenfield-data~on-page-seo-checker/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://www.helpscout.com/pricing/ | help desk pricing", "https://apify.com/pricing"]}'
```

## Input

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `urls` | array |  |  | One page per line (up to 2,000). https:// is added when missing. To check a target keyword for one page, write https://example.com/page \| your keyword. |
| `targetKeyword` | 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` | boolean |  | `false` | Turn on for single-page apps (React, Vue) whose content only appears after scripts run. Adds a small per-page fee. |
| `includeRawChecks` | boolean |  | `false` | Adds every raw pass/fail check flag to each row. |

## Example input

```json
{
  "urls": [
    "https://www.helpscout.com/pricing/ | help desk pricing",
    "https://apify.com/pricing"
  ]
}
```

## Output fields

One flat row per result:

| Field | Type | Description |
|---|---|---|
| `url` | string | URL submitted |
| `final_url` | string | URL after redirects |
| `status` | string | ok or error |
| `error` | string | Why the page could not be audited |
| `http_status` | number | HTTP status code |
| `grade` | string | A-F grade for the score |
| `issues_critical` | number | Critical issues |
| `issues_high` | number | High-priority issues |
| `issues_medium` | number | Medium issues |
| `issues_low` | number | Low issues |
| `issues` | array | Issues sorted by severity, each with a fix |
| `title` | string | Page title |
| `title_length` | number | Title length in characters |
| `meta_description` | string | Meta description |
| `meta_description_length` | number | Description length |
| `h1` | array | H1 headings |
| `h2_count` | number | Number of H2 headings |
| `h3_count` | integer | Number of H3 headings |
| `canonical` | string | Canonical URL |
| `word_count` | number | Words of body text |
| `text_to_html_ratio` | number | Text to HTML ratio |
| `readability_flesch` | number | Flesch reading ease |
| `internal_links` | number | Internal links |
| `external_links` | number | External links |
| `images` | number | Images |
| `html_fetch_ms` | number | Time to fetch the HTML (ms) |
| `page_size_bytes` | number | HTML size in bytes |
| `broken_links` | boolean | Page has broken links |
| `target_keyword` | string | Target keyword checked |
| `keyword_in_title` | boolean | Keyword in title |
| `keyword_in_h1` | boolean | Keyword in H1 |
| `keyword_in_description` | boolean | Keyword in meta description |
| `keyword_in_url` | boolean | Keyword in URL |
| `checked_at` | string | Check time (UTC) |
| `schema_types` | array | JSON-LD / schema.org types found on the page |
| `open_graph` | boolean | Open Graph tags present |
| `seo_score` | integer | SEO score 0-100: starts at 100, minus 20 per critical, 8 per high, 4 per medium, 1 per low issue |
| `technical_score` | number | Crawler technical health score 0-100 (HTML, speed and markup checks only) |

## Notes

- Auth: an Apify API token as `Authorization: Bearer <token>`; the MCP server also supports OAuth sign-in.
- Failed or empty results are not charged on most tools; check the pricing on the Store page.
- Questions: hello@wrenfielddata.com
