Web Page to JSON & JSON-LD Extractor avatar

Web Page to JSON & JSON-LD Extractor

Pricing

from $0.45 / 1,000 pages

Go to Apify Store
Web Page to JSON & JSON-LD Extractor

Web Page to JSON & JSON-LD Extractor

Extract JSON-LD, page metadata, Markdown, links and images from public URLs. Add fields using CSS selectors or regex. Reads HTML without a browser.

Pricing

from $0.45 / 1,000 pages

Rating

0.0

(0)

Developer

mia.cx

mia.cx

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Read a page's structured data without making your agent parse its HTML. Send public URLs for JSON-LD, metadata, main-content Markdown, links and images, plus optional CSS or regex fields. Each successful page costs $0.00045, plus $0.00005 per run start at default memory. The Actor reads HTML without a browser or runtime LLM calls.

Try it

{"urls":["https://github.com/apify/crawlee"]}

An empty input {} extracts the same page. No upstream API key is needed.

Use from an agent

Add https://mcp.apify.com?tools=miacx/page-to-json to your MCP client and sign in to Apify. Call the dedicated Actor tool, then use get-dataset-items to read the completed run's dataset. Or set APIFY_TOKEN to your Apify API token and call the API for JSON rows:

curl --fail-with-body 'https://api.apify.com/v2/actors/miacx~page-to-json/run-sync-get-dataset-items' \
-H "Authorization: Bearer $APIFY_TOKEN" -H 'Content-Type: application/json' \
-d '{"urls":["https://github.com/apify/crawlee"]}'

What you get

The dataset contains one row per unique canonical URL, including failed pages. Read status first. On ok, inspect data; otherwise read error. Successful rows can have data.warnings, data.truncated or data.fieldErrors and still incur a Page event.

Selected fields from replaying the synthetic test/fixtures/article.html fixture:

{
"url": "https://gazette.example/news/solar-co-ops",
"status": "ok",
"ok": true,
"data": {
"title": "Solar Co-ops Are Rewiring Small Towns | The Commons Gazette",
"lang": "en-GB",
"canonical": "https://gazette.example/news/solar-co-ops",
"jsonLd": [{
"@context": "https://schema.org",
"@type": "NewsArticle",
"headline": "Solar Co-ops Are Rewiring Small Towns",
"datePublished": "2026-10-30T08:00:00Z",
"author": {"@type": "Person", "name": "Rhiannon Price"}
}]
}
}

Successful rows include fetchedAt and source with final URL, HTTP status, content type, redirects and cache state. fetchedAt is the original fetch time, retained on cache hits. Failed rows omit data, source and fetchedAt.

data contains title, lang, canonical, meta, openGraph, twitter, jsonLd, microdata and rdfa. It also contains headings, content.markdown, content.wordCount, links and images. Missing title, language and canonical values are null; missing maps and arrays are empty. Repeated metadata keys become arrays. Microdata and RDFa resources contain type, id and properties.

Custom fields appear under data.fields. No match returns null, or an empty array with all: true. Invalid specs and failed conversions appear in data.fieldErrors; other page data remains available.

Input

FieldDefaultAccepted input
urls["https://github.com/apify/crawlee"]Nonempty array, up to 1,000 distinct input entries. Public HTTP(S) URLs, at most 2,048 characters each.
extract{}Up to 50 field names mapped to CSS strings or field-spec objects. Omitted adds no custom fields.

Fragments are removed before page deduplication. A field can be a selector string, such as {"headline":"h1"}, or an object:

{
"urls": ["https://github.com/apify/crawlee"],
"extract": {
"headline": "h1",
"links": {"selector": "main a", "attribute": "href", "type": "url", "all": true}
}
}

Field objects accept selector, optional attribute, regex, type and all. Types are string (default), number, integer, boolean or url. RE2 regex keeps capture group 1, or the whole match when no group exists. Selectors allow at most 300 characters and 32 parts; :has, ~ and :nth-* are unsupported. all: true returns at most 100 matches.

Pricing

One Page event costs $0.00045, including metadata and caller fields. Ten successful pages cost $0.00455, including $0.00005 per run start at default 256 MB memory. One thousand Page events cost $0.45, plus run starts.

Truncated pages, field errors and pages with no structured data still count when extraction succeeds. Failed pages incur no Page events. Canonical duplicates incur no additional Page events within the run. Cached pages still count. The $0.00005 run start applies even with no billable pages at default memory. Apify counts one start event per GB of memory, with a minimum of one event.

Limits and data freshness

  • The Actor processes up to 1,000 distinct input entries, with five pages in flight.
  • HTML reads stop at 2 MiB; the retained prefix is parsed. DOM limits are 50,000 nodes and 256 retained nesting levels.
  • Markdown caps at 100,000 characters. Links, images and headings cap at 1,000, 500 and 500.
  • JSON-LD caps at 50 blocks, 200,000 characters per block and depth 64. Microdata and RDFa each cap at 100 items.
  • HTML extraction runs no scripts. Main-content selection can miss sibling containers; RDFa support covers RDFa Lite.

Read data.truncated for limits that shortened output. The Actor uses a per-run memory cache, honoring cache restrictions and freshness up to one hour. There is no persistent cross-run HTML cache. Robots policy applies to each URL and redirect, including cache hits. Private destinations are blocked.

If a row fails

StatusNext step
invalid_url, blocked_urlSupply an absolute public HTTP(S) URL without credentials.
robots_denied, robots_unavailableCheck robots policy or retry once it is available.
fetch_failed, timeout, http_errorInspect error; HTTP failures include the response status.
too_many_redirects, unsupported_content_typeSupply the final HTML page URL.
charge_limit_reachedIncrease the run charge limit or reduce the batch.
internal_errorKeep the error and run ID for investigation.

For batches exceeding the synchronous API's 300-second wait, use asynchronous runs.