Web Search

We recommend some implementations of commonly used web search tools.

API

Free Tier

Pricing Model

Docs

Google Custom Search JSON API

100 queries/day free

$5 per 1000 queries.

Bing Web Search API

1,000 queries/month

$15–$25 per 1,000 queries.

DuckDuckGo Instant Answer

Completely free (Instant Answers only, no URLs)

No paid plans; usage unlimited, but data is limited

Brave Search API

2,000 queries/month free

$3 per 1k queries for Base, $5 per 1k for Pro

SerpApi

100 searches/month free

Start at $75/month for 5,000 searches

RapidAPI

Many options

Many options

Example Code

1. Google Custom Search JSON API

import requests
import os

API_KEY = os.environ.get("GOOGLE_API_KEY") # Use environment variables
CX_ID = os.environ.get("GOOGLE_CX_ID")     # Use environment variables
query = "example"

url = "https://www.googleapis.com/customsearch/v1"
params = {
    "key": API_KEY,
    "cx": CX_ID,
    "q": query
}

if not API_KEY or not CX_ID:
    print("Error: Please set GOOGLE_API_KEY and GOOGLE_CX_ID environment variables.")
else:
    try:
        response = requests.get(url, params=params)
        response.raise_for_status() # Raise an exception for bad status codes
        results = response.json()
        print(results)
    except requests.exceptions.RequestException as e:
        print(f"Error fetching Google search results: {e}")

2. Bing Web Search API

import requests
import os

SUBSCRIPTION_KEY = os.environ.get("BING_API_KEY") # Use environment variables
query = "example"

url = "https://api.bing.microsoft.com/v7.0/search"
headers = {"Ocp-Apim-Subscription-Key": SUBSCRIPTION_KEY}
params = {"q": query}

if not SUBSCRIPTION_KEY:
    print("Error: Please set BING_API_KEY environment variable.")
else:
    try:
        response = requests.get(url, headers=headers, params=params)
        response.raise_for_status()
        results = response.json()
        print(results)
    except requests.exceptions.RequestException as e:
        print(f"Error fetching Bing search results: {e}")

3. DuckDuckGo Instant Answer

import requests

query = "example"
url = "https://api.duckduckgo.com/"
params = {
    "q": query,
    "format": "json",
    "no_html": 1 # Often useful to remove HTML tags
}

try:
    response = requests.get(url, params=params)
    response.raise_for_status()
    results = response.json()
    print(results)
except requests.exceptions.RequestException as e:
    print(f"Error fetching DuckDuckGo results: {e}")

4. Brave Search API

import requests
import os

SUBSCRIPTION_TOKEN = os.environ.get("BRAVE_API_TOKEN") # Use environment variables
query = "example"

url = "https://api.search.brave.com/res/v1/web/search"
headers = {
    "X-Subscription-Token": SUBSCRIPTION_TOKEN,
    "Accept": "application/json" # Good practice
}
params = {
    "q": query
}

if not SUBSCRIPTION_TOKEN:
    print("Error: Please set BRAVE_API_TOKEN environment variable.")
else:
    try:
        response = requests.get(url, headers=headers, params=params)
        response.raise_for_status()
        results = response.json()
        print(results)
    except requests.exceptions.RequestException as e:
        print(f"Error fetching Brave search results: {e}")

5. SerpApi

import requests
import os

API_KEY = os.environ.get("SERPAPI_KEY") # Use environment variables
query = "example"

url = "https://serpapi.com/search"
params = {
    "engine": "google", # Or other engines like 'bing', 'duckduckgo'
    "q": query,
    "api_key": API_KEY
}

if not API_KEY:
    print("Error: Please set SERPAPI_KEY environment variable.")
else:
    try:
        response = requests.get(url, params=params)
        response.raise_for_status()
        results = response.json()
        print(results)
    except requests.exceptions.RequestException as e:
        print(f"Error fetching SerpApi results: {e}")

Last updated