Test
10,000 pages
$3.75
$0.38/1K pages
- Try it on your real URLs
- Same API as the biggest pack
- Credits never expire
GET /read · 1 credit per page · from $0.07/1K pages
Pass a URL and get the article back as Markdown: headings, paragraphs, lists, tables and links kept; menus, cookie banners, ads and footers removed. With the page's title, author, date and language.
Quick answer
Which API converts a web page into clean Markdown for an LLM?
A web page to Markdown API fetches a page, keeps its main content and returns it as Markdown. WebReaderAPI does it in one request: GET https://webreaderapi.com/api/v1/read?url=… returns the article with its headings, lists, tables and links, plus title, author, date and word count, for one credit per page from $0.07/1K pages as of October 2026. robots.txt is respected. No KYC; pay in crypto.
| Endpoint | GET https://webreaderapi.com/api/v1/read?url=… (or POST with a JSON body) |
|---|---|
| Output | Clean Markdown of the page's main content (or plain text, or cleaned HTML), with title, description, author, publication date, language and word count; links and images on request |
| JavaScript | JavaScript rendering in a headless browser when the page needs it (render=auto), or always, or never |
| Billing | 1 credit = 1 page read without a browser; 2 credits when the page needs a browser to render JavaScript. A request that fails, or that a site's robots.txt refuses, is not charged |
| Token budget | max_chars cuts the Markdown to the length your model can take |
| robots.txt | We respect robots.txt: our crawler identifies itself as WebReaderAPI, follows the rules written for it or for all robots, and does not read a page that a site disallows. Refused pages are not charged |
| Price | $3.75 for 10,000 pages, $21.75 for 100,000 pages, from $0.07/1K pages at 5,000,000 pages |
| Payment | BTC, USDT, USDC, ETH, SOL, LTC, from a $25 top-up; no KYC |
Markdown keeps the structure a model needs and drops the markup it does not. A typical article page carries navigation, scripts, tracking tags, cookie notices and related-post widgets around a few hundred words of text. Sent as raw HTML, most of the tokens you pay for are markup.
Markdown keeps headings as #, lists as -, tables as pipes and links as [text](url). A model can still see which sentence belongs to which section, quote the source link and split the text into chunks along its headings. The same text in plain prose loses that structure; the same text in HTML costs far more tokens.
With main_content=true, the default, the API keeps the part of the page that a reader came for and removes the rest.
| Kept | Removed |
|---|---|
| Title and headings | Site navigation and menus |
| Paragraphs, quotes and lists | Cookie and consent banners |
| Tables, as Markdown tables | Ads and promoted widgets |
| Code blocks, with their language when shown | Sidebars and related-post lists |
| Links inside the text | Footers and legal boilerplate |
Images, only with include_images=true | Share buttons and comment forms |
Set main_content=false to convert the whole page instead, for example a home page or a product listing where everything matters. Set format=text for plain text without Markdown, or format=html for cleaned HTML of the main content.
curl -G "https://webreaderapi.com/api/v1/read" \
-H "Authorization: Bearer $WEBREADER_API_KEY" \
--data-urlencode "url=https://example.com/blog/pour-over-coffee" \
-d format=markdown -d max_chars=20000import os
import requests
resp = requests.get(
"https://webreaderapi.com/api/v1/read",
headers={"Authorization": "Bearer " + os.environ["WEBREADER_API_KEY"]},
params={"url": "https://example.com/blog/pour-over-coffee", "format": "markdown"},
timeout=90,
)
resp.raise_for_status()
page = resp.json()
print(page["title"], "|", page.get("author"), "|", page.get("published_at"))
print(page["word_count"], "words,", page["credits_used"], "credit(s)")
print(page["markdown"][:500])
Many pages send almost no text in their first HTML and build the content in the browser. With render=auto, the default, the API first reads the raw HTML; if it holds too little text, it opens the page in a headless browser and reads the result. The response says which one happened in rendered.
A page that needed the browser costs two credits instead of one. If you know a site always needs it, set render=true; if you only want what the server sends, set render=false and never pay the second credit.
We respect its choice and you are not charged. Our crawler identifies itself as WebReaderAPI and checks robots.txt before every read. A page disallowed for our token, or for all robots, returns 403 blocked_by_robots. A site that declares Content-Signal: ai-input=no returns 403 blocked_by_site_policy.
If the site refuses the request in another way, such as a 403 status, a challenge page or a login wall, you get 502 target_refused with the site's own status. If a site refuses our request, we return its answer: we never solve CAPTCHAs, log in to accounts, or try to get around a block or a paywall. Our crawler page explains all of this to site owners, with the exact User-Agent.
Count one credit per page, two for pages that need the browser. Some typical volumes:
Credits never expire, so a pack bought for a one-off crawl keeps its remaining value for later jobs.
10,000 pages cost $3.75, 100,000 pages cost $21.75 and 1,000,000 pages cost $74.25, as of October 2026. Failed pages and pages refused by robots.txt are free. See all packs.
10,000 pages
$3.75
$0.38/1K pages
50,000 pages
$14.25
$0.28/1K pages
100,000 pages
$21.75
$0.22/1K pages
1,000,000 pages
$74.25
$0.07/1K pages
In every plan: Main-content extraction · JavaScript rendering when needed · Failed and refused pages not charged · Credits never expire
Yes. HTML tables become Markdown tables, and code blocks stay fenced, with their language when the page marks it. Very complex tables, such as ones with merged cells, are flattened row by row.
Yes. Set main_content=false and the API converts everything on the page, including navigation and footer. This suits home pages, category pages and product listings, where the main-content detector would drop useful parts.
Use max_chars, between 1,000 and 500,000 characters, to cut the Markdown at a set length. The word_count field tells you how long the full article was, so your agent can decide whether to read more.
No. WebReaderAPI reads public pages only. It never logs in to accounts and never tries to get around a paywall or a block; such pages return the site's refusal and are not charged.
No. WebReaderAPI asks for no ID, no selfie, no company documents and no card. Account-number login; email is optional. You top up from $25 in BTC, USDT, USDC, ETH, SOL, LTC.
From $0.07/1K pages · no KYC
Get an API key