๐Ÿฆ– TinyRex Data Toolspractical guides for web data APIs

How to audit titles, meta descriptions, H1s and canonicals for hundreds of pages at once

Updated 2026-10-28 ยท Tool used: SEO On-Page Audit - Title Meta H1 Canonical OG Schema on Apify ยท Price: about $1.50 per 1,000 pages; unreachable pages are free

Browser SEO extensions check one page at a time, and desktop crawlers need a licence once a site has more than a few hundred URLs. For a quick content audit, a migration check or a competitor comparison you usually just want one row per page with the tags that matter and a list of what is wrong.

This guide shows how to audit any list of page URLs (pasted, from a sitemap export or from another actor's dataset) and get a table with title and description lengths, headings, canonical and hreflang, social tags, structured data types, link and image counts, word count and flags such as missing title, title too long >60 or multiple h1.

Open SEO On-Page Audit on Apify โ†’

Steps

  1. Paste page URLs into startUrls, or pass dataset items that have a url field, for example the output of the sitemap URL extractor.
  2. Set maxUrls as a hard cap; robots.txt is respected by default.
  3. Export as CSV and sort by the issues column to see which pages need a new title, description, H1 or canonical first.

Example input

{
  "startUrls": [
    "https://example.com",
    "https://apify.com"
  ],
  "maxUrls": 100
}

Example output (one item, shortened)

{
  "url": "https://apify.com",
  "finalUrl": "https://apify.com/",
  "statusCode": 200,
  "redirected": true,
  "contentType": "text/html; charset=utf-8",
  "title": "Apify: Full-stack web scraping and data extraction platform",
  "titleLength": 58,
  "metaDescription": "Apify is the largest ecosystem of web scraping and automation tools.",
  "metaDescriptionLength": 70,
  "metaRobots": "index, follow",
  "metaViewport": "width=device-width, initial-scale=1",
  "charset": "utf-8",
  "lang": "en",
  "canonical": "https://apify.com/",
  "canonicalMatchesUrl": true,
  "hreflang": [],
  "og": {
    "title": "Apify",
    "description": "Full-stack web scraping and data extraction platform",
    "image": "https://apify.com/og.png",
    "url": "https://apify.com/",
    "type": "website",
    "siteName": "Apify"
  },
  "twitter": {
    "card": "summary_large_image",
    "title": "Apify",
    "description": "Full-stack web scraping platform",
    "image": "https://apify.com/og.png"
  },
  "headings": {
    "h1": [
      "Get data. Automate anything."
    ],
    "h2": [
      "Actors",
      "Integrations"
    ],
    "h1Count": 1,
    "h2Count": 2,
    "h3Count": 4,
    "h4Count": 0,
    "h5Count": 0,
    "h6Count": 0
  },
  "jsonLd": [
    {
      "types": [
        "Organization"
      ],
      "raw": "{\"@type\":\"Organization\",\"name\":\"Apify\"}"
    }
  ],
  "links": {
    "internal": 42,
    "external": 8,
    "nofollow": 2
  },
  "images": {
    "total": 12,
    "missingAlt": 1
  },
  "wordCount": 850,
  "issues": [
    "1 image(s) missing alt"
  ],
  "error": null,
  "checkedAt": "2026-10-12T07:10:00.000Z"
}

Every run's dataset can be downloaded as JSON, CSV, Excel, XML or HTML from the Apify Console, or via https://api.apify.com/v2/datasets/<datasetId>/items?format=csv.

Run it from code

Python

from apify_client import ApifyClient  # pip install apify-client

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
  "startUrls": [
    "https://example.com",
    "https://apify.com"
  ],
  "maxUrls": 100
}
run = client.actor("tinyrex/seo-on-page-audit").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

JavaScript / Node.js

import { ApifyClient } from 'apify-client'; // npm i apify-client

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('tinyrex/seo-on-page-audit').call({
  "startUrls": [
    "https://example.com",
    "https://apify.com"
  ],
  "maxUrls": 100
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

curl (no SDK)

# Runs the actor and returns the results directly (CSV here; use format=json for JSON)
curl -X POST "https://api.apify.com/v2/acts/tinyrex~seo-on-page-audit/run-sync-get-dataset-items?format=csv" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls": ["https://example.com", "https://apify.com"], "maxUrls": 100}' > results.csv

Get your API token in Apify Console โ†’ Settings โ†’ API & Integrations. The free Apify plan includes monthly credit that is enough to try this.

Use it from an AI agent (MCP)

The Apify MCP server exposes this actor as a tool for Claude, Cursor, VS Code, n8n and other MCP clients. Add this to your client's MCP config (or use the OAuth flow at mcp.apify.com instead of a token):

{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=tinyrex/seo-on-page-audit",
      "headers": {
        "Authorization": "Bearer <YOUR_APIFY_TOKEN>"
      }
    }
  }
}

Then ask in plain language, e.g. "Bulk seo checker for this list and give me a table".

Use cases

Pricing

Pay per result: about $1.50 per 1,000 pages; unreachable pages are free. You can cap the cost of every run in the run options.

FAQ

How do I check meta descriptions for all pages of a site?

Export the site's URLs from its sitemap (the sitemap URL extractor does this), then pass the list to this actor. Every row has metaDescription and its length.

Does it render JavaScript?

No. It reads the HTML the server returns, which is what most search engines index first. Pages that build their tags only in the browser will show those tags as missing.

Which issues are flagged?

Short flags such as missing title, title too long, missing meta description, multiple H1, missing canonical and images without alt text, so you can filter the sheet quickly.

Is it a full crawler?

No, it audits exactly the URLs you give it. Use the sitemap extractor or the broken link checker to discover URLs first.

Try it on Apify โ†’

Related guides

More guides