Let your agent
see the web

Fetch and crawl with frontier system one models.

Frontier models can't answer
basic questions about the web.

Pricing page
ordinary-markdown.md
## BusinessUptime SLASAML SSO## EnterpriseUptime SLASAML SSO
Which plan has uptime SLAs?
User
Bot
Both. Business and Enterprise each include an uptime SLA.
Wrong answer
Icons dropped → Confidently wrong.
expand-markdown.md
| Business | Enterprise ||--------------|--------------|| x Uptime SLA | ✓ Uptime SLA || x SAML SSO | ✓ SAML SSO |
Which plan has uptime SLAs?
User
Bot
Only Enterprise. Business shows an 'x' next to it.
Right answer
Expand preserves the details.
Trusted by engineers at
Benchmark icon

Benchmarked Performance

MDBench Hard

v1

Hard Markdown extraction benchmark

MDBench Hard v1: questions answered correctly per API
APIQuestions answered correctly95% confidence interval
Expand74.1%70.4% to 77.6%
Exa55.3%50.9% to 60.1%
Firecrawl27.2%24.2% to 30.5%

1,094 questions on 326 hard pages. Claude Sonnet 5.5 answers from each API's Markdown, at its default settings, graded strictly. Expand is the only provider tested that includes the hidden JSON from the page, via X-Ray.

How we measured

MDBench Hardv1

A set of hard web extraction cases that we curated together with our customers. They span enrichment, procurement, pricing and competitive intelligence, among other areas.

It intentionally targets what existing web-to-Markdown systems get wrong.

It is a question-answering benchmark: an agent gets only the page Markdown that each API returns and answers a question about what it says.

Tested on October 8, 2026.

Try it on any page.

Paste a URL, or open one of the examples, and see what your agent gets back.

Instant web data on tap.

Fetch a page, crawl a site, or subscribe to changes.

Every page comes with accurate Markdown, plus the hidden JSON and a snapshot you can cite.

Fetch

Frontier quality web data.

Send a URL. Get accurate Markdown, plus the hidden JSON and a snapshot you can cite.

  • Iris

    Jev for the web.

    Iris is a vision model for the web. It reads the rendered page like you do and writes the main content as accurate Markdown. Navigation and footers go to the , one call away. The rest is noise, so it goes.

    Iris docs

    On a pricing page, Iris preserves the pricing table as Markdown, moves the navigation and footer to the appendix, and removes promotional and cookie banners.

  • X-Ray

    The hidden data, without a browser.

    Coordinates, flight gates and diagrams often live in JSON the page loads, not in its HTML. X-Ray, our second System 1 model, finds the parts that matter and drops the rest.

    X-Ray docs

    Linear's pricing page contains 17,374 tokens of hidden JSON, including customer stories. X-Ray identifies the relevant information, like the fact that Commure has logged over 80,000 requests across thousands of healthcare customers.

    linear.app/pricingstate.json
  • Wayback Machine

    Every fetch becomes an asset you own.

    Verify every answer precisely. Every line links back to the element on the page it came from, even after the site changes.

    Hover to debug. Share to cite.

    Wayback Machine docs
    A snapshot with the cited line outlined
  • Highlights

    Let your agent focus on what matters.

    If your agent already knows what it's looking for, Highlights saves over 95% of tokens with no loss in accuracy. Pass a query and get back only the passages that answer it.

    • Faster TTFT

    • Zero noise

    Highlights docs

    Stripe's webhooks guide as Expand captured it, with the playground's Highlights. Ask it a question and the passages that answer it are framed, a few hundred of the page's 6,800 tokens.

    docs.stripe.com/webhooks
    6,800 tokens
    Try
Crawl

Crawl like the big boys.

One API call crawls any website. Every page comes back as a full Fetch: Markdown from Iris, State JSON from X-Ray and a snapshot.

  • Crawl anything with one command.

    Our crawler scales to millions of pages, so you don't need to manage state or processes.

    No extra cost for crawling: each page is one credit, the same as a Fetch.

    • Rendering
      stripe.com8/9Collapse
    • Done
    • Done
    • Done
      /api
    • Done
      /webhooks
    • Done
      /pricing
    • Rendering
      /blog
    stripe.com
    StatusCrawling
    Pages
    8 / 9
    In flight
    1
    Failed
    0
    DiscoverRenderFinish
    8 of 9 pages settled1 rendering
    crawl
WebSync

Subscribe to a website.

Monitor a crawl for what changed, or keep a constant change feed. Every added, changed and removed page arrives in order on a durable stream you can resume from where you left off.

  • A syncing engine for the web.

    WebSync rechecks every page on your schedule and streams each change as an event: a page added, a page changed with its diff, a page removed with the evidence.

    • Monitor a site for changes

    • A constant change feed

    • A durable stream you can resume from where you left off

    Give your agent a brain on disk: a Markdown file per page, kept in sync.

    Ttype: 'page.added',url: '/blog/launch-week',TdiscoveredBy: 'sitemap',12depth: 1Ttype: 'page.changed',url: '/pricing',▼{}diff▼{}price12from: 16,12to: 19Ttype: 'page.changed',url: '/status',▼{}diff▼{}incidents12from: 0,12to: 1Ttype: 'page.removed',url: '/careers/designer',▼{}evidenceTkind: 'http-404'Ttype: 'page.added',url: '/docs/auth',TdiscoveredBy: 'link',12depth: 2Ttype: 'page.changed',url: '/enterprise',▼{}diff▼{}seats12from: 5,12to: 10
    Ttype: 'page.added',url: '/blog/launch-week',TdiscoveredBy: 'sitemap',12depth: 1Ttype: 'page.changed',url: '/pricing',▼{}diff▼{}price12from: 16,12to: 19Ttype: 'page.changed',url: '/status',▼{}diff▼{}incidents12from: 0,12to: 1Ttype: 'page.removed',url: '/careers/designer',▼{}evidenceTkind: 'http-404'Ttype: 'page.added',url: '/docs/auth',TdiscoveredBy: 'link',12depth: 2Ttype: 'page.changed',url: '/enterprise',▼{}diff▼{}seats12from: 5,12to: 10

    GET /v1/crawls/:id/events?offset=-1&live=sse

    events

