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.
Steps
- Paste page URLs into
startUrls, or pass dataset items that have aurlfield, for example the output of the sitemap URL extractor. - Set
maxUrlsas a hard cap; robots.txt is respected by default. - Export as CSV and sort by the
issuescolumn 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
- Content audits: find pages with missing or duplicate titles and descriptions across a whole blog.
- Site migrations: check that canonicals, hreflang and titles survived the move.
- Competitor research: compare titles, headings and schema types of top-ranking pages.
- Client reports: one spreadsheet of on-page issues per site for an agency audit.
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
- How to extract all URLs from a website's sitemap (and find broken links)
- How to find every broken link and redirect on a website, with the pages to fix
- How to run Lighthouse on hundreds of URLs and get Core Web Vitals in one table
More guides
- Bulk tech stack lookup: a Wappalyzer / BuiltWith alternative for thousands of domains
- How to scrape Greenhouse, Lever and Ashby jobs (plus Personio, Teamtailor, Recruitee)
- How to export all products from any Shopify store to CSV or JSON
- How to scrape jobs from Workday career sites (myworkdayjobs.com)
- How to export products from any WooCommerce store to CSV or JSON
- How to export EU public tenders from TED (Tenders Electronic Daily) to CSV or JSON
- How to scrape remote jobs from Himalayas, Remote OK, We Work Remotely and more in one run
- How to export open EU funding calls (Horizon Europe, Digital Europe, cascade funding) to CSV or JSON
- How to turn any RSS or Atom feed into JSON or CSV (bulk, with monitoring)
- How to extract emails, phone numbers and social links from a list of company domains
- How to take bulk website screenshots from a URL list and save them to CSV or Google Drive
- How to export US federal (SAM.gov) and UK (Contracts Finder) tenders to CSV or JSON
- How to look up French companies by SIREN or SIRET and build a B2B list from Sirene
- How to look up Norwegian companies by organisation number and build lead lists from Brreg
- How to download SEC filings (10-K, 10-Q, 8-K, Form 4) by ticker and search EDGAR full text
- How to validate NPI numbers in bulk and build US healthcare provider lists from NPPES
- How to look up hundreds of UK companies on Companies House at once (profile, officers, PSC)
- How to look up Finnish companies by Y-tunnus and build B2B lead lists from the YTJ register
- How to extract all URLs from a website's sitemap (and find broken links)
- How to transcribe hundreds of audio and video files to text and subtitles with Whisper
- How to extract text from hundreds of PDFs, including scanned ones, in one run
- How to clean an email list before a campaign: bulk MX, disposable and typo check
- How to get Dutch public tenders from TenderNed into a spreadsheet, with daily alerts
- How to find every broken link and redirect on a website, with the pages to fix
- How to validate LEI codes and find the LEI for a list of companies in bulk
- How to run Lighthouse on hundreds of URLs and get Core Web Vitals in one table