Web search and page context for LLM applications
Search the web, collect useful page text, and pass structured results to your own LLM workflow.
Seekify is a Python metasearch library for applications that need current web results without integrating a paid search API. It searches supported public search-engine pages and returns consistent Python data structures. No search API key is required.
Use its optional LLM mode to retrieve ranked results and extract readable text from up to five result pages in one call. Seekify prepares the search context; it does not call an LLM or provide a model API.
Search engines may rate-limit requests, change their pages, or restrict automated access. Availability and terms depend on each provider. Seekify cannot guarantee uninterrupted access.
- Search across multiple text-search backends through one API.
- Return structured results with titles, URLs, snippets, source engines, and extracted page text for LLM workflows.
- Search images, videos, news, and books through dedicated methods.
- Use a proxy when needed.
- Work with Python dictionaries that are easy to serialize or load into tools such as Pandas.
pip install -U seekifyOr install with uv:
uv add seekifyfrom seekify import Search
with Search() as search:
results = search.text("python programming", max_results=5)
for result in results:
print(result["title"], result["href"])By default, text search returns a list of dictionaries. Select a backend with
backend="google" or provide a comma-separated list such as
backend="google,bing". The default, backend="auto", selects available
backends automatically.
Set llm=True to get a structured payload with page text for up to five ranked
results by default. Set llm_max_pages to fetch more or fewer pages:
from seekify import Search
with Search() as search:
payload = search.text(
"How do solar panels work?",
max_results=10,
llm=True,
llm_max_pages=8,
)
for result in payload["results"]:
print(f"[{result['rank']}] {result['title']} — {result['url']}")
print(result["content"])The payload is JSON-serializable and follows this shape:
{
"schema_version": "1.0",
"query": "How do solar panels work?",
"results": [
{
"rank": 1,
"title": "Solar panels explained",
"url": "https://example.com/solar-panels",
"snippet": "A short summary from the search engine...",
"content": "Readable text extracted from the page...",
"content_status": "ok",
"sources": ["google", "bing"],
"metadata": {}
}
]
}Page text is capped at 5,000 characters per page. llm_max_pages defaults to
5; set it to 0 to skip page fetching or to a higher non-negative integer to
fetch more ranked results (up to the number returned by the search). Results
past that limit have content_status set to "not_fetched_limit". If a page
cannot be retrieved, its result reports "error" and may include
content_error; one failed page does not fail the search. Page fetching uses
HTTPX for HTTP requests and lxml to extract readable text from HTML. Only
public HTTP(S) destinations are fetched, redirects are checked, response data
is capped, and page downloads run with at most five concurrent workers.
The returned payload can be passed to your own model, retrieval, or
citation-generation code. Seekify does not summarize the pages or generate
LLM responses. Without llm=True, the existing list-of-dictionaries response
is unchanged. See the user guide for
the complete field descriptions.
with Search() as search:
images = search.images("mountain landscape", max_results=10)
videos = search.videos("python tutorial", max_results=10)
news = search.news("renewable energy", max_results=10)
books = search.books("machine learning", max_results=10)| Search type | Backends |
|---|---|
| Text | Bing, Brave, DuckDuckGo, Google, Grokipedia, Mojeek, Yahoo, Yandex, Wikipedia |
| Images | DuckDuckGo |
| Videos | DuckDuckGo |
| News | Bing, DuckDuckGo, Yahoo |
| Books | Anna's Archive |
The engines available to you may vary as providers update their sites.
Pass a proxy URL when creating Search:
from seekify import Search
with Search(proxy="socks5h://127.0.0.1:9050") as search:
results = search.text("privacy tools")HTTP and SOCKS5 proxies are supported. See the
user guide for more configuration options.
Providers may still rate-limit proxied requests. When a backend returns HTTP
429, Seekify raises RatelimitException and exposes any Retry-After delay
as exc.retry_after; it does not automatically retry that request.
# Search the web
seekify text -q "Python programming" -m 10
# Search news and save results as JSON
seekify news -q "renewable energy" -m 20 -o news.json
# Search images and download results
seekify images -q "mountain landscape" -m 5 --download --download-directory ./imagesSeekify builds on work from deedy5/ddgs, formerly known as Dux, and extends it with additional engines and features.