Bulk SEO Metadata Extractor: Title, Meta, Open Graph & JSON-LD
Pricing
$2.00 / 1,000 page extracteds
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 hours ago
Last modified
Categories
Features
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) andcanonicalIsSelf - 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_SUMMARYwith 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
- Paste page URLs. The form is prefilled with three, so Start works right away.
- For a whole site, switch Mode to Every page in the sitemap and give the homepage.
- 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.
| URL | Title (length) | Desc. length | Canonical | H1s | JSON-LD types | hreflang |
|---|---|---|---|---|---|---|
| https://wordpress.org/ | Blog Tool, Publishing Platform, and CMS | WordPress.org (55) | 90 | self | 1 | Organization, ImageObject, WebSite, WebPage | 100+ |
| https://apify.com/ | Apify: Marketplace of ready-to-run tools for AI | 143 | self | 1 | Organization, PostalAddress, ContactPoint, WebSite | 0 |
| https://web.dev/ | web.dev (7) | 66 | self | 0 | Article, Organization, WebSite, SearchAction | 44 |
| https://www.python.org/ | Welcome to Python.org (21) | 52 | missing | 5 | WebSite, SearchAction | 0 |
| 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
| Field | Type | Default | What it does |
|---|---|---|---|
startUrls | array of strings | (required, prefilled) | URLs mode: pages. Sitemap mode: websites or sitemap URLs. Private and internal addresses are refused (free). |
mode | urls, sitemap | urls | Pasted URLs only, or every page in the sitemap. |
maxPages | integer | 1000 | Spend cap: pages fetched in the run. |
includePatterns / excludePatterns | arrays | (none) | * globs or /regex/ for sitemap URLs. |
respectRobotsTxt | boolean | true | Disallowed pages are not fetched (free error row). |
maxConcurrency | integer 1-30 | 10 | Pages in flight in total. |
maxConcurrencyPerHost | integer 1-5 | 3 | Pages in flight per site. |
requestTimeoutSecs | integer | 20 | Seconds 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. errorCodeis one ofINVALID_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.
hreflangkeeps the first 100 alternates;hreflangCounthas 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.
- SEO Audit Tool: 0-100 SEO score per page, top 5 fixes and a client-ready HTML report. $2 per 1,000 pages, failures free.
- Sitemap URL Extractor: every URL from a site's XML sitemaps. $0.50 per 1,000 URLs.
- Bulk PageSpeed Insights Test: Lighthouse scores and Core Web Vitals for many URLs. $3 per 1,000 audits, failures free.
- Tech Stack Detector: CMS, analytics, CDN and frameworks for many sites. $0.50 per 1,000 sites.
- Bulk Domain Availability Checker: available or taken, from official registry RDAP. $1 per 1,000 domains.
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.