Website JSON-LD Structured Data Scraper icon

Search & SEO · Live on Apify

Website JSON-LD Structured Data Extractor

Read JSON-LD structured data from a list of web pages. You get the original objects and their schema types. You also see broken scripts and page errors.

About $1.80 for 1,000 pages$0.0018 per page + $0.001 per run. Apify bills you, not us.Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Run it on Apify Opens apify.com, the website where our tools run. Sign up free with Google or email, no card needed.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure

What you get, for example

urlhttps://apify.com/
finalUrlhttps://apify.com/
objectCount3

How to use it: 3 steps

  1. Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
  2. Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example: {"url": "https://apify.com"} in Page URLs. Each start is one run.
  3. Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.

What it does

Read JSON-LD structured data from public HTML pages. Get the original objects, their schema types, and the script and graph path for each object. Use this Actor for SEO checks and for moving structured web data into your own tools.

Who uses it

Technical SEO specialists

Check which pages have Product, Article or FAQ markup.

Developers

Find the exact script that has invalid JSON.

Data teams

Collect product or recipe objects from pages into your tools.

Price

Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.

What you pay forPriceWhen
Start fee$0.001Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more.
Page result saved$0.0018One saved result for a public page, including empty pages, filtered pages, partial results and page errors.

Examples

  • One page: about $0.0028.
  • 1,000 pages: about $1.80.
  • Every day 100 pages, for 30 days: about $5.43 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 2,700 pages.

Prices checked on 24 October 2026. See the current price on Apify.

Questions

Does it crawl the whole website?

No. It reads only the URLs you add.

Does it fix or change the JSON-LD?

No. It keeps the original values. It does not repair invalid JSON.

Do I pay for a page with no JSON-LD?

Yes. Each saved page result is one page event, even if it is empty.

Does it read @graph blocks?

Yes. It reads single objects, arrays and @graph nodes, with a path for each one.

Do I need a website account?

No. Add public pages that can be read without login.

Do I pay if there are no matching objects?

Yes. A saved empty-page result or a filter with no matches costs one page event. The start charge and platform usage also apply.

Can this replace a scraper that also returns meta tags?

Only the core url, jsonLd, schemaTypes, and scrapeDate fields overlap. This Actor adds source paths and statuses. Meta and social tag fields need a separate tool.

Details

Step by step on Apify
  1. Open Input.
  2. Add https://apify.com to Page URLs (startUrls).
  3. Keep the default settings. To keep only a website object, set typeFilters to ["WebSite"].
  4. Click Start.
  5. Open Pages and JSON-LD. Check status, schemaTypes, and objects.
  6. In the key-value store, open RUN_SUMMARY to check unprocessed pages.
Use cases
TaskInputFields to use
Check JSON-LD coveragePublic page URLs; no filterstatus, schemaTypes, issues
Collect product or recipe objectsExact source type in typeFiltersobjects[].data, jsonLd
Find a broken scriptPublic page URLsissues[].scriptIndex, issues[].code
Track where a graph node came fromPages with @graphurl, inputIndex, scriptIndex, jsonPath
Tips for better results
  • Use the schema type filter to keep only the objects you need.
  • Look at the issues list to find broken scripts fast.
  • Use our metadata scraper if you also need meta and Open Graph tags.
Limits and good to know
  • Only public HTTP(S) pages on standard ports. Private network IPs, URL login, and unsafe redirects are blocked
  • HTML only. UTF-8 and ASCII are supported; missing charset is read as UTF-8. A source that ignores Accept-Encoding: identity is rejected rather than read as broken text
  • 1 MB HTML body, measured while reading. Larger pages give BODY_LIMIT; they are not reported as empty pages
  • Up to 3 redirects, 2 retries, and 6 transport attempts per URL. 429 and 5xx responses can be retried within the same page deadline
  • Up to 1000 extracted objects per page. Any JSON nesting deeper than 64 levels or more than 10,000 JSON values per script gives DEPTH_LIMIT. That script is skipped; other scripts can still return objects. The graph walk also stops after 10,000 visited entries per page
  • 2 MB per saved page row and 8 MB total page output. Whole objects can be omitted to meet a row limit; the row becomes partial. Up to 200 issues are saved per page. If there are more, the issue list is shortened and a page-level OBJECT_LIMIT is added. A total output limit stops new saved pages. Check unprocessedUrlCount
  • Limits are separate: 100 large pages with 1000 objects each may hit the output or time limit first
  • JavaScript-only JSON-LD is not visible to this HTTP version. Linked contexts are kept as values; they are never loaded

For developers

Sample result

One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.

one result · JSON
{
  "url": "https://apify.com/",
  "finalUrl": "https://apify.com/",
  "status": "complete",
  "schemaTypes": ["Organization", "SoftwareApplication", "WebSite"],
  "objectCount": 3,
  "matchedObjectCount": 1,
  "objects": [{
    "scriptIndex": 1,
    "jsonPath": "",
    "types": ["WebSite"],
    "context": "https://schema.org",
    "data": {
      "@context": "https://schema.org",
      "@type": "WebSite",
      "@id": "https://apify.com/#website",
      "name": "Apify",
      "url": "https://apify.com/",
      "publisher": {"@id": "https://apify.com/#organization"}
    }
  }],
  "issues": [],
  "errorCode": null
}

Use it from code

Actor ID: cliqtomedia/website-jsonld-structured-data-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.

Python · apify-client
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/website-jsonld-structured-data-scraper").call(run_input={
    "startUrls": [
        {
            "url": "https://apify.com"
        },
        {
            "url": "https://example.com"
        }
    ],
    "typeFilters": []
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
cURL
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~website-jsonld-structured-data-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls": [{"url": "https://apify.com"}, {"url": "https://example.com"}], "typeFilters": []}'
LangChain · langchain-apify
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/website-jsonld-structured-data-scraper")
result = tool.invoke({"run_input": {"startUrls": [{"url": "https://apify.com"}, {"url": "https://example.com"}], "typeFilters": []}})
print(result)

The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.

Data fields (17)
FieldType
inputIndexinteger
urlstring
finalUrlstring
httpStatusinteger
statusstring
schemaTypesarray
jsonLdarray
objectsarray
issuesarray
scriptCountinteger
objectCountinteger
matchedObjectCountinteger
errorCodestring
requestsinteger
retriesinteger
responseBytesinteger
scrapeDatestring
Input settings (5)

The main fields of the input form. With the API you send them as JSON.

SettingName in the APITypeExample value
Page URLs requiredstartUrlsarray[{"url": "https://apify.com"}, {"url": "https://example.com"}]
Schema types to keeptypeFiltersarray[]
Maximum objects per pagemaxObjectsPerPageinteger1000
Time limit per page (seconds)requestTimeoutSecsinteger20
Total work time limit (seconds)maxRunSecsinteger180

Use cases with this tool

Each guide shows all the steps and the other tools.

Start on Apify

Make a free Apify account: you get $5 of free usage every month. Missing a tool? Suggest it. We read every idea, but we do not promise to build it.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure