Website to Markdown API
Read one page, PDF, spreadsheet, CSV, JSON or feed as clean content: Markdown, text, title, links, images and tables.
- 1 credit per call
- Failed calls are free
- Updated
- web.markdown
{ "content_type": "text/html; charset=utf-8", "final_url": "https://stripe.com/privacy", "status_code": 200, "page": { "title": "Privacy Policy", "canonical_url": "https://stripe.com/privacy", "lang": "en-US" }, "parsed": { "markdown": "# Privacy Policy\n\n#### Last updated: April 28, 2026\n\nThis Privacy Policy includes important information about your personal data and we enc…", "status": "parsed", "metadata": { "title": "Privacy Policy", "canonical_url": "https://stripe.com/privacy", "language": "en-US" } }, "warnings": []}
What you send
The input
object of the request, with every field the endpoint accepts.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| url | string | yes | The public page or file to capture: a web page, PDF, DOCX, XLSX, CSV, JSON, XML or feed. | https://stripe.com/privacy |
| accept_statuses | array<integer> | no | Error statuses you still want returned, such as [404], to inspect the page. | |
| allow_browser_fallback | boolean | no | Open the page in a real browser when it needs JavaScript or blocks a plain request. On by default. | |
| allow_truncated | boolean | no | Return what was read when a page is larger than the size limit, instead of failing. | |
| archive | object | no | Also save the page as self-contained HTML or a ZIP of the page and its files. | |
| detail | string | no | How much to return: summary (title and counts), standard (the clean content: Markdown, text, links, images and tables) or full. | summary · standard · full |
| document | object | no | Options for PDFs and other files, such as whether to read scanned pages. Ignored for ordinary web pages. | |
| exclude_selectors | array<string> | no | Leave out parts of the page matching simple CSS selectors, such as .ads. | |
| headers | object | no | Extra request headers to send, such as Accept-Language. | |
| include_selectors | array<string> | no | Keep only the part of the page matching a simple CSS selector, such as article or #content. | |
| main_content_only | boolean | no | Keep the Markdown to the page's main content, without menus, banners and footers. | |
| max_body_bytes | integer | no | The largest page or file to read, in bytes. | |
| max_total_bytes | integer | no | The most bytes to read in all, redirects included. |
Fields it returns
What each record in the response holds, with the values from the sample above.
| Field | Type | What it is | Example |
|---|---|---|---|
| page | object | The page this response holds. | 3 fields |
| page.title | string | The page's title. | Privacy Policy |
| page.lang | string | The page's language. | en-US |
| page.canonical_url | string | The address the page names as its main one. | https://stripe.com/privacy |
| final_url | string | The address the page ended at, after any redirects. | https://stripe.com/privacy |
| status_code | integer | The site's HTTP status for the page, such as 200. | 200 |
| content_type | string | The kind of content the page is. | text/html; charset=utf-8 |
| parsed | object | The page's content, read and cleaned. | 3 fields |
| parsed.metadata.title | string | The page's title. | Privacy Policy |
| parsed.markdown | string | The page as Markdown: headings, lists, links and tables kept, menus and footers left out. | # Privacy Policy #### Last updated: April 28, 2026 This Privacy… |
| parsed.metadata | object | The title, language and canonical address the page declares. | 3 fields |
| parsed.metadata.canonical_url | string | The address the page names as its main one. | https://stripe.com/privacy |
| parsed.metadata.language | string | The page's language. | en-US |
| parsed.status | string | Whether the page was read. | parsed |
| warnings | array | Anything that limited the read, such as a page cut at the size limit; empty when all went well. | empty in this sample |
What this endpoint covers
- PDF, Word, Excel, CSV, JSON, XML and feeds are read the same way as web pages.
- A page that needs JavaScript is opened in a real browser for you.
- A page larger than the size limit fails with response_too_large, unless you set allow_truncated to keep what was read.
- The Markdown keeps the page's own words; nothing is summarised or rewritten.
Call it from your code, or ask your agent
Set UPSCRAPE_API_KEY to your key and copy a working request.
curl --request POST \ --url https://data.upscrape.com/execute \ --header "Authorization: Bearer $UPSCRAPE_API_KEY" \ --header "Content-Type: application/json" \ --header "Prefer: wait=30" \ --data '{ "capability": "web.markdown", "input": { "url": "https://stripe.com/privacy" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "web.markdown", "input": { "url": "https://stripe.com/privacy" }}''')response = requests.post( "https://data.upscrape.com/execute", headers={ "Authorization": f"Bearer {os.environ['UPSCRAPE_API_KEY']}", "Content-Type": "application/json", "Prefer": "wait=30", }, json=payload,)response.raise_for_status()print(json.dumps(response.json(), indent=2))
const response = await fetch("https://data.upscrape.com/execute", { method: "POST", headers: { "Authorization": `Bearer ${process.env.UPSCRAPE_API_KEY}`, "Content-Type": "application/json", "Prefer": "wait=30", }, body: JSON.stringify({ "capability": "web.markdown", "input": { "url": "https://stripe.com/privacy" }}),});if (!response.ok) { throw new Error(`Upscrape request failed: ${response.status}`);}console.log(JSON.stringify(await response.json(), null, 2));
https://data.upscrape.com/mcp
Using Upscrape, read stripe.com/privacy and give me the page as Markdown with its links.
The other website tools
Website to Markdown API FAQ
The short answers. The docs have the long ones.
How much does the Website to Markdown API cost?
1 credit per successful call, shown before it runs. You buy credits once, and paid credits never expire.
What do I send?
Send url. The input fields below list every option with its type and limits.
Which sites does it work on?
Any public page a visitor can open without logging in. A page that is blocked or gone fails with its reason.
Can my AI agent call it?
Yes, over MCP: the agent finds web.markdown, checks its price and runs it with the same credits as the REST API.
Your first page is free.
Up to 100 free credits to start, no card needed.