Bulk SEO Metadata Extractor: Title, Meta, Open Graph & JSON-LD avatar

Bulk SEO Metadata Extractor: Title, Meta, Open Graph & JSON-LD

Pricing

$2.00 / 1,000 page extracteds

Go to Apify Store
Bulk SEO Metadata Extractor: Title, Meta, Open Graph & JSON-LD

Bulk SEO Metadata Extractor: Title, Meta, Open Graph & JSON-LD

Title, meta description, canonical, robots, hreflang, Open Graph, H1 and JSON-LD types for a URL list or a whole sitemap. $2 per 1,000 pages, failures free.

Pricing

$2.00 / 1,000 page extracteds

Rating

0.0

(0)

Developer

Hill Country Bots

Hill Country Bots

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 hours ago

Last modified

Features

Limited permissions

Share

Pull the SEO metadata of hundreds of pages in one run. This bulk meta tag extractor fetches each page once and returns the title, meta description, canonical, meta robots and X-Robots-Tag, hreflang, html lang, every H1, Open Graph and Twitter card tags, JSON-LD schema types, viewport, favicon and word count. Paste a URL list or point it at a sitemap. You get one clean row per page, ready for CSV or Google Sheets. Plain HTTP, respects robots.txt, no login, no personal data. $2 per 1,000 pages. 404s, non-HTML files, timeouts, robots.txt skips and invalid inputs are free.

What does this SEO metadata extractor do?

  • URLs mode: extract metadata for exactly the URLs you paste
  • Sitemap mode: give a website or sitemap URL. It reads robots.txt, sitemap indexes and gzip, then extracts every listed page up to maxPages
  • Returns title and meta description with lengths, so too-long or missing tags are easy to sort
  • Flags isIndexable (noindex in meta robots, googlebot or X-Robots-Tag) and canonicalIsSelf
  • Lists schema.org types from JSON-LD (Organization, Product, Article, FAQPage, BreadcrumbList and so on), plus how many JSON-LD blocks are invalid JSON
  • Writes a RUN_SUMMARY with counts of missing titles, descriptions, canonicals, H1s and og:images, and the top duplicate titles

Who is it for?

  • SEO agencies: a site-wide title and meta description sheet for audits, migrations and client reports
  • Content and social teams: check Open Graph and Twitter card tags before sharing links
  • Developers and AI agents: link-preview data and structured data types as stable JSON through the API or MCP

Quick start

  1. Paste page URLs. The form is prefilled with three, so Start works right away.
  2. For a whole site, switch Mode to Every page in the sitemap and give the homepage.
  3. Click Start, then export JSON, CSV or Excel, or use the Open Graph & Twitter view.

Sample output

From a real run on November 12, 2026, at 8:04 AM CT (America/Chicago), URLs mode, 10 inputs: 7 pages extracted in under 3 seconds, and the 404, the JSON file and the invalid URL came back as free error rows.

URLTitle (length)Desc. lengthCanonicalH1sJSON-LD typeshreflang
https://wordpress.org/Blog Tool, Publishing Platform, and CMS | WordPress.org (55)90self1Organization, ImageObject, WebSite, WebPage100+
https://apify.com/Apify: Marketplace of ready-to-run tools for AI143self1Organization, PostalAddress, ContactPoint, WebSite0
https://web.dev/web.dev (7)66self0Article, Organization, WebSite, SearchAction44
https://www.python.org/Welcome to Python.org (21)52missing5WebSite, SearchAction0
https://httpbin.org/status/404(error HTTP_404, free)

Example inputs

Metadata for a list of pages:

{
"mode": "urls",
"startUrls": ["https://wordpress.org/", "https://apify.com/", "https://web.dev/"]
}

Every page in a site's sitemap (up to 500):

{
"mode": "sitemap",
"startUrls": ["https://www.sitemaps.org/"],
"maxPages": 500
}

Only blog posts from a sitemap:

{
"mode": "sitemap",
"startUrls": ["https://example.com/sitemap.xml"],
"includePatterns": ["https://example.com/blog/*"],
"maxPages": 1000
}

Input

