Overview

Deeger Search provides two APIs: SERP Search (Google, Startpage, Yahoo) and Google Maps Scraping (business data extraction with 30+ fields). All requests go through residential proxies with real browser TLS fingerprints.

Both APIs use the same async job model: submit a request, receive ajob_id, poll for results. SERP searches complete in 2-8 seconds, Maps scraping in 5-60 seconds depending on area size.

Base URL: https://api.search.deeger.io

Authentication

All API requests require an API key passed via the X-API-Key header.

Example
curl https://api.search.deeger.io/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.

PlanSERP searches/moMaps results/moConcurrent
Free200502
Starter5,0005005
Growth30,0002,50010
Pro100,00010,00025
Business500,00025,00050
Enterprise2,000,00050,000100

Get Results

GEThttps://api.search.deeger.io/v1/search/{job_id}

Poll this endpoint until status is "done" or "error". Results are available for 1 hour after completion.

Status values

StatusDescription
pendingJob is queued, not yet picked up by a worker
processingWorker is executing the search
doneSearch completed, results available
errorSearch failed (see error field)
Response (done)
{
  "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)

poll.py
import requests, time

API_KEY = "sk-your-api-key"
BASE = "https://api.search.deeger.io"

# 1. Submit search
resp = requests.post(f"{BASE}/v1/search", json={
    "query": "Irish breakfast Dublin",
    "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)

Maps: Submit Search

POSThttps://api.search.deeger.io/v1/maps

Scrape Google Maps for businesses in a geographic area. Uses grid-based search with Nominatim geocoding and Shapely polygon boundaries for precise coverage.

Request body

ParameterTypeDescriptionDefault
queryrequiredstringLocation to search (e.g. "Miraflores, Lima")
search_termsstringComma-separated business types (e.g. "Hotels,Restaurants")all types
max_resultsintegerMaximum businesses to return (1-1000)100
Request
curl -X POST https://api.search.deeger.io/v1/maps \
  -H "X-API-Key: sk-your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "Miraflores, Lima",
    "search_terms": "Hotels,Restaurants",
    "max_results": 50
  }'
Response
{
  "job_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
  "status": "pending",
  "message": "Maps search enqueued. Check status at GET /v1/maps/{job_id}"
}

Maps jobs take longer than SERP searches (5-60 seconds) because they search multiple grid cells across the geographic area. Use a polling interval of 3-5 seconds.

Maps: Get Results

GEThttps://api.search.deeger.io/v1/maps/{job_id}

Poll until status is "done". Returns an array of businesses with 30+ fields each.

Response (done)
{
  "job_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
  "status": "done",
  "query": "Miraflores, Lima",
  "result_count": 50,
  "elapsed_seconds": 8.3,
  "results": [
    {
      "place_id": "0x9105c81f...",
      "business_name": "Maido",
      "business_type": "Peruvian restaurant, Fine dining",
      "description": "Modern eatery with Japanese fusion food",
      "about": "Award-winning Nikkei cuisine...",
      "address": "Ca. San Martín 399, Miraflores",
      "full_address": "Maido, Ca. San Martín 399, Miraflores 15074, Peru",
      "city": "Miraflores, Lima",
      "area": "Miraflores, Peru",
      "country_code": "PE",
      "latitude": -12.1254,
      "longitude": -77.0306,
      "stars": 4.7,
      "phone": "+51 1 3135100",
      "website": "https://maido.pe/",
      "facebook": null,
      "menu_url": "https://maido.mesa247.pe/reservas/maido",
      "opening_hours": {"Friday": "1-10 pm"},
      "timezone": "America/Lima",
      "amenities": {"Accessibility": {"Wheelchair-accessible entrance": true}},
      "highlights": null,
      "hotel_class": null,
      "check_in": null,
      "check_out": null,
      "owner": "Maido (Owner)",
      "plus_code": "VXF9+RQ Miraflores",
      "maps_url": "https://google.com/maps/place/Maido/data=...",
      "photo_url": "https://lh5.googleusercontent.com/..."
    }
  ]
}

Polling example (Python)

maps_poll.py
import requests, time

API_KEY = "sk-your-api-key"
BASE = "https://api.search.deeger.io"

# 1. Submit maps search
resp = requests.post(f"{BASE}/v1/maps", json={
    "query": "Bogota, Colombia",
    "search_terms": "Hotels",
    "max_results": 20,
}, headers={"X-API-Key": API_KEY})
job_id = resp.json()["job_id"]

# 2. Poll for results (maps takes longer)
while True:
    resp = requests.get(
        f"{BASE}/v1/maps/{job_id}",
        headers={"X-API-Key": API_KEY}
    )
    data = resp.json()
    if data["status"] == "done":
        for biz in data["results"]:
            print(f'{biz["business_name"]} - {biz["stars"]}★')
            print(f'  {biz["phone"]} | {biz["address"]}')
            if biz["hotel_class"]:
                print(f'  {biz["hotel_class"]}')
        break
    elif data["status"] == "error":
        print(f'Error: {data.get("error")}')
        break
    time.sleep(3)

Maps: Response Fields

Each business in the results array contains the following fields. Fields are null when not available for that business type.

FieldTypeDescription
place_idstringGoogle Maps internal place ID
business_namestringBusiness name
business_typestringCategory (e.g. "Restaurant, Peruvian restaurant")
descriptionstringShort description (e.g. "Luxe hotel offering dining & a pool")
aboutstringEditorial description from Google
addressstringStreet address
full_addressstringComplete formatted address with city/country
citystringSearch query location
areastringNeighborhood/district (e.g. "Miraflores, Peru")
country_codestringISO country code (e.g. "PE")
latitudenumberLatitude coordinate
longitudenumberLongitude coordinate
starsnumberRating (1.0-5.0)
phonestringPhone with country code
websitestringWebsite URL(s)
facebookstringFacebook page URL
menu_urlstringReservation/menu link (OpenTable, etc.)
opening_hoursobjectHours by day (e.g. {"Friday": "6 am-11 pm"})
timezonestringIANA timezone (e.g. "America/Lima")
amenitiesobjectGrouped attributes (Accessibility, Services, etc.)
highlightsarrayQuick features (e.g. ["Free Wi-Fi", "Free breakfast"])
hotel_classstringHotel star rating (e.g. "5-star hotel")
check_instringCheck-in time (e.g. "15:00")
check_outstringCheck-out time (e.g. "12:00")
ownerstringBusiness owner name
plus_codestringGoogle Plus Code
maps_urlstringGoogle Maps URL
photo_urlstringBusiness photo/logo URL
Hotel-specific fields (hotel_class, check_in, check_out, highlights) are only populated for hotels and lodging. Restaurant-specific fields like menu_url are only populated when available.

Check Usage

GEThttps://api.search.deeger.io/v1/usage

Returns your current monthly usage and remaining quota.

Response
{
  "client": "my-app",
  "plan": "starter",
  "monthly_limit": 5000,
  "usage_this_month": 1234,
  "remaining_this_month": 3766,
  "maps_monthly_limit": 500,
  "maps_usage_this_month": 42,
  "maps_remaining_this_month": 458
}

Search Engines

Use the engine parameter to choose which search engines to query.

ValueDescription
googleGoogle Search (default). Most comprehensive results.
startpageStartpage (Google proxy). No CAPTCHAs needed.
yahooYahoo Search. Alternative result set.
bothGoogle + Startpage in parallel.
allGoogle + 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.

ParameterExampleDescription
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.
Example: Search from Japan in Japanese
{
  "query": "Tokyo restaurants",
  "engine": "google",
  "gl": "jp",
  "hl": "ja",
  "location": "Tokyo, Japan"
}

Error Handling

The API uses standard HTTP status codes.

CodeMeaning
200Success
400Bad request (invalid parameters)
401Missing or invalid API key
403Key revoked or not authorized
404Job not found or expired
429Rate limit exceeded (monthly quota or concurrent limit)
503Service degraded (Redis unavailable)

Error responses include a detail field with a human-readable message:

Error response
{
  "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.