Web pages, stripped to Markdown.
DOMStrip fetches a URL or submitted HTML, removes everything that isn't the content, and returns compact Markdown your agents can read. SSRF-safe, resource-bounded, and billed by the page.
<html>
<head>
<script src="tracker.js"></script>
<style>body{font:14px sans-serif}</style>
</head>
<body>
<nav>Home · About · Shop</nav>
<div class="ad">Sponsored</div>
<article>
<h1>How to fetch a page</h1>
<p>Send a URL and get Markdown back.</p>
<table>…</table>
</article>
<script>window.track()</script>
</body>
</html>
# How to fetch a page
Send a URL and get Markdown back.
```sh
curl api.domstrip.dev/v1/clean-url
```
| Method | Result |
| --------- | -------- |
| clean-url | Markdown |
What gets stripped
Everything that isn't the article goes away. What remains is clean, semantic Markdown your model can actually use.
- Safe fetching
- Every hostname is resolved and validated at connect time, on every redirect hop. Loopback, private, link-local, and metadata addresses are refused.
- Bounded resources
- Byte caps on body, HTML, and output; per-stage timeouts plus a 10 s fetch deadline; a parser queue that returns 503 instead of hanging.
- Clean extraction
- auto, article, and full modes. Scripts, forms, embeds, and hidden nodes are removed; code blocks and tables survive.
- Idempotency & quotas
- Reusing a key replays the stored result; a new key is one billable conversion. Results are encrypted and replayed for 24 hours.
- Metered billing
- A Stripe usage ledger with atomic, signature-verified webhooks, delivered in event order (paid mode).
- MCP adapter
- fetch_clean_markdown and clean_html tools for Claude and other MCP clients, with a locally held key.
How it works
- Resolve & fetch Validate every address at connect time, then keep the original hostname for TLS SNI and the Host header.
- Enforce limits Apply byte caps, timeouts, and concurrency limits so no single request can stall the rest.
- Parse in isolation Long-lived parser processes run with a scrubbed environment and are recycled after a bounded number of jobs.
- Return Markdown Idempotent, encrypted result replay — one successful conversion is one consumed unit, never a silent re-charge.
Use it
Two endpoints. A key, a content type, and an idempotency key. The API is served at api.domstrip.dev.
curl https://api.domstrip.dev/v1/clean-url \
-H "Authorization: Bearer domstrip_<key>" \
-H "Idempotency-Key: 4a6c0f2e9d1b7c3e" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/article", "mode": "auto"}'
DOMSTRIP_MCP_SERVICE_ORIGIN=https://api.domstrip.dev \
DOMSTRIP_MCP_API_KEY=domstrip_<key> \
uv run domstrip-mcp
Errors return a stable envelope — {"error": {"code", "message", "request_id", "retryable"}} — and Retry-After is set when a retry time is known.
Free pilot
DOMStrip is in free pilot: conversions are not billed. Metered Stripe billing ships before any paid use, and keys stay in your control.
Request a key on GitHub