FieldTypeDefaultWhat it does
startUrlsarray of strings(required, prefilled)URLs mode: pages. Sitemap mode: websites or sitemap URLs. Private and internal addresses are refused (free).
modeurls, sitemapurlsPasted URLs only, or every page in the sitemap.
maxPagesinteger1000Spend cap: pages fetched in the run.
includePatterns / excludePatternsarrays(none)* globs or /regex/ for sitemap URLs.
respectRobotsTxtbooleantrueDisallowed pages are not fetched (free error row).
maxConcurrencyinteger 1-3010Pages in flight in total.
maxConcurrencyPerHostinteger 1-53Pages in flight per site.
requestTimeoutSecsinteger20Seconds before a page is marked TIMEOUT (retried once).

Output example

{
"url": "https://wordpress.org/",
"finalUrl": "https://wordpress.org/",
"statusCode": 200,
"title": "Blog Tool, Publishing Platform, and CMS | WordPress.org",
"titleLength": 55,
"metaDescription": "Open source software which you can use to easily create a beautiful website, blog, or app.",
"metaDescriptionLength": 90,
"canonical": "https://wordpress.org/",
"canonicalIsSelf": true,
"metaRobots": "max-image-preview:large",
"isIndexable": true,
"htmlLang": "en-US",
"hreflang": [{"hreflang": "af-za", "href": "https://af.wordpress.org/"}],
"h1Count": 1,
"jsonLdTypes": ["Organization", "ImageObject", "WebSite", "WebPage"],
"status": "ok",
"errorCode": null
}

Each row also has h1, h1All, ogTitle, ogDescription, ogImage, ogUrl, ogType, ogSiteName, twitterCard, twitterTitle, twitterDescription, twitterImage, jsonLdBlocks, jsonLdInvalidBlocks, metaViewport, favicon, wordCount, redirectCount, responseTimeMs and sourceSitemap. Missing tags are null (lengths and counts are 0), so the CSV columns stay the same on every row.

A page that could not be extracted is not charged:

{"url": "https://httpbin.org/status/404", "statusCode": 404, "status": "error", "errorCode": "HTTP_404", "errorMessage": "HTTP 404"}

For AI agents and integrations

  • Branch on status: ok = one extracted HTML page (the billable event), error = free.
  • errorCode is one of INVALID_URL, PRIVATE_URL, EMPTY_INPUT, EMPTY_SITEMAP, ROBOTS_DISALLOWED, HTTP_<code>, NOT_HTML, DNS_NOT_FOUND, CONNECTION_REFUSED, TLS_ERROR, TIMEOUT, NETWORK_ERROR, TOO_MANY_REDIRECTS, REDIRECT_LOOP, UNSAFE_REDIRECT.

Use it from the API or MCP

  • Actor ID: hillcountrybots/bulk-seo-metadata-extractor
curl -X POST "https://api.apify.com/v2/acts/hillcountrybots~bulk-seo-metadata-extractor/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls":["https://wordpress.org/","https://apify.com/"]}'
  • MCP (Claude, Cursor, ChatGPT and other MCP clients): add https://mcp.apify.com?tools=hillcountrybots/bulk-seo-metadata-extractor.

How much does it cost?

$2 per 1,000 pages ($0.002 per page-extracted event, one per HTML page that answered 2xx and was parsed). No start fee. You pay nothing for:

  • invalid or private inputs
  • 4xx and 5xx pages, non-HTML files, timeouts and network errors
  • pages skipped by robots.txt, filters or the cap
  • the run summary

Example: a 500-page sitemap costs $1.00. Cap spend with maxPages or the run's max charge setting.

Limits

  • Plain HTTP only. Tags that JavaScript adds after load (some single-page apps) are not seen.
  • It reports what the page says. It does not score pages; for scores and fixes use the SEO Audit Tool.
  • hreflang keeps the first 100 alternates; hreflangCount has the full number.

FAQ

Can I get every page on a site? Yes, with sitemap mode. If a page is not in the sitemap, paste it in URLs mode.

Does it check structured data validity? It lists the schema.org types and counts JSON-LD blocks that are not valid JSON. It does not run Google's rich result test.

Does it collect personal data? No. It reads public page metadata only.

Does it follow redirects? Yes, up to 10. finalUrl and redirectCount show where the page ended up.

More tools from Hill Country Bots

See everything we make at hillcountrybots.com.

Support

Missing a tag you need? Open an issue on the Issues tab with the run ID and the URL. We reply within 2 business days (US Central time). Built and maintained by Hill Country Bots.