# Web Search

> Free web search via DuckDuckGo — text, news, images. No API key needed. Self-hosted SearXNG as alternative.

- Skill: `fuyuxiang/web-search` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add fuyuxiang/web-search`
- Raw SKILL.md: https://api.skillmd.com/api/skills/fuyuxiang/web-search/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Research & Search
- Author: fuyuxiang (https://skillmd.com/u/fuyuxiang)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/fuyuxiang/web-search

---


# Web Search

Free web search without API keys. Two options: DuckDuckGo (zero config) or SearXNG (self-hosted).

## DuckDuckGo (Primary)

### Python library (recommended)

```bash
pip install duckduckgo_search
```

```python
from duckduckgo_search import DDGS

# Text search
results = DDGS().text("query here", max_results=5)
for r in results:
    print(f"{r['title']}\n{r['href']}\n{r['body']}\n")

# News search
news = DDGS().news("AI agents", max_results=5)

# Image search
images = DDGS().images("cat meme", max_results=3)
```

### CLI one-liner

```bash
python3 -c "
from duckduckgo_search import DDGS
for r in DDGS().text('$QUERY', max_results=5):
    print(f\"{r['title']}\n  {r['href']}\n  {r['body'][:100]}\n\")
"
```

### Helper script

```bash
python3 scripts/web_search.py "your query" --max 5
python3 scripts/web_search.py "AI news" --type news
python3 scripts/web_search.py "cat" --type images
```

## SearXNG (Self-hosted alternative)

For privacy or heavy usage, deploy your own SearXNG instance:

```bash
# JSON API (no key needed for self-hosted)
curl -s "http://localhost:8080/search?q=QUERY&format=json&engines=google,bing,duckduckgo" | python3 -m json.tool
```

Docker deployment:
```bash
docker run -d -p 8080:8080 searxng/searxng
```

## Rate Limits

| Service | Limit | Notes |
|---------|-------|-------|
| DuckDuckGo | ~20-30 req/min | No official limit, be respectful |
| SearXNG | Unlimited (self-hosted) | Depends on upstream engines |

## Tips

- Use specific queries with operators: `site:github.com Python agent`
- For recent results, add year: `"2026" AI agent framework`
- DuckDuckGo respects `region` param: `DDGS().text(query, region="cn-zh")`

