Web Fetch with Linkup
Fetch clean web content via the Linkup API using a standalone Python script.
Prerequisites
A .env file in the skill directory (.claude/skills/web-fetch-linkup/.env ) with:
LINKUP_API_KEY=your_api_key_here
See .env.example for the template.
Workflow
Step 1: Collect the URL
Get the URL from the user via AskUserQuestion or directly if provided in the request.
Step 2: Fetch the content
Run the script using Bash:
python3 .claude/skills/web-fetch-linkup/fetch.py "<URL>"
Options:
Flag Effect
--no-render-js
Disable JavaScript rendering (default: enabled)
--extract-images
Include image URLs in output
--include-raw-html
Include raw HTML in output
Examples:
Standard fetch (JS rendering enabled)
python3 .claude/skills/web-fetch-linkup/fetch.py "https://example.com/article"
Static page, faster
python3 .claude/skills/web-fetch-linkup/fetch.py "https://example.com" --no-render-js
With images
python3 .claude/skills/web-fetch-linkup/fetch.py "https://example.com" --extract-images
Step 3: Parse the response
The script outputs JSON on stdout with:
-
url — The fetched URL
-
markdown — The extracted content in Markdown format
-
images — (only with --extract-images ) List of image URLs
-
rawHtml — (only with --include-raw-html ) Raw HTML source
Step 4: Save the content
Create a file in fetched-content/ with the format:
Filename: {domain}-{YYYYMMDD-HHmmss}.md
Structure:
source: <URL> fetched_at: <ISO timestamp>
<Title inferred from content>
<Extracted markdown content>
Step 5: Confirm
Inform the user of the created file path.
Exit codes
Code Meaning
0 Success
1 .env missing or LINKUP_API_KEY not set
3 401 — Invalid or expired API key
4 429 — Rate limit exceeded
5 Other HTTP error
6 Network error (DNS, timeout, etc.)
Error handling
Error Action
Exit 1 Check .claude/skills/web-fetch-linkup/.env exists with LINKUP_API_KEY
Exit 3 API key is invalid or expired — get a new one at https://app.linkup.so
Exit 4 Rate limit — wait before retrying
Exit 5 Check stderr for HTTP status details
Exit 6 Network issue — retry with --no-render-js if timeout
Usage examples
Fetch an article:
"Fetch the content of https://example.com/article"
Fetch documentation:
"Use linkup to scrape https://docs.example.com/api"
Dynamic page:
"Extract content from this React page: https://app.example.com/dashboard"