Structured Data Extractor
Pricing
$3.00 / 1,000 analysed pages
Structured Data Extractor
JSON-LD, microdata, RDFa Lite, Open Graph, Twitter Card, meta, hreflang and canonical for a list of URLs, with SEO validation flags, in one call.
Pricing
$3.00 / 1,000 analysed pages
Rating
0.0
(0)
Developer
openrows
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Reads every machine-readable signal a page publishes about itself — JSON-LD, microdata, RDFa Lite,
Open Graph, Twitter Card, the basic <head> meta tags, hreflang alternates and the canonical URL —
and flags what's missing against a simple set of SEO/rich-result rules. Built for SEO audits,
AI-visibility ("GEO") audits and content-ops QA, where the usual tools give you one or two of these
formats and make you stitch the rest together yourself.
Give it a list of URLs. It fetches exactly those pages — nothing is discovered or crawled beyond them — and returns one result per page. HTTP-only, no browser, so runs are fast and cheap.
What data you get
For every page the Actor returns:
| Field | Description |
|---|---|
url | Page the result was extracted from |
scrapedAt | ISO 8601 timestamp of the extraction |
jsonLd | Every JSON-LD entity found, flattened out of any @graph wrapper, each keeping its @type |
microdata | Top-level itemscope items (HTML microdata), each with its itemtype(s), itemid and properties |
rdfa | Top-level [typeof] items (RDFa Lite), each with its type(s), resource and properties |
openGraph | og:* meta properties, keyed without the og: prefix |
twitter | twitter:* meta tags, keyed without the twitter: prefix (creator/site and every label*/data* pair are dropped — see below) |
meta | title, description, robots, viewport, charset from <head> |
hreflang | <link rel="alternate" hreflang> entries, with absolute URLs |
canonical | <link rel="canonical"> target, resolved to an absolute URL, or null |
validation | Missing required properties for recognised @types — see "Validation rules" below |
raw | Only when includeRaw is true: each JSON-LD block in its original, unflattened shape |
Input
| Option | Type | Default | Description |
|---|---|---|---|
urls | array | - | Pages to extract structured data from. Required. |
maxItems | integer | 100 | Stop after this many results (max 10,000). Also your cost cap. |
includeRaw | boolean | false | Also return each page's JSON-LD blocks in their original, unflattened shape. |
proxyConfiguration | object | Apify datacenter | Proxy settings |
Example input:
{"urls": ["https://docs.apify.com/", "https://schema.org/Product"],"maxItems": 50}
Output example
{"url": "https://schema.org/Product","scrapedAt": "2026-09-22T10:15:30.000Z","jsonLd": [{ "@type": "WebPage", "name": "Product - Schema.org Type" }],"microdata": [],"rdfa": [],"openGraph": {},"twitter": {},"meta": {"title": "Product - Schema.org Type","description": null,"robots": null,"viewport": null,"charset": "UTF-8"},"hreflang": [],"canonical": null,"validation": []}
A run summary (items pushed, items skipped by category, pages fetched, failed requests by category,
stop reason) is stored in the run's key-value store under the key OUTPUT.
Validation rules
A simple, documented rule set — not a full schema.org or Google Rich Results validator. For entities
whose type matches one of the rows below (checked on both jsonLd and microdata; rdfa is not
checked), the Actor flags which of the listed properties are missing. A type not in this list is not
checked at all, and a matching entity with nothing missing produces no entry in validation[].
| Type (any of) | Required properties checked |
|---|---|
Product | name, image, description, offers |
Article, NewsArticle, BlogPosting | headline, image, datePublished |
Organization | name, url |
BreadcrumbList | itemListElement |
author/creator are intentionally absent from every row: this Actor drops those properties for
privacy before validation ever runs (see "Data and compliance"), so requiring them would flag a page
as broken for a field it never had a chance to keep.
Pricing
Pay per result. You are charged per result and nothing else: no platform usage, no compute units. Listing pages, retries and failed requests are free. The current rate is on the Pricing tab of this Actor — that is the only place it is set, so no figure is repeated here.
maxItemscaps the number of results, and therefore the cost, of a run.- The run also stops when it reaches the maximum total charge you set for the run in Apify Console or through the API.
Tips
- Start with
maxItems: 20to check the fields before a large run. - If you only need the source's own
@graphgrouping rather than this Actor's flattenedjsonLd[]list, setincludeRaw: trueand readraw.jsonLdBlocks.
Limitations
- Pages that require a login, or that build their structured data with client-side JavaScript after load, are not accessible to an HTTP-only fetch and are not scraped — you'll get an empty result, not an error.
microdataandrdfado not supportitemref/indirect property references (properties pulled in from elsewhere in the document by id) — only directly nested properties are read. Uncommon in practice; every page seen while building this Actor used direct nesting.openGraphcovers theog:namespace only, not Facebook's widerarticle:/profile:namespaces (which can themselves carry personal fields likearticle:authororprofile:first_name).rdfapicks up any[typeof]attribute, including non-schema.org uses of the same mechanism (for example, MediaWiki sites annotate their own templates with amw:namespace viatypeof). These are harmless but not useful signal — filter by type prefix if your source does this.validationcovers four common types with a fixed property list each; it is not a general schema.org or Google Rich Results validator.
Data and compliance
This Actor is site-agnostic: it fetches only the URLs you give it, and does not discover, crawl or follow links beyond them. You choose the sources and are responsible for them — for your right to use the pages you point this Actor at, and for how you use the results.
This Actor collects publicly available, non-personal data only:
- It fetches pages that are reachable without logging in and does not bypass access controls or solve CAPTCHAs.
- It identifies itself with a plain
openrows/structured-data-extractorUser-Agent and sends no headers that imitate a browser. - It removes fields that identify a person before a result is stored:
- any JSON-LD, microdata or RDFa entity whose type is (or includes)
Person— matched whether the type is given as a bare term, a prefixed name or a full IRI, with or without a trailing slash; - the properties
author,creator,byline,contributor,dc:creator,email,telephone,tel, wherever they appear in JSON-LD, microdata or RDFa; - the Twitter Card
twitter:creatorandtwitter:sitehandles, and everytwitter:label*/twitter:data*pair — including the bare, unnumberedtwitter:label/twitter:dataform (free-form slots some sites use for a byline or reading time; the label text is caller-controlled, so these are dropped by key pattern regardless of what they say).creator/siteare user handles, and this Actor does not try to guess which handles belong to an organisation rather than a person, so both are dropped rather than heuristically kept.
- any JSON-LD, microdata or RDFa entity whose type is (or includes)
- Credit fields are kept as public professional attribution. A
developer,publisher,editororholdername is kept exactly as the source page shows it — the same way a book cover credits its author, or software credits its publisher. This does not weaken the removal above: an entity that is itselfPerson-typed is still dropped even when it fills a credit field, andauthor/creator/byline/contributor/email/telephoneare still dropped wherever they appear. - Free text a page displays in its own right — a product name, an article headline, a description —
is not personal data merely for being prose, and passes through unless its property name matches the
list above. This also means a byline can reach the output through free text the property-name filter
does not scan: for example, a page's own
text-style free-text property (as in some of schema.org's microdata examples) can contain prose like"...by John Doe". This Actor does not scan free-text values for embedded names — doing so would mean guessing at what is a name inside arbitrary prose, which this Actor does not attempt (see the credit-fields point above). That text passes through as the buyer's content, same as any other free text on the page.
How robots.txt is handled
Before the first page on a host is fetched, the Actor fetches that host's robots.txt once and obeys
it for the rest of the run. Rules are read for the product token openrows, falling back to the *
group when the file does not name us, with * and $ wildcards and the standard "longest matching
rule wins" precedence. A Crawl-delay set for us is honoured, up to 10 seconds. When a page redirects,
the URL the redirect actually leads to is checked again against its own host's rules before anything is
read from it, so a redirect cannot carry the Actor onto a site, or a path, that its owner puts off limits.
- Disallowed URLs are never requested. They are reported under
skipped.robotsDisallowedin the run summary, so you can see exactly how many of your input URLs the site puts off limits. - No
robots.txt(404 or 410) means no rules, and the host is crawled normally. It is counted asrobotsAbsentin the summary. - A
robots.txtwe cannot read means the host is skipped, not crawled. Any other response — 401, 403, 429, a 5xx, a timeout, a network failure, or a 200 that turns out to be an error or login page — leaves us without the site's rules, and this Actor will not guess. Every URL on that host is skipped and counted underskipped.robotsUnknown, and the host and the status that stopped us are listed underrobots.unknownHostsin the summary. If a host you supplied returns no results, look there first.
Removal requests. If you believe this Actor exposes data it should not, open an issue on the Actor's Issues tab and state the URL(s) concerned. Requests are answered there, and the fields or pages in question are removed.
You are responsible for using the extracted data in line with the terms of the sites you point this Actor at and the laws that apply to you.
Support
Report bugs and request fields on the Issues tab of this Actor. Include the run ID.