How to use it: 3 steps
- 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.
- 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. - 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 for | Price | When |
|---|---|---|
| Start fee | $0.001 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Page result saved | $0.0018 | One 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
- Open Input.
- Add
https://apify.comto Page URLs (startUrls). - Keep the default settings. To keep only a website object, set
typeFiltersto["WebSite"]. - Click Start.
- Open Pages and JSON-LD. Check
status,schemaTypes, andobjects. - In the key-value store, open
RUN_SUMMARYto check unprocessed pages.
Use cases
| Task | Input | Fields to use |
|---|---|---|
| Check JSON-LD coverage | Public page URLs; no filter | status, schemaTypes, issues |
| Collect product or recipe objects | Exact source type in typeFilters | objects[].data, jsonLd |
| Find a broken script | Public page URLs | issues[].scriptIndex, issues[].code |
| Track where a graph node came from | Pages with @graph | url, 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: identityis 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-levelOBJECT_LIMITis added. A total output limit stops new saved pages. CheckunprocessedUrlCount - 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.
{
"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.
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 -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": []}'# 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)
| Field | Type |
|---|---|
inputIndex | integer |
url | string |
finalUrl | string |
httpStatus | integer |
status | string |
schemaTypes | array |
jsonLd | array |
objects | array |
issues | array |
scriptCount | integer |
objectCount | integer |
matchedObjectCount | integer |
errorCode | string |
requests | integer |
retries | integer |
responseBytes | integer |
scrapeDate | string |
Input settings (5)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Page URLs required | startUrls | array | [{"url": "https://apify.com"}, {"url": "https://example.com"}] |
| Schema types to keep | typeFilters | array | [] |
| Maximum objects per page | maxObjectsPerPage | integer | 1000 |
| Time limit per page (seconds) | requestTimeoutSecs | integer | 20 |
| Total work time limit (seconds) | maxRunSecs | integer | 180 |
Use cases with this tool
Each guide shows all the steps and the other tools.