| name | axonrouter-web-fetch |
| description | Fetch URL → markdown / text / HTML via AxonRouter /v1/web/fetch using Firecrawl / Jina Reader / Tavily Extract / Exa Contents. Use when the user wants to scrape a webpage, extract URL content, read article, or convert a URL to markdown. |
AxonRouter — Web Fetch
Requires AXONROUTER_URL (and AXONROUTER_KEY if auth enabled). See https://raw.githubusercontent.com/rickicode/axonrouter/refs/heads/main/skills/axonrouter/SKILL.md for setup.
Discover
curl $AXONROUTER_URL/v1/models/web | jq '.data[] | select(.kind=="webFetch") | .id'
curl "$AXONROUTER_URL/v1/models/info?id=firecrawl/fetch"
IDs end in /fetch (e.g. firecrawl/fetch, jina/fetch). fetch-combo chains providers with auto-fallback.
Endpoint
POST $AXONROUTER_URL/v1/web/fetch
| Field | Required | Notes |
|---|
model (or provider) | yes | from /v1/models/web (e.g. firecrawl or jina-reader) |
url | yes | URL to extract |
format | no | markdown (default) / text / html |
max_characters | no | truncate output |
Examples
Jina Reader
curl -X POST $AXONROUTER_URL/v1/web/fetch \
-H "Authorization: Bearer $AXONROUTER_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"jina-reader","url":"https://axonrouter.com","format":"markdown"}'
Exa
curl -X POST $AXONROUTER_URL/v1/web/fetch \
-H "Authorization: Bearer $AXONROUTER_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"exa","url":"https://example.com","format":"markdown","max_characters":0}'
Firecrawl
curl -X POST $AXONROUTER_URL/v1/web/fetch \
-H "Authorization: Bearer $AXONROUTER_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"firecrawl","url":"https://example.com","format":"markdown","max_characters":0}'
Tavily
curl -X POST $AXONROUTER_URL/v1/web/fetch \
-H "Authorization: Bearer $AXONROUTER_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"tavily","url":"https://example.com","format":"markdown","max_characters":0}'
JS:
const r = await fetch(`${process.env.AXONROUTER_URL}/v1/web/fetch`, {
method: "POST",
headers: { "Authorization": `Bearer ${process.env.AXONROUTER_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ model: "fetch-combo", url: "https://example.com", format: "markdown", max_characters: 5000 }),
});
const { data } = await r.json();
console.log(data.title, data.content.length);
Python:
import requests, os
r = requests.post(f"{os.environ['AXONROUTER_URL']}/v1/web/fetch",
headers={"Authorization": f"Bearer {os.environ['AXONROUTER_KEY']}"},
json={"model": "jina-reader", "url": "https://example.com", "format": "markdown"})
data = r.json()
print(f"{data['title']}\n{data['content']['text'][:200]}")
Response shape
{
"provider": "jina-reader",
"url": "...",
"title": "...",
"content": { "format": "markdown", "text": "...", "length": 1234 },
"metadata": { "author": null, "published_at": null, "language": null },
"usage": { "fetch_cost_usd": 0 },
"metrics": { "response_time_ms": 850, "upstream_latency_ms": 700 }
}
Provider quirks
| Provider | Auth | Best for |
|---|
firecrawl | Bearer | JS-rendered pages, format=markdown/html |
jina-reader | Bearer (optional) | Free tier (~1M chars/mo); fastest plain markdown |
tavily | Bearer | Bulk extract; returns raw_content |
exa | x-api-key | Pre-indexed pages; fast text extraction |