Let your agent pay attention to what matters.

Progressive disclosure

The best of both worlds.

Other tools make you choose the full page or a trimmed one. Your agent reads the main content first and asks for the rest only when it needs it: nothing lost, far fewer tokens.

docs.stripe.com/webhooksTokens
page.mdthe main contentread first6,800
One call away
appendix.mdnav, footer, related links+1,616
state.jsonthe hidden JSON+253
network.harevery request+509,189
Your agent reads 6,800 of 517,858 tokens first.

Lossless

Nothing is thrown away.

Existing web-to-Markdown tools follow hard-coded rules and lose crucial details in the conversion. The web is too complex for rules.

If something is still missing, progressive disclosure has you covered.

expand.land/s/ng0EFjewTRF6Stored with every fetch
  • page.mdMarkdown
  • appendix.mdthe rest
  • state.jsonhidden JSON
  • network.harrequests
  • screenshot.pngif requested
  • assets/142 files
  • archive.waczreplay

Token efficient

24% fewer tokens at scale.

At 5 million requests a month on Gemini 4, that is $576K a year.*

*With JSON mode off. Input tokens only; the output is the same either way.

DescriptionPer month

Other Markdown APIs

20,000 tokens a page · 100B tokens

$200,000

Expand, JSON mode off

15,200 tokens a page · 76B tokens

$152,000
Saved-24%$48,000
At 5M requests a month with Gemini 4
($2/M input, $10/M output)
You save ~$576,000 a year
Landing icon play

Getting Started

It works out of the box without any configuration—JavaScript rendering, residential proxies, and bot protection are handled automatically for every request.

Use the SDK

TypeScript. Python SDK coming soon.

One call returns the page as accurate Markdown, read by Iris, plus the hidden JSON when you ask for it.

Fetch docs
Landing icon tag

Pricing
Only pay for what you need

Free

Try the platform at no cost.

10,000 free credits ($10) to explore everything below.

Get Started
10,000 free
1 credit

Pay as you go

Popular

Prepaid credits, $1 per 1,000.

Pay only for what you need. No monthly commitments.

Get Started
$1 / 1,000
$1 / 1,000

Enterprise

Web-scale with white-glove support at enterprise security.

Contact Us
Custom allocation
Contact sales

See the pricing page and the savings calculator

FAQ

Questions

Isn't turning a web page into Markdown a solved problem?

It works for a news article and breaks on many other layouts. Converters guess the main content with fixed rules, the way reader mode does. On a pricing table, a product page or a dashboard, that guess drops the icons, flattens the table and misses the data the page loads. Iris looks at the rendered page instead, every element with its position, size and weight, and sorts each one into preserve, prune or appendix.

Why not hand my agent the raw HTML, or a browser?

Raw HTML is mostly markup and scripts your agent pays tokens to read, and a JavaScript app arrives as an empty shell. A browser with screenshots works, but it is slow and expensive, and the tokens add up fast. Expand renders the page in a real browser for you and returns what it shows as Markdown, at API speed.

How do I know what my agent actually read?

Each browser page fetch saves the captured page with every asset. Open expand.land/s/<snapshotId>/playground and click any line of the Markdown to see where it came from on the page, even after the site has changed. Share the link to cite it.

What is the hidden JSON?

The data behind what a page shows, including values that never appear as text: a product's price, rating and stock, the coordinates on a map, a flight's gate. X-Ray reads that JSON, keeps the parts a question could be asked about and drops the analytics and configuration. It comes back next to the Markdown, in the same call.

My agent needs one answer. Does it have to read the whole page?

No. Pass a question with the fetch and Highlights returns only the passages that answer it, ranked. That saves over 95% of tokens with no loss in accuracy, and your agent gets to its first token sooner.

What about sites behind bot protection?

That is what Stealth Mode is for, and it is on for every plan. Each fetch runs a real browser through residential proxies with state-of-the-art bot-detection avoidance, so many pages that block automated access still render. There is nothing to configure. It won't get past every bot check, CAPTCHA or login wall. When a page is blocked, you get a 403 that says why, and it costs nothing.

Can it read PDFs, spreadsheets and YouTube videos?

Yes, on the same endpoint. Send the URL and Fetch converts PDFs, images, office files, ebooks and data files into the same Markdown. A YouTube link returns the transcript, and a video without captions is transcribed from its audio.

How fast is a fetch?

Most pages come back in a few seconds, browser render included. Iris itself reads about 500,000 tokens a second.

Which agents does it work with?

Paste the setup prompt into Claude Code, Codex, Cursor, OpenCode or fx. It connects your agent to Expand and installs the CLI when it needs one. Approve the sign-in in your browser when asked. From your own code, call the TypeScript SDK or the API.

Give your agent reading glasses.

Expand your agent's vision.