Read a web page
Turn a public web page into clean Markdown in one call, from your agent through the tools server or from your code, on the same Flux key.
Send a URL and get the page back as clean Markdown, ready to hand to a model. No HTML parsing and no scraping code. It runs on the same key as your chat requests and is billed to the same account. It is a paid ability.
| Part | Status |
|---|---|
Over the API (POST /v1/fetch) | Live |
From your agent (web_fetch) | Live |
Reach for it when you want to ground a model on a page you know: an article, a doc or a changelog. To find pages you do not know yet, use Search the web.
From your agent or your code
Add the Flux tools server once, and your agent gets a web_fetch tool that takes a url. From your own code, send the URL to POST /v1/fetch.
Built into Murage, which decides which abilities it uses. Nothing to set up here. See murage.ai.
Built into Wayland, which decides which abilities it uses. Nothing to set up here. See getwayland.com.
Add the Flux tools server from your terminal.
claude mcp add --transport http flux-tools https://api.fluxrouter.ai/mcp-tools/ \
--header "Authorization: Bearer sk-YOUR-FLUX-KEY"
Then ask Claude Code:
Read https://example.com with the Flux web_fetch tool and summarise it in one line.
From Claude Code's own docs, checked 2026-09-28.
Add the Flux tools server to the same config. Codex reads the key from FLUX_API_KEY, which you exported above. File: ~/.codex/config.toml
[mcp_servers.flux-tools]
url = "https://api.fluxrouter.ai/mcp-tools/"
bearer_token_env_var = "FLUX_API_KEY"
Then ask Codex:
Read https://example.com with the Flux web_fetch tool and summarise it in one line.
From Codex's own docs, checked 2026-09-28.
Add the Flux tools server to your global MCP config, then restart Cursor. File: ~/.cursor/mcp.json
{
"mcpServers": {
"flux-tools": {
"url": "https://api.fluxrouter.ai/mcp-tools/",
"headers": {
"Authorization": "Bearer sk-YOUR-FLUX-KEY"
}
}
}
}
Then ask Cursor:
Read https://example.com with the Flux web_fetch tool and summarise it in one line.
From Cursor's own docs, checked 2026-09-28.
Add the Flux tools server to the same config, then restart Hermes. File: ~/.hermes/config.yaml
mcp_servers:
flux-tools:
url: "https://api.fluxrouter.ai/mcp-tools/"
headers:
Authorization: "Bearer sk-YOUR-FLUX-KEY"
Then ask Hermes:
Read https://example.com with the Flux web_fetch tool and summarise it in one line.
From Hermes's own docs, checked 2026-09-28.
Not checked yet. We have not checked how OpenClaw adds an MCP server, so we do not show a recipe. See OpenClaw's own docs.
Open Cline's MCP servers panel, edit the settings file, and add the Flux tools server.
{
"mcpServers": {
"flux-tools": {
"type": "streamableHttp",
"url": "https://api.fluxrouter.ai/mcp-tools/",
"headers": {
"Authorization": "Bearer sk-YOUR-FLUX-KEY"
}
}
}
}
Then ask Cline:
Read https://example.com with the Flux web_fetch tool and summarise it in one line.
From Cline's own docs, checked 2026-09-28.
curl https://api.fluxrouter.ai/v1/fetch \
-H "Authorization: Bearer sk-YOUR-FLUX-KEY" \
-H "Content-Type: application/json" \
-d '{ "url": "https://example.com" }'
import requests
resp = requests.post(
"https://api.fluxrouter.ai/v1/fetch",
headers={"Authorization": "Bearer sk-YOUR-FLUX-KEY"},
json={"url": "https://example.com"},
)
resp.raise_for_status()
print(resp.json()["markdown"])
const resp = await fetch('https://api.fluxrouter.ai/v1/fetch', {
method: 'POST',
headers: {
Authorization: 'Bearer sk-YOUR-FLUX-KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({ url: 'https://example.com' }),
});
if (!resp.ok) throw new Error(await resp.text());
const page = await resp.json();
console.log(page.markdown);
A successful read returns:
{
"markdown": "# Example Domain\n\nThis domain is for use in illustrative examples...",
"format": "markdown",
"url": "https://example.com"
}
From the Flux CLI, the same read is one command:
fluxrouter fetch https://example.com
The full field list and every error are in the fetch reference.
Pages that need a browser
Some pages build themselves with JavaScript, so a plain read comes back empty or missing content. Set "render": true and Flux renders the page in a browser before it extracts the text.
curl https://api.fluxrouter.ai/v1/fetch \
-H "Authorization: Bearer $FLUX_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "url": "https://app.example.com/dashboard", "render": true }'
fluxrouter fetch https://app.example.com/dashboard --render
A rendered read costs more than a plain one. render is an API option: the web_fetch tool always does a plain read.
Cache and billing
- You pay per page read: priced per call. A rendered read is priced separately from a plain one.
- The same URL read again within 6 hours comes from the cache, and a cached read is not billed.
- Failed reads and blocked URLs are not billed.
- A read that takes longer than 25 seconds fails with a
502.
Charges land on the same bill as the rest of your usage. See How billing works.
On the Free plan a read answers 402 and nothing is charged. Upgrade in Billing.
What it cannot read
- Private addresses. Private, loopback, link-local and cloud metadata addresses are refused with
400 blocked target. Only publichttpandhttpsURLs work. - Major social networks. Their pages are refused with
400 social_blocked. - Pages behind a sign-in. Reads do not log in, so you get whatever a signed-out visitor sees.
The endpoint always returns Markdown. It is built to feed a model, not to mirror raw HTML.
If something goes wrong
Every read error, with its fix, is on Read a page problems.