Skip to content

Serper Integration

Official Serper API Documentation

Serper provides a fast and cost-effective way to get search results from Google. Use KeyPool to call Serper with your team token and a stable base URL.

KeyPool Endpoint for Serper

To interact with Serper via KeyPool, you will use the following base URL:

{YOUR_KEYPOOL_BASE_URL}/v1/serper

Authentication

Use your KeyPool team token as a bearer token when making requests to the KeyPool Serper endpoint.

Do not send a personal Serper API key when using KeyPool.

Key Features and Usage

KeyPool supports Serper's JSON search endpoints listed by Serper: /search, /images, /news, /maps, /places, /videos, /shopping, /scholar, /patents, and /autocomplete. The examples below show the same request pattern for web and image search.

Perform a standard Google web search.

Python Example (using requests):

import os
import requests
import json

KEYPOOL_BASE_URL = os.environ.get("KEYPOOL_BASE_URL")
KEYPOOL_TOKEN = os.environ.get("KEYPOOL_TOKEN")

headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {KEYPOOL_TOKEN}",
}

payload = {
    "q": "latest AI news",
    "num": 5, # Number of results
}

response = requests.post(f"{KEYPOOL_BASE_URL}/v1/serper/search", headers=headers, data=json.dumps(payload))
response.raise_for_status() # Raise an exception for HTTP errors

search_results = response.json()
print("Web Search Results:")
for result in search_results.get("organic", []):
    print(f"- {result.get('title')} ({result.get('link')})")

TypeScript Example (using fetch):

const KEYPOOL_BASE_URL = process.env.KEYPOOL_BASE_URL;
const KEYPOOL_TOKEN = process.env.KEYPOOL_TOKEN;

async function serperWebSearch() {
  const headers = {
    "Content-Type": "application/json",
    "Authorization": `Bearer ${KEYPOOL_TOKEN}`,
  };

  const payload = {
    q: "latest AI news",
    num: 5,
  };

  const response = await fetch(`${KEYPOOL_BASE_URL}/v1/serper/search`, {
    method: "POST",
    headers: headers,
    body: JSON.stringify(payload),
  });

  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }

  const searchResults = await response.json();
  console.log("Web Search Results:");
  searchResults.organic.forEach((result: any) => {
    console.log(`- ${result.title} (${result.link})`);
  });
}

serperWebSearch();

Perform a Google image search.

Python Example (using requests):

import os
import requests
import json

KEYPOOL_BASE_URL = os.environ.get("KEYPOOL_BASE_URL")
KEYPOOL_TOKEN = os.environ.get("KEYPOOL_TOKEN")

headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {KEYPOOL_TOKEN}",
}

payload = {
    "q": "cute puppies",
    "num": 3,
}

response = requests.post(f"{KEYPOOL_BASE_URL}/v1/serper/images", headers=headers, data=json.dumps(payload))
response.raise_for_status()

image_results = response.json()
print("Image Search Results:")
for result in image_results.get("images", []):
    print(f"- {result.get('title')} ({result.get('imageUrl')})")

TypeScript Example (using fetch):

const KEYPOOL_BASE_URL = process.env.KEYPOOL_BASE_URL;
const KEYPOOL_TOKEN = process.env.KEYPOOL_TOKEN;

async function serperImageSearch() {
  const headers = {
    "Content-Type": "application/json",
    "Authorization": `Bearer ${KEYPOOL_TOKEN}`,
  };

  const payload = {
    q: "cute puppies",
    num: 3,
  };

  const response = await fetch(`${KEYPOOL_BASE_URL}/v1/serper/images`, {
    method: "POST",
    headers: headers,
    body: JSON.stringify(payload),
  });

  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }

  const imageResults = await response.json();
  console.log("Image Search Results:");
  imageResults.images.forEach((result: any) => {
    console.log(`- ${result.title} (${result.imageUrl})`);
  });
}

serperImageSearch();

Error Handling

KeyPool handles various error conditions gracefully, providing informative responses. Common error scenarios include:

  • 401 Unauthorized: Invalid or missing KeyPool Team Token.
  • 403 Forbidden: Your Team Token does not have permission to access the Serper service.
  • 429 Quota Exceeded: Your team's rate limit for Serper has been reached.
  • 503 No Available Keys: Serper is temporarily unavailable through your KeyPool workspace.
  • 502 Upstream Failed: The request to the Serper API failed (e.g., network error, Serper API down).

Interactive API Reference

For all Serper endpoints and in-browser testing, see API Reference → Serper.