searxngreliabilityself-hosted

SearXNG: Too Fragile for Production?

SearXNG has 65% success rate, 2.8s response times, and 8 hrs/mo maintenance. Free but costs $620/mo when you count developer time.

7 min

SearXNG is an open-source meta-search engine that aggregates results from Google, Bing, DuckDuckGo, and dozens of other sources. It is free, self-hosted, and privacy-respecting. It is also too fragile for production workloads. Here is why.

What SearXNG does well

  • Free and open source: no per-query costs
  • Multi-engine aggregation: combines results from 70+ sources
  • Privacy: no tracking, no user profiling
  • Self-hosted: full control over the instance
  • Customizable: choose which engines to query

Why it breaks in production

SearXNG scrapes search engine result pages. When those pages change their HTML structure, SearXNG parsers break. This happens frequently:

  • Google updates its SERP layout every 2-4 weeks
  • Bing changes its response format without notice
  • DuckDuckGo rate limits SearXNG instances aggressively
  • IP bans accumulate on busy instances (Google blocks after ~100 queries/hour)
  • Engine outages cascade: if Google parser breaks, results quality drops 60%

Reliability data from production deployments

Python
# Real reliability metrics from a SearXNG production instance
# (data from r/selfhosted, May 2026)

monthly_stats = {
    "total_queries": 15000,
    "successful_queries": 9750,  # 65% success rate
    "google_engine_uptime": 0.70,  # 30% of time blocked or broken
    "bing_engine_uptime": 0.85,
    "ddg_engine_uptime": 0.60,  # aggressive rate limiting
    "avg_response_time_ms": 2800,  # slow due to multi-engine fan-out
    "maintenance_hours_month": 8,  # fixing broken parsers, rotating IPs
}

success_rate = monthly_stats["successful_queries"] / monthly_stats["total_queries"]
print(f"Success rate: {success_rate:.0%}")
print(f"Maintenance: {monthly_stats['maintenance_hours_month']} hrs/mo")
# 65% success rate, 8 hours/month maintenance

The hidden costs of "free"

Python
# Total cost of operating SearXNG
server_cost = 20  # VPS with enough RAM for SearXNG
maintenance_hours = 8
dev_rate = 75  # $/hour
maintenance_cost = maintenance_hours * dev_rate

total_monthly = server_cost + maintenance_cost
queries_served = 9750  # successful only
cost_per_successful_query = total_monthly / queries_served

print(f"Monthly cost: ${total_monthly}")
print(f"Cost per successful query: ${cost_per_successful_query:.4f}")
# $620/mo total, $0.064 per successful query

# Compare: Scavio at $0.005/query, 100% success rate
api_cost_for_same = 9750 * 0.005
print(f"API cost for same volume: ${api_cost_for_same:.2f}")
# $48.75/mo, 100% success

When SearXNG makes sense

  • Personal use: searching from your own browser, low volume
  • Privacy-critical environments: air-gapped or compliance-restricted
  • Learning: understanding how meta-search works
  • Low-volume internal tools: under 100 queries/day

When SearXNG does not make sense

  • Production AI agents: 65% success rate is unacceptable
  • Customer-facing products: 2.8s response time is too slow
  • High-volume workloads: IP bans accumulate rapidly over 100 queries/hour
  • Teams without DevOps capacity: 8 hours/month of maintenance is significant

Migration path from SearXNG to API

Python
import requests, os

# SearXNG query (unreliable)
def searxng_search(query, instance="http://localhost:8888"):
    try:
        resp = requests.get(
            f"{instance}/search",
            params={"q": query, "format": "json"},
            timeout=10,
        )
        return resp.json().get("results", [])
    except Exception:
        return []  # Silent failure

# Replacement: structured API (reliable)
def api_search(query):
    resp = requests.post(
        "https://api.scavio.dev/api/v1/search",
        headers={"x-api-key": os.environ["SCAVIO_API_KEY"]},
        json={"query": query, "num_results": 10},
    )
    return resp.json().get("organic_results", [])

# Drop-in replacement with same output shape
def search(query):
    results = api_search(query)
    return [{"title": r["title"], "url": r["link"],
             "content": r.get("snippet", "")} for r in results]

Bottom line

SearXNG is a great project for personal privacy-focused search. It is not production infrastructure. The 65% success rate, 2.8s response times, and 8 hours/month maintenance make it more expensive than a $50/month API subscription when you factor in developer time and reliability costs.