JavaScript page scraper API: rendered page to Markdown
Same output as /extract, but the page is first rendered in a real browser, so single-page apps and pages that build their content with JavaScript come back with their text instead of an empty shell. Waits for the network to settle (up to 15 seconds). Public pages only; no login. Use when /extract returns EXTRACTION_EMPTY or too little text for a page you can read in a browser.
When to use it
- Scrape single-page apps that come back empty without a browser
- Get the text of pages that build their content with JavaScript
- Fall back here when /extract returns too little text
Guide: Website screenshot API
Inputs
| Name | Type | Description |
|---|---|---|
url (required) | string | Absolute public http(s) URL of the page |
format | string | text (default), markdown or both. One of: text, markdown, both. |
maxChars | integer | Output limit, 500-100000 characters (default 20000) |
section | string | Optional exact HTML id to read only that element |
Request
Over HTTP, with a card key from /credits:
curl -H "Authorization: Bearer adt_…" "https://tools.funwords.eu/extract/rendered?url=https%3A%2F%2Fexample.com%2F"
Without a key, the same URL answers 402 Payment Required with x402 and MPP terms, so an agent with a wallet pays per call in USDC (Base, Polygon, Arbitrum or Solana over x402; Base or Tempo over MPP) and retries.
Example result
{
"url": "https://agent-data-tools.revmesh2074.workers.dev/examples/extract/sources/short-article.html",
"finalUrl": "https://agent-data-tools.revmesh2074.workers.dev/examples/extract/sources/short-article.html",
"status": 200,
"contentType": "text/html;charset=utf-8",
"sourceFormat": "html",
"linkBaseUrl": "https://agent-data-tools.revmesh2074.workers.dev/examples/extract/sources/short-article.html",
"sourceMetadata": {
"verification": "not_verified",
"authors": [],
"dates": [],
"truncated": false
},
"title": "Owned sample: short article",
"description": null,
"lang": "en",
"canonical": null,
"headings": [
{
"level": 1,
"text": "A short release note",
"id": null
}
],
"section": null,
"links": [],
"tables": [],
"codeBlocks": [],
"contentSelection": "main",
"warnings": [],
"format": "both",
"text": "A short release note\n\nVersion 1.1.1 preserves literal code whitespace and nested list structure.\n\nThe price remains $0.002 per successful extraction. This is an owned sample, not a purchase receipt.",
"markdown": "# A short release note\n\nVersion 1.1.1 preserves literal code whitespace and nested list structure.\n\nThe price remains $0.002 per successful extraction. This is an owned sample, not a purchase receipt.",
"textLength": 198,
"truncated": false,
"contentHash": "sha256:6cd3137dc4735c9ab317c764c78b47712dc9ca8eabe435dd0db9142bdaacbe2c",
"hashFormat": "text",
"fetchedAt": "2026-10-16T11:06:01.780Z",
"rendered": true
}
From an AI agent (MCP)
Add the MCP server to Claude, Cursor or any MCP client. This tool is extract_rendered, and the first 25 successful calls are free:
https://tools.funwords.eu/mcp
Questions
How long does it wait?
It renders the page in a real browser and waits for the network to settle, up to 15 seconds.
Can it log in?
No. Public pages only.
How do I pay?
Each successful call costs $0.01; failed calls are not charged. This tool is not in the free calls; pay with card credits (from $1; the key goes in an Authorization header or, for clients that can only fetch a URL, as api_key= in the URL) or per call in USDC over x402 or MPP. No account is needed.