Skip to content

Structured Data Extractor – Schema.org, JSON-LD, OpenGraph & Meta

Try for free

Extract JSON-LD, Microdata, RDFa, Open Graph, Twitter cards and SEO meta tags from any web page, sitemap or crawl. One row per page with a normalized primary entity (price, rating, author, address, event, recipe, job, FAQ) and schema validation hints.

🧩 Structured Data Extractor – Schema.org, JSON-LD, OpenGraph & Meta

Turn any web page into clean, structured JSON. Paste URLs, a sitemap or a whole website and get every JSON-LD, Microdata and RDFa entity, the Open Graph and Twitter card tags, the SEO meta tags (title, description, canonical, robots, hreflang) and the headings outline, plus a normalized primary entity with ready-to-use columns such as price, availability, rating, author, publish date, address and phone. No login, no browser, about $1 per 1,000 pages.

✨ Why use Structured Data Extractor?

  • 🧠 Everything in one row: all schema.org syntaxes, Open Graph, Twitter cards and meta tags for a page, with @graph blocks flattened and @id references resolved.
  • 🎯 Normalized primary entity: Product, Article, Recipe, Event, JobPosting, LocalBusiness/Organization, Course, Video, FAQ and more come out with the same flat fields (price, currency, availability, rating, author, dates, address, salary, ingredients ...), whatever markup the site used.
  • ✅ Validation hints: every entity is checked against Google rich result requirements and you get the missing required and recommended properties.
  • 🕸️ URLs, sitemaps or crawls: extract a list of pages, every page in a sitemap (indexes and .gz included), or follow links on the same website to any depth.
  • ⚡ Fast and cheap: plain HTTP with browser TLS fingerprints, many pages in parallel, datacenter proxy by default with an automatic residential retry when a page blocks.
  • 🛡️ Tolerant parsing: broken JSON-LD (comments, trailing commas, several objects in one block) is repaired where possible and reported in parseErrors when not.

🎯 Use cases

  • 🔍 SEO audits: find pages with missing or invalid schema markup, missing canonicals, duplicate titles or no Open Graph image.
  • 🛒 Product and price feeds: read price, currency, availability, SKU, GTIN, brand and rating from any shop that publishes Product markup, without writing a site-specific scraper.
  • 🤖 LLM and RAG pipelines: feed clean entities (recipes, articles, events, jobs, FAQs) to your models instead of raw HTML.
  • 📰 Content monitoring: track authors, publish and modified dates and headlines across news sites and blogs.
  • 🏪 Local business data: collect business names, addresses, phones, opening hours and coordinates from location pages.
  • 🧪 Competitor research: see which schema types and rich result features competitors use across their whole sitemap.

🚀 How to use

  1. Paste one or more page URLs into Start URLs, and/or add a Sitemap URL (a bare home page reads the sitemaps from robots.txt).
  2. Optional: set Link crawl depth to follow links on the same website, and Max discovered pages to cap sitemap and crawl pages.
  3. Optional: keep only some schema types (for example Product) or switch Output rows to one row per entity.
  4. Click Start. Rows appear while the run is going.
  5. Export the results as JSON, CSV, Excel or HTML, or read them through the API.

📥 Input

FieldWhat it does
startUrlsPages to extract. All listed pages are always processed.
sitemapUrlsXML/text sitemaps or home pages whose robots.txt lists sitemaps.
maxCrawlPagesCap on pages found through sitemaps and crawling, on top of the start URLs (default 20, 0 = no limit). One start URL with link crawling and maxCrawlPages: 15 extracts up to 16 pages.
crawlDepthFollow same-site links this many levels deep (default 0).
includeUrlPatterns / excludeUrlPatternsRegular expressions or text that discovered URLs must / must not match.
entityTypesKeep only pages or entities with these schema.org types.
onlyPagesWithStructuredDataSkip pages without JSON-LD, Microdata or RDFa.
outputModepages (one row per page) or entities (one row per entity).
syntaxesWhich markup to read: json-ld, microdata, rdfa, opengraph, twitter, meta.
validateSchema, includeRawData, includeHeadingsTurn validation hints, raw markup and the headings outline on or off.
proxyConfigurationDatacenter by default; residential retry is automatic for blocked pages.
{
  "startUrls": ["https://www.apple.com/shop/buy-iphone/iphone-16"],
  "sitemapUrls": ["https://crawlee.dev"],
  "maxCrawlPages": 100,
  "entityTypes": [],
  "outputMode": "pages",
  "proxyConfiguration": { "useScrapelyProxy": true, "scrapelyProxyGroups": ["DATACENTER"] }
}

📤 Output

One row per page. The table view shows the flat columns; the nested fields hold the complete data. Pages that could not be extracted (blocked, not found, unreachable, not HTML, invalid URL) are not saved as rows: the run's status message counts them and the OUTPUT record lists each one under failedInputs (input, reason, statusCode).

