Free, tokenless search API for agents, CLI tools, and LLM integrations. No registration, no API key, no tracking.
Rate limit: 125 requests per hour per IP address. This is a free shared resource — please cache results and use responsibly.
https://aoogle-production.up.railway.app
GET /api/search?q={query}
| Parameter | Type | Default | Description |
|---|---|---|---|
q | string | — | Required. Your search query. |
page | integer | 1 | Page number for pagination. |
pretty | boolean | 0 | Set to 1 for pretty-printed JSON output. |
A successful search returns JSON with the following structure:
{
"query": "python programming",
"page": 1,
"total_results": 50,
// Knowledge panel (present for known entities)
"info_box": {
"title": "Python (programming language)",
"type": "Programming language",
"description": "Python is a high-level...",
"image": "https://python.org/logo.png",
"facts": [
["Designed by", "Guido van Rossum"]
]
},
// Array of search results
"results": [
{
"title": "Welcome to Python.org",
"url": "https://www.python.org/",
"display_url": "https://www.python.org/",
"snippet": "The official home of Python.",
"favicon": "https://icons.duckduckgo.com/ip3/...",
"category": "official",
"date": null,
"score": 42.15
}
]
}
| Field | Type | Description |
|---|---|---|
title | string | Title of the search result. |
url | string | Full URL to the result page. |
display_url | string | Truncated URL for display (max 60 chars). |
snippet | string | Contextual excerpt from the page. |
favicon | string | Favicon URL via DuckDuckGo's icons service. |
category | string | Result category e.g. general, news, official, tech. |
date | string|null | Extracted date from snippet e.g. "Jun 15, 2026". |
score | float | Relevance score from 0–100+. Higher = more relevant. |
| Header | Description |
|---|---|
X-RateLimit-Remaining | Requests remaining in the current hour window. |
X-RateLimit-Reset | Seconds until the rate limit resets (present on 429 responses). |
Returned when q parameter is missing.
{
"error": "Missing query parameter",
"usage": "/api/search?q=your+query"
}
Returned when you exceed 125 requests in an hour. The retry_after field tells you when to retry.
{
"error": "Rate limit exceeded",
"message": "Limit: 125 req/hour. Retry after 1234 seconds.",
"retry_after": 1234
}
The search backend encountered an unexpected error. Retry after a short delay.
{
"error": "Search failed",
"message": "An internal error occurred while searching."
}
curl "https://aoogle-production.up.railway.app/api/search?q=weather+forecast&pretty=1"
import requests r = requests.get( "https://aoogle-production.up.railway.app/api/search", params={"q": "python programming"} ) data = r.json() for res in data["results"][:3]: print(f"{res['title']} — {res['url']}")
const res = await fetch( "https://aoogle-production.up.railway.app/api/search?q=javascript+fetch" ); const data = await res.json(); console.log(data.results);
arlong_search_tool = { "type": "function", "function": { "name": "web_search", "description": "Search the web. No API key required.", "parameters": { "type": "object", "properties": { "q": { "type": "string", "description": "Search query" } }, "required": ["q"] } } }
#!/usr/bin/env python3 """arlong-cli — terminal search client""" import sys, requests BASE = "https://aoogle-production.up.railway.app/api/search" def search(q, page=1): try: r = requests.get(BASE, params={"q": q, "page": page}, timeout=15) if r.status_code == 429: return None r.raise_for_status() return r.json() except requests.RequestException as e: print(f"Error: {e}") return None def show(data): if not data: return print(f'\nResults for "{data["query"]}":') for i, r in enumerate(data["results"], 1): print(f' {i}. {r["title"]}') print(f' {r["url"]}') def main(): if len(sys.argv) > 1: data = search(" ".join(sys.argv[1:])) show(data) return print("arlong CLI — type a query or 'q' to quit") while True: try: q = input("\n> ").strip() if not q or q == "q": break show(search(q)) except KeyboardInterrupt: break if __name__ == "__main__": main()
Save as arlong-cli.py. Run python arlong-cli.py your search for a one-shot search, or python arlong-cli.py for interactive mode.
retry_after period on 429s.pretty=1 during development for human-readable JSON output.The API enforces the same safeguards as the web interface:
No API key required. Just send requests. If you need a higher rate limit for a legitimate open-source project, open an issue on the repository.