DOMStrip

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 in
<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>
Markdown out
# 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 |
5 tags stripped · 1 article kept

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

  1. Resolve & fetch Validate every address at connect time, then keep the original hostname for TLS SNI and the Host header.
  2. Enforce limits Apply byte caps, timeouts, and concurrency limits so no single request can stall the rest.
  3. Parse in isolation Long-lived parser processes run with a scrubbed environment and are recycled after a bounded number of jobs.
  4. 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.

POST /v1/clean-url
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"}'
MCP adapter
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