FieldDescription
url, finalUrl, statusCode, statusThe page, where it redirected, and its HTTP status (status is always ok: only extracted pages are saved).
title, metaDescription, canonicalUrl, metaRobots, language, h1Core SEO meta.
primaryType, primaryNameType and name of the page's main entity.
price, priceCurrency, availability, ratingValue, reviewCount, brand, skuCommerce fields of the main entity.
author, datePublished, startDate, telephone, addressArticle, event and business fields of the main entity.
primaryEntityThe normalized main entity with all type-specific fields (for example ingredients, instructions, salaryMin, jobLocations, openingHours, latitude).
entitiesAll normalized entities on the page, with their source (json-ld, microdata, rdfa).
faq, breadcrumbsFAQ questions and answers, and the breadcrumb trail.
validation, validationErrorCountMissing required and recommended properties per entity.
og, openGraph, twitter, twitterCardMain and complete Open Graph and Twitter card tags.
hreflang, alternates, headings, headingCounts, metaTagsLanguage alternates, feeds/AMP links, headings outline and all other meta tags.
jsonLd, microdata, rdfaRaw items as found on the page.
schemaTypes, entityCount, hasJsonLd, hasMicrodata, hasRdfa, hasOpenGraph, hasTwitterCard, parseErrorsSummary flags and markup problems.

Example row (trimmed):

{
  "url": "https://www.apple.com/shop/buy-iphone/iphone-16",
  "statusCode": 200,
  "status": "ok",
  "title": "Buy iPhone 16 - Apple",
  "canonicalUrl": "https://www.apple.com/shop/buy-iphone/iphone-16",
  "language": "en-US",
  "h1": "Buy iPhone 16",
  "primaryType": "Product",
  "primaryName": "iPhone 16",
  "price": 799.0,
  "priceCurrency": "USD",
  "schemaTypes": ["Product", "BreadcrumbList", "ListItem", "FAQPage", "Question"],
  "entityCount": 3,
  "hasJsonLd": true,
  "hasOpenGraph": true,
  "validationErrorCount": 0,
  "primaryEntity": {
    "type": "Product",
    "kind": "Product",
    "name": "iPhone 16",
    "url": "https://www.apple.com/shop/buy-iphone/iphone-16",
    "price": 799.0,
    "priceCurrency": "USD",
    "lowPrice": 799.0,
    "highPrice": 829.0,
    "source": "json-ld"
  },
  "faq": [{ "question": "Can I activate an iPhone 16 outside of the United States?", "answer": "iPhone 16 ... models purchased in the U.S. ... activate only using eSIM. ..." }],
  "breadcrumbs": [
    { "position": 1, "name": "iPhone", "url": "https://www.apple.com/iphone" },
    { "position": 2, "name": "iPhone 16", "url": "https://www.apple.com/iphone-16" }
  ],
  "validation": [
    { "type": "Product", "valid": true, "missingRequired": [], "missingRecommended": ["brand", "sku", "offers.availability"], "source": "json-ld" }
  ],
  "og": { "title": "Buy iPhone 16", "type": "product", "siteName": "Apple", "locale": "en_US" },
  "twitter": { "card": "summary_large_image", "site": "@apple" },
  "headingCounts": { "h1": 1, "h2": 5, "h3": 24, "h4": 0, "h5": 0, "h6": 0 },
  "jsonLd": [{ "@context": "https://schema.org", "@type": "Product", "name": "iPhone 16", "offers": [{ "@type": "AggregateOffer", "lowPrice": 799.0, "highPrice": 829.0, "priceCurrency": "USD" }] }]
}

In entity mode every row is one entity (pageUrl, pageTitle, type, kind, name, source, the normalized fields and the raw item).

💰 Pricing

You pay $1.00 per 1,000 extracted pages ($0.001 per page), plus the small platform usage of the run (compute and proxy traffic). Pages that fail (blocked, not found, unreachable, not HTML, invalid URL) and pages skipped by your filters are not charged. In entity mode you still pay per page, not per entity.

Example: extracting 1,000 product pages costs $1.00 in page events plus a few cents of platform usage.

❓ FAQ

Is it legal? The actor reads public pages, the same markup search engines read. Respect each site's terms and local laws, and do not collect personal data without a legal basis.

Do I need a login or my own proxy? No. The datacenter proxy is included and pages that block it are retried once over a residential proxy automatically.

How many pages can I extract? As many as you list, plus up to maxCrawlPages from sitemaps and crawling (0 = no limit). Large crawls of tens of thousands of pages work; rows are saved continuously.

Why is a field empty? The site simply does not publish it in its markup. validation tells you which important properties are missing. The actor does not guess values from the visible text.

Does it run JavaScript? No. It reads the HTML the server sends, which is where nearly all sites put their structured data for search engines. Markup injected only by client-side JavaScript is not seen.

Can I schedule it or use the API? Yes. Schedule runs, call it through the API, or connect it to your workflows and export the dataset in any format.

⚠️ Limits

  • No JavaScript rendering: markup added only in the browser is not extracted.
  • Pages behind logins, paywalls or strict anti-bot walls (for example DataDome, AWS WAF or Cloudflare challenges such as stackoverflow.com) are skipped, listed in OUTPUT failedInputs with the reason, and not charged.
  • Link crawling stays on the start URLs' websites (www and non-www count as the same site) and reads at most 5 MB of HTML per page.
  • Validation hints follow the main Google rich result requirements in simplified form; they are not a full replacement for Google's Rich Results Test.
  • Microformats and Dublin Core are not reported.

Related actors

G2
4.7/5
Excellent
Trustpilot

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

No credit card. No setup calls.