arlong

API

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.

Base URL

https://aoogle-production.up.railway.app

Endpoint

GET /api/search?q={query}

Parameters

ParameterTypeDefaultDescription
qstringRequired. Your search query.
pageinteger1Page number for pagination.
prettyboolean0Set to 1 for pretty-printed JSON output.

Try it

Click Send request to see a live JSON response.

Response

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
    }
  ]
}

Result fields

FieldTypeDescription
titlestringTitle of the search result.
urlstringFull URL to the result page.
display_urlstringTruncated URL for display (max 60 chars).
snippetstringContextual excerpt from the page.
faviconstringFavicon URL via DuckDuckGo's icons service.
categorystringResult category e.g. general, news, official, tech.
datestring|nullExtracted date from snippet e.g. "Jun 15, 2026".
scorefloatRelevance score from 0–100+. Higher = more relevant.

Response headers

HeaderDescription
X-RateLimit-RemainingRequests remaining in the current hour window.
X-RateLimit-ResetSeconds until the rate limit resets (present on 429 responses).

Error responses

400 — Bad request

Returned when q parameter is missing.

{
  "error": "Missing query parameter",
  "usage": "/api/search?q=your+query"
}

429 — Rate limit exceeded

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
}

500 — Internal error

The search backend encountered an unexpected error. Retry after a short delay.

{
  "error": "Search failed",
  "message": "An internal error occurred while searching."
}

Quickstart

cURL

curl "https://aoogle-production.up.railway.app/api/search?q=weather+forecast&pretty=1"

Python

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']}")

JavaScript

const res = await fetch(
    "https://aoogle-production.up.railway.app/api/search?q=javascript+fetch"
);
const data = await res.json();
console.log(data.results);

LLM function tool definition

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"]
        }
    }
}

Python CLI tool

#!/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.

Best practices

Safety and integrity

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.