Most LLM agents hit the same wall the first time they need a real web page: a plain HTTP GET returns an empty shell, a cookie wall, or 300 KB of navigation markup. Running headless Chrome yourself fixes that, and then you own a browser fleet.
Agent Web Access is a pay-per-call alternative. Your agent sends a URL and gets back the rendered page as clean markdown. JavaScript runs in a real browser first, then navigation, ads and boilerplate are stripped. There is no account and no API key. Each call is paid in USDC on Base through the open x402 protocol.
Prices
| Call | What you get | Price |
|---|---|---|
/fetch |
the rendered page as markdown, text or html | $0.001 |
/extract |
every element matching a CSS selector | $0.001 |
/screenshot |
PNG, viewport or full page | $0.005 |
/pdf |
print-quality PDF | $0.005 |
The prices come from the service's own 402 reply, which any client can read for free.
Try it without paying
GET https://web.cyberwarex.com/sample returns one real paid answer, together with its on-chain settlement transaction, so you can see the output before you spend anything.
Python, about ten lines
# pip install "x402[evm,requests]"
import os
from eth_account import Account
from x402 import x402ClientSync
from x402.http.clients import x402_requests
from x402.mechanisms.evm import EthAccountSigner
from x402.mechanisms.evm.exact import ExactEvmScheme
client = x402ClientSync()
client.register("eip155:8453", ExactEvmScheme(EthAccountSigner(Account.from_key(os.environ["PK"]))))
session = x402_requests(client)
r = session.get("https://web.cyberwarex.com/fetch",
params={"url": "https://news.ycombinator.com", "format": "markdown"})
page = r.json()
print(page["status"], len(page["content"]), "chars")
print(page["content"][:300])
PK is the private key of a Base wallet holding a little USDC. A dollar covers a thousand page reads. The client gets the 402 invoice, signs the payment and retries the request on its own.
I ran this exact script before publishing: it returned status 200 and about 11 KB of markdown for the Hacker News front page, at a cost of $0.001.
From an MCP client
The same four tools are served over MCP at https://web.cyberwarex.com/mcp (streamable HTTP, no auth): web_fetch, web_extract, web_screenshot and web_pdf. An unpaid tools/call returns the x402 invoice as a tool error, and the client retries with the payment.
When to use it
- a page is a single-page app and plain GET returns nothing useful
- you need the text of a page, not its markup, to feed a model
- you want a screenshot or PDF of a page inside an agent run without running a browser
When not to
- the site offers an official API: use that
- you need to log in: this reads public pages only
Docs: https://cyberwarex.com/llms.txt · Service catalog: https://cyberwarex.com/.well-known/x402
Update: markdown you can build a pipeline on
A reader asked whether the markdown is stable enough to be an intermediate representation, not just readable text. Every /fetch reply now carries:
-
provenance: the source URL, the fetch time, a sha256 of the content and its length, so a chunk can always be traced back and a changed page detected -
checks: whether code fences are balanced, how many links there are and how many are unusable, how many headings -
sections=1: the markdown split by headings, each with its level and parent-heading path, ready to chunk without losing structure -
include_raw=1: the rendered HTML next to the markdown, to debug a conversion
Code blocks now come out as fenced blocks with their language, and heading permalink anchors are stripped. Nothing changed for existing callers: the new fields are additive.
Top comments (1)
The key design question for agent pipelines is whether the returned Markdown is stable enough to serve as an intermediate representation, rather than just readable text. I’d preserve the source URL and extraction timestamp, then split by headings before chunking so the agent retains the document structure. It also helps to validate links and code blocks after conversion, since malformed Markdown can quietly break downstream retrieval or tool planning. A selector-based extract is useful when the full page is noisy, but keeping the raw rendered result as a fallback makes debugging much easier.