Free, tokenless search API for agents, CLI tools, and LLM integrations. No registration, no API key, no tracking.
All API requests use the following base URL:
https://aoogle-production.up.railway.app
| Parameter | Type | Default | Description |
|---|---|---|---|
q | string | — | Required. Your search query. |
page | integer | 1 | Page number for pagination. |
pretty | boolean | 0 | Set to 1 to pretty-print JSON output. |
Type a query below to see a live API response:
A successful search returns JSON with the following structure:
{
"query": "python programming",
"page": 1,
"total_results": 25,
// Knowledge panel (present for known entities like "python", "docker", etc.)
"info_box": {
"title": "Python (programming language)",
"type": "Programming language",
"description": "Python is a high-level, general-purpose...",
"image": "https://www.python.org/static/community_logos/...",
"facts": [
["Designed by", "Guido van Rossum"],
["First appeared", "1991"]
]
},
// 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 the Python Programming Language.",
"favicon": "https://www.google.com/s2/favicons?domain=...",
"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 Google's favicon service. |
category | string | Result category: general, news, tech, academic, official, shopping, social, video, discussion. |
date | string|null | Extracted date from snippet, if found (e.g. "Jun 15, 2026"). |
score | float | Relevance score from 0–100+. Higher = more relevant. |
| Header | Description |
|---|---|
X-RateLimit-Remaining | Number of requests remaining in the current hour window. |
X-RateLimit-Reset | Seconds until the rate limit resets (present on 429 responses). |
{
"error": "Missing query parameter",
"usage": "/api/search?q=your+query"
}
{
"error": "Rate limit exceeded",
"message": "You have exceeded the rate limit of 25 requests per hour. Retry after 1234 seconds.",
"retry_after": 1234
}
{
"error": "Search failed",
"message": "An internal error occurred while searching."
}
Here's a complete Python program that turns the API into an interactive terminal search tool — perfect for use in agents, scripts, or just from the command line:
#!/usr/bin/env python3 """aoogle-cli — search from the terminal using the aoogle API""" import sys import requests BASE = "https://aoogle-production.up.railway.app/api/search" def search(query, page=1): try: r = requests.get(BASE, params={"q": query, "page": page}, timeout=15) if r.status_code == 429: print("Rate limit hit. Try again later.") return None r.raise_for_status() return r.json() except requests.RequestException as e: print(f"Request failed: {e}") return None def show_results(data): if not data or "results" not in data: return print(f'\nResults for "{data["query"]}":') print(f'Found {data["total_results"]} results\n') for i, r in enumerate(data["results"], 1): print(f' {i}. {r["title"]}') print(f' {r["url"]}') print(f' {r["snippet"][:120]}') print() def main(): if len(sys.argv) > 1: query = " ".join(sys.argv[1:]) data = search(query) show_results(data) return # Interactive mode print("aoogle CLI — type a query or 'q' to quit") while True: try: q = input("\n> ").strip() if not q or q == "q": break data = search(q) show_results(data) except KeyboardInterrupt: print() break if __name__ == "__main__": main()
aoogle-cli.py and run:
python aoogle-cli.py your search query for a one-shot search, or just python aoogle-cli.py for interactive mode.
The API is designed to work seamlessly with AI agents, LLM tool-calling, and automation pipelines:
aoogle_search_tool = { "type": "function", "function": { "name": "web_search", "description": "Search the web for current information. No API key needed.", "parameters": { "type": "object", "properties": { "q": { "type": "string", "description": "The search query" } }, "required": ["q"] } } }
import requests def web_search(query, max_results=5): """Search the web and return top results as a formatted string.""" r = requests.get( "https://aoogle-production.up.railway.app/api/search", params={"q": query}, timeout=15 ) data = r.json() lines = [] for res in data.get("results", [])[:max_results]: lines.append(f"- {res["title"]}: {res["snippet"]} ({res["url"]})") return "\n".join(lines) or "No results found."
curl "https://aoogle-production.up.railway.app/api/search?q=weather+forecast" | jq '.results[] | "\(.title): \(.url)"'
async function aoogleSearch(query) { const res = await fetch( `https://aoogle-production.up.railway.app/api/search?q=${encodeURIComponent(query)}` ); const data = await res.json(); return data.results.map(r => ({ title: r.title, url: r.url, snippet: r.snippet })); }
retry_after period.pretty=1 param during development for readable output.The API respects the same safety checks as the web interface: