Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Fetch URL → markdown / text / HTML via 9Router /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.
.claude/skills/decolua-9router-web-fetch/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | -11% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 48% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 71% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 3% | 0% |
Requires NINEROUTER_URL (and NINEROUTER_KEY if auth enabled). See https://raw.githubusercontent.com/decolua/9router/refs/heads/master/skills/9router/SKILL.md for setup.
bashcurl $NINEROUTER_URL/v1/models/web | jq '.data[] | select(.kind=="webFetch") | .id' # Per-provider params curl "$NINEROUTER_URL/v1/models/info?id=firecrawl/fetch"
IDs end in /fetch (e.g. firecrawl/fetch, jina/fetch). fetch-combo chains providers with auto-fallback.
POST $NINEROUTER_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 |
bashcurl -X POST $NINEROUTER_URL/v1/web/fetch \ -H "Authorization: Bearer $NINEROUTER_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"jina-reader","url":"https://9router.com","format":"markdown"}'
bashcurl -X POST $NINEROUTER_URL/v1/web/fetch \ -H "Authorization: Bearer $NINEROUTER_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"exa","url":"https://example.com","format":"markdown","max_characters":0}'
bashcurl -X POST $NINEROUTER_URL/v1/web/fetch \ -H "Authorization: Bearer $NINEROUTER_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"firecrawl","url":"https://example.com","format":"markdown","max_characters":0}'
bashcurl -X POST $NINEROUTER_URL/v1/web/fetch \ -H "Authorization: Bearer $NINEROUTER_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"tavily","url":"https://example.com","format":"markdown","max_characters":0}'
Uses the API key from the existing ollama connection.
bashcurl -X POST $NINEROUTER_URL/v1/web/fetch \ -H "Authorization: Bearer $NINEROUTER_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"ollama","url":"https://example.com","format":"markdown"}'
JS:
jsconst r = await fetch(`${process.env.NINEROUTER_URL}/v1/web/fetch`, { method: "POST", headers: { "Authorization": `Bearer ${process.env.NINEROUTER_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);
json{ "provider": "jina-reader", "url": "...", "title": "...", "content": { "format": "markdown", "text": "...", "length": 1234 }, "links": ["https://example.com/related"], "metadata": { "author": null, "published_at": null, "language": null }, "usage": { "fetch_cost_usd": 0 }, "metrics": { "response_time_ms": 850, "upstream_latency_ms": 700 } }
links is included when the upstream provider returns discovered page links (currently Ollama Cloud).
| 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 | | ollama | Bearer | Markdown plus page title and discovered links; uses the Ollama Cloud key |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-07 | fail→pass | 19,245 | 9,515 | -51% | 1 | 1 | 0% | 2,264 | 2,024 | -11% | 0 | 0 | — |
case-01 | fail→pass | 15,100 | 13,267 | -12% | 1 | 1 | 0% | 1,823 | 2,689 | +48% | 0 | 0 | — |
case-02 | fail→pass | 11,185 | 8,809 | -21% | 1 | 1 | 0% | 1,159 | 1,977 | +71% | 0 | 0 | — |
case-03 | fail→pass | 12,524 | 9,196 | -27% | 1 | 1 | 0% | 1,485 | 2,042 | +38% | 0 | 0 | — |
case-04 | fail→pass | 27,454 | 2,792 | -90% | 1 | 1 | 0% | 1,634 | 1,685 | +3% | 0 | 0 | — |
case-05 | fail→pass | 15,679 | 7,841 | -50% | 1 | 1 | 0% | 1,951 | 1,675 | -14% | 0 | 0 | — |
case-06 | pass→pass | 18,537 | 8,500 | -54% | 1 | 1 | 0% | 2,311 | 1,843 | -20% | 0 | 0 | — |
case-08 | fail→pass | 17,914 | 8,280 | -54% | 1 | 1 | 0% | 2,097 | 1,786 | -15% | 0 | 0 | — |
case-09 | fail→pass | 15,715 | 7,670 | -51% | 1 | 1 | 0% | 1,806 | 1,692 | -6% | 0 | 0 | — |
case-10 | fail→pass | 15,545 | 8,023 | -48% | 1 | 1 | 0% | 1,661 | 1,771 | +7% | 0 | 0 | — |
case-11 | fail→pass | 32,215 | 6,799 | -79% | 1 | 1 | 0% | 1,774 | 1,547 | -13% | 0 | 0 | — |
case-12 | fail→pass | 12,070 | 8,141 | -33% | 1 | 1 | 0% | 1,177 | 1,767 | +50% | 0 | 0 | — |
case-13 | pass→pass | 12,497 | 8,423 | -33% | 1 | 1 | 0% | 1,383 | 1,843 | +33% | 0 | 0 | — |
case-14 | fail→pass | 13,541 | 7,931 | -41% | 1 | 1 | 0% | 1,453 | 1,706 | +17% | 0 | 0 | — |
case-15 | fail→pass | 16,472 | 6,919 | -58% | 1 | 1 | 0% | 2,055 | 1,447 | -30% | 0 | 0 | — |
case-16 | fail→pass | 11,142 | 9,161 | -18% | 1 | 1 | 0% | 1,159 | 2,005 | +73% | 0 | 0 | — |
case-17 | fail→pass | 17,507 | 7,672 | -56% | 1 | 1 | 0% | 2,482 | 1,695 | -32% | 0 | 0 | — |
case-18 | fail→pass | 16,202 | 2,060 | -87% | 1 | 1 | 0% | 1,587 | 1,559 | -2% | 0 | 0 | — |
case-19 | fail→pass | 16,463 | 7,538 | -54% | 1 | 1 | 0% | 1,948 | 1,572 | -19% | 0 | 0 | — |
case-20 | pass→pass | 10,890 | 8,129 | -25% | 1 | 1 | 0% | 1,055 | 1,846 | +75% | 0 | 0 | — |
case-21 | pass→pass | 11,476 | 9,746 | -15% | 1 | 1 | 0% | 1,177 | 2,149 | +83% | 0 | 0 | — |
case-22 | pass→pass | 11,927 | 9,633 | -19% | 1 | 1 | 0% | 1,236 | 2,129 | +72% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +77 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/10/2026 | +77% |
Other measured skills in the registry, with their headline benchmark lift.