Turn any URL into
clean markdown for your AI
POST a URL, get LLM-ready markdown back. Every page lands in a searchable index.
Start extracting in one request
Plain JSON over HTTPS. No SDK required.
curl -X POST https://tomsindex.com/v1/extract \ -H "X-API-Key: srch_your_key" \ -H "Content-Type: application/json" \ -d '{"url": "https://docs.python.org/3/tutorial/"}'
import requests res = requests.post( "https://tomsindex.com/v1/extract", headers={"X-API-Key": "srch_your_key"}, json={"url": "https://docs.python.org/3/tutorial/"}, ) page = res.json()["results"][0] print(page["markdown"])
const res = await fetch("https://tomsindex.com/v1/extract", { method: "POST", headers: { "X-API-Key": "srch_your_key", "Content-Type": "application/json", }, body: JSON.stringify({ url: "https://docs.python.org/3/tutorial/" }), }); const { results } = await res.json(); console.log(results[0].markdown);
{
"results": [{
"url": "https://docs.python.org/3/tutorial/",
"markdown": "# The Python Tutorial\n\nPython is an easy to learn…",
"metadata": { "title": "The Python Tutorial", "description": "…" },
"links": [{ "href": "…/appetite.html", "text": "Whetting Your Appetite" }]
}],
"failed_results": [],
"response_time": 0.84
}
Only the content. Far fewer tokens.
Nav, footers, ads and scripts are stripped. Measured on real pages:
Measured on 33 docs and blog pages (Oct 19, 2026) — see each page
| Page | Code | Headings | Tables |
|---|---|---|---|
| docs.python.org · asyncio tasks | 32/32 | 15/15 | 1/1 |
| docs.python.org · control flow | 57/57 | 18/18 | — |
| MDN · Using the Fetch API | 23/23 | 18/19 | — |
| react.dev · Quick Start | 24/24 | 12/12 | — |
| react.dev · useEffect | 31/32 | 21/21 | — |
| nextjs.org · Installation | 17/17 | 14/14 | — |
| nextjs.org · Layouts and Pages | 10/10 | 15/15 | — |
| vuejs.org · Reactivity | 36/36 | 17/17 | — |
| vite.dev · Guide | 28/28 | 10/10 | 1/1 |
| docusaurus.io · Installation | 12/12 | 9/9 | — |
| Rust book · Ownership | 15/15 | 8/8 | — |
| go.dev · Effective Go | 153/153 | 58/58 | — |
| requests · Quickstart | 36/36 | 15/15 | — |
| FastAPI · First Steps | 21/21 | 15/15 | — |
| kubernetes.io · Pods | 4/4 | 21/21 | — |
| tailwindcss.com · flex-basis | 9/9 | 8/8 | 1/1 |
| docs.github.com · REST repos | — | 165/165 | 113/121 |
| github.com · astral-sh/uv | 16/16 | 13/13 | — |
| overreacted.io · useEffect guide | 62/62 | 22/22 | — |
| jvns.ca · Inside .git | 13/13 | 15/15 | — |
| docs.stripe.com · Create a charge | 6/6 | 6/8 | — |
| typescriptlang.org · Narrowing | 35/35 | 9/9 | — |
| postgresql.org · SELECT | 37/37 | 37/37 | 1/1 |
| pkg.go.dev · net/http | 230/230 | 10/10 | 1/1 |
| Wikipedia · Comparison of languages | — | 9/9 | 3/5 |
| supabase.com · JS select | 13/13 | 17/17 | — |
| djangoproject.com · Expressions | 49/49 | 18/18 | — |
| nodejs.org · fs | 105/105 | 9/9 | 123/123 |
| docs.astro.build · Routing | 30/30 | 20/20 | — |
| Cloudflare Workers · Guide | 10/10 | 6/6 | — |
| martinfowler.com · Test pyramid | 18/18 | 35/35 | — |
| docs.pydantic.dev · Models | 45/45 | 28/28 | — |
| paulgraham.com · Great work | — | — | — |
Counts compare the page's own <pre> blocks, h2/h3 headings and data tables with the markdown. When the markdown looks incomplete, the API response usually says so in warnings. Known gaps: diagrams drawn as SVG or images.
Real markdown
Headings, links, tables, fenced code.
CSS selector
Extract just article or main.
Query chunks
Keep only the parts that match a question.
Links & metadata
Title, description, every link tagged.
Auto index
Every extract saved and full-text searchable.
Sources agents need
npm, PyPI, Stack Overflow and GitHub files, issues and folders via their official APIs.
Extract once.
Search it forever.
Every page you extract is saved and searchable. No second pipeline.
- Full-text search over every page
- Private to your account
- Read markdown back via API
{
"results": [
{ "id": "9b2c…", "url": "https://docs.python.org/3/tutorial/",
"title": "The Python Tutorial", "fetched_at": "2026-10-19T…" },
{ "id": "4e1a…", "url": "https://react.dev/learn",
"title": "Quick Start – React", "fetched_at": "2026-10-18T…" }
]
}
A remote MCP server. Nothing to install.
Point Claude Code, Cursor or Codex at one URL. Works without a key as a trial (20 extracts/day); add a free key for 10/minute and your private index.
extractURL → markdownindex_searchsearch what it already readindex_getread a saved page back# try it now, no key $ claude mcp add --transport http tomsindex https://tomsindex.com/mcp # with your free key (10/min + private index) $ claude mcp add --transport http tomsindex https://tomsindex.com/mcp \ --header "X-API-Key: srch_your_key"
// ~/.cursor/mcp.json { "mcpServers": { "tomsindex": { "url": "https://tomsindex.com/mcp", "headers": { "X-API-Key": "srch_your_key" } } } }
# ~/.codex/config.toml [mcp_servers.tomsindex] url = "https://tomsindex.com/mcp" http_headers = { "X-API-Key" = "srch_your_key" }
# writes the config above for every client it finds $ curl -fsSL https://tomsindex.com/install.sh | sh
Simple and fast
One endpoint, about a second per page, nothing to configure.
What you get
- ~1s typical response, clean markdown back
- One endpoint and one key — no SDK, no credits to track
- 90%+ fewer tokens than raw HTML
- A private index of every page your agent has read
Built for reading, not for
- Clicking through pages or logging in
- Sites behind bot protection (e.g. Medium)
- Whole-site crawls, PDFs, screenshots
Half the price of Firecrawl
Start free. Upgrade when you outgrow it — no credits to decode.
- 100 extracts / month
- 10 requests / minute per key
- Searchable index · remote MCP server
- Export or delete your index any time
- 5,000 extracts / month
- Everything in Free
- JavaScript rendering on pages that need it
- Cancel any time, no contract
Frequently asked questions
Does it render JavaScript?
When it needs to. Pages are read as server-rendered HTML first (fast and free); if a page needs JavaScript or comes back incomplete, it's rendered in a headless browser (Crawl4AI) and run through the same pipeline.
Can it read npm, PyPI, Stack Overflow and GitHub?
Yes. Those block scrapers, so TomsIndex reads them through their official APIs: package READMEs, questions with top answers, and raw source files in a fenced block.
What if a page fails?
You get HTTP 200 with the reason in failed_results, e.g. "Target responded with HTTP 403."
Who can see my index?
Only you. Each account's index is private. Pass "save": false to skip saving a page.
What are the limits?
10 requests/min per key. The homepage demo is 5/min per IP and isn't saved.
Give your agent clean pages
Free key in under a minute.