Overview
SerpAlgova is a multi-engine search API that returns structured results from Google, Startpage, and Yahoo. All requests go through residential proxies with real browser fingerprints for reliable scraping.
The API uses an async job model: you submit a search and poll for results. Most searches complete in 2-8 seconds.
https://api.serp.algova.devAuthentication
All API requests require an API key passed via the X-API-Key header.
curl https://api.serp.algova.dev/v1/health \
-H "X-API-Key: sk-your-api-key"API keys are created from the dashboard after registration. Each key is tied to a plan that determines monthly search limits and concurrent request capacity.
| Plan | Monthly searches | Concurrent requests |
|---|---|---|
Free | 200 | 2 |
Starter | 5,000 | 5 |
Growth | 30,000 | 10 |
Pro | 100,000 | 25 |
Business | 500,000 | 50 |
Enterprise | 2,000,000 | 100 |
Submit a Search
https://api.serp.algova.dev/v1/searchEnqueue a search job. Returns a job_id that you use to poll for results.
Request body
| Parameter | Type | Description | Default |
|---|---|---|---|
queryrequired | string | Search query (1-500 chars) | — |
engine | string | Search engine. Default: "google" | "google" |
pages | integer | Number of result pages (1-10) | 1 |
gl | string | Country code ISO 3166-1 alpha-2 | "pe" |
hl | string | Language code BCP-47 | "es" |
location | string | City/region targeting (e.g. "Lima, Peru") | null |
proxy_provider | string | Proxy provider: auto | rayobyte | plainproxies | geonode | "auto" |
curl -X POST https://api.serp.algova.dev/v1/search \
-H "X-API-Key: sk-your-api-key" \
-H "Content-Type: application/json" \
-d '{
"query": "best restaurants in Lima",
"engine": "google",
"gl": "pe",
"hl": "es",
"pages": 1
}'{
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "pending",
"message": "Search enqueued. Check status at GET /v1/search/{job_id}"
}Get Results
https://api.serp.algova.dev/v1/search/{job_id}Poll this endpoint until status is "done" or "error". Results are available for 1 hour after completion.
Status values
| Status | Description |
|---|---|
pending | Job is queued, not yet picked up by a worker |
processing | Worker is executing the search |
done | Search completed, results available |
error | Search failed (see error field) |
{
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "done",
"query": "best restaurants in Lima",
"engine": "google",
"created_at": 1709856000.0,
"completed_at": 1709856004.2,
"search_information": {
"total_results": "About 45,200,000 results",
"time_taken": "0.52s"
},
"organic_results": [
{
"position": 1,
"title": "Los 10 mejores restaurantes de Lima - TripAdvisor",
"url": "https://tripadvisor.com/Restaurants-Lima.html",
"snippet": "Descubre los mejores restaurantes en Lima, Peru...",
"displayed_url": "tripadvisor.com > Lima"
},
{
"position": 2,
"title": "Central Restaurante - Lima",
"url": "https://centralrestaurante.com.pe",
"snippet": "Mejor restaurante de Sudamerica 2023...",
"displayed_url": "centralrestaurante.com.pe"
}
],
"related_questions": [
"What is the best restaurant in Lima?",
"Is Lima known for food?"
],
"related_searches": [
"best ceviche in Lima",
"fine dining Lima Peru"
],
"knowledge_graph": null,
"result_count": 10
}Polling example (Python)
import requests, time
API_KEY = "sk-your-api-key"
BASE = "https://api.serp.algova.dev"
# 1. Submit search
resp = requests.post(f"{BASE}/v1/search", json={
"query": "best coffee shops NYC",
"engine": "google",
"gl": "us",
"hl": "en",
}, headers={"X-API-Key": API_KEY})
job_id = resp.json()["job_id"]
# 2. Poll for results
while True:
resp = requests.get(
f"{BASE}/v1/search/{job_id}",
headers={"X-API-Key": API_KEY}
)
data = resp.json()
if data["status"] == "done":
for r in data["organic_results"]:
print(f'{r["position"]}. {r["title"]}')
print(f' {r["url"]}')
break
elif data["status"] == "error":
print(f'Error: {data.get("error")}')
break
time.sleep(2)Check Usage
https://api.serp.algova.dev/v1/usageReturns your current monthly usage and remaining quota.
{
"client": "my-app",
"plan": "starter",
"monthly_limit": 5000,
"usage_this_month": 1234,
"remaining_this_month": 3766
}Search Engines
Use the engine parameter to choose which search engines to query.
| Value | Description |
|---|---|
google | Google Search (default). Most comprehensive results. |
startpage | Startpage (Google proxy). No CAPTCHAs needed. |
yahoo | Yahoo Search. Alternative result set. |
both | Google + Startpage in parallel. |
all | Google + Startpage + Yahoo in parallel. |
When using both or all, results from each engine are returned under separate keys in the response.
Geo Targeting
Control where your search appears to originate using the gl, hl, and location parameters.
| Parameter | Example | Description |
|---|---|---|
gl | "us" | Country code (ISO 3166-1 alpha-2). Affects which Google country domain is used. |
hl | "en" | Language code (BCP-47). Controls the language of results and UI. |
location | "New York, NY" | City/region for precise geo-targeting via Google's uule parameter. |
{
"query": "Tokyo restaurants",
"engine": "google",
"gl": "jp",
"hl": "ja",
"location": "Tokyo, Japan"
}Error Handling
The API uses standard HTTP status codes.
| Code | Meaning |
|---|---|
200 | Success |
400 | Bad request (invalid parameters) |
401 | Missing or invalid API key |
403 | Key revoked or not authorized |
404 | Job not found or expired |
429 | Rate limit exceeded (monthly quota or concurrent limit) |
503 | Service degraded (Redis unavailable) |
Error responses include a detail field with a human-readable message:
{
"detail": "Monthly search limit exceeded (5000/5000). Upgrade plan or wait until next month."
}Rate Limits
Rate limits are enforced per API key at two levels:
- Monthly quota — total searches per calendar month. Resets on the 1st.
- Concurrent requests — maximum simultaneous in-flight searches. Requests above this limit receive a 429.
Check your current usage at any time with GET /v1/usage. When you hit the monthly limit, upgrade your plan from the dashboard or wait until the next month.