Quick answer
The cheapest SERP API is the one with the lowest cost for the results your workload can actually use. SearchCans standard Google and Bing searches use 1 credit per request, with pack rates from $0.90 to $0.56 per 1,000 credits. The $0.56 rate requires the $1,680 Ultimate pack and assumes you use its credits before expiry. It is not the minimum purchase price.
This comparison separates advertised unit prices, upfront payments, credit expiry, and extraction costs. Pricing checked on September 6, 2026. It is published by SearchCans, not an independent performance benchmark.
SERP API pricing: compare the billing unit first
Before comparing prices, specify the search engine, country, language, result type, and number of result pages you need. A provider returning the wrong fields is not a cheaper substitute. Compare successful, usable responses for the same test queries, and record retries separately.
- Prepaid packs: inspect the minimum purchase, expiry, and additional charges for selected modes.
- Monthly plans: compare the included allowance with your expected usage, not just the allowance’s full-utilization rate.
- Throughput: check concurrency and other limits independently of the number of purchased requests.
- Search versus extraction: a SERP response supplies result URLs and snippets; fetching the contents of those URLs is a separate operation.
SerpApi: selected monthly plans
The following publicly listed plans provide a subscription comparison. These are selected plans, not the complete set of enterprise options. The calculated rate assumes the entire included search allowance is used.
| Plan | Monthly price | Included searches | Price per 1,000 at full use |
|---|---|---|---|
| Starter | $25 | 1,000 | $25.00 |
| Developer | $75 | 5,000 | $15.00 |
| Production | $150 | 15,000 | $10.00 |
| Big Data | $275 | 30,000 | $9.17 |
For example, paying $150 while using 7,000 searches in that month means an effective API cost of $21.43 per 1,000 searches. That is an illustrative utilization calculation, not a claim about every customer’s costs. Check the provider’s current overage and renewal terms before purchasing.
SearchCans: prepaid standard SERP requests
SearchCans pricing uses prepaid credit packs with six-month validity and no automatic subscription renewal. These rates apply to standard Google and Bing search requests at 1 credit each. Reader extraction and optional proxy modes have different credit costs.
| Pack | Upfront price | Credits | Per 1,000 standard SERP requests at full use |
|---|---|---|---|
| Standard | $18 | 20,000 | $0.90 |
| Starter | $99 | 132,000 | $0.75 |
| Pro | $597 | 995,000 | $0.60 |
| Ultimate | $1,680 | 3,000,000 | $0.56 |
New accounts receive 100 free credits to test representative queries. Standard SERP requests consume 1 credit; standard Reader extraction consumes 2. An API key accesses both services, but Reader extraction is not free or included in the credit cost of a search request.
Credit expiry can change which SERP API is cheapest
Use two calculations: the price per consumed credit, and the cash paid for the pack. A low pack rate does not make unused credits free.
Effective API cost per 1,000 usable searches
= total API spend / usable searches delivered * 1,000
| Illustrative Ultimate usage | Upfront spend | Standard searches consumed before expiry | Effective API cost per 1,000 |
|---|---|---|---|
| All credits used | $1,680 | 3,000,000 | $0.56 |
| 100,000 per month for six months; remainder expires unused | $1,680 | 600,000 | $2.80 |
In the second example the cash outlay averages $280 per month over six months, not $56. That does not mean Ultimate is the right pack for this workload. Smaller packs bought as needed may fit better. Credits used by other APIs also count toward pack utilization, but must be budgeted at those APIs’ own rates.
Which providers should you compare?
Start with providers that can return the fields and search locations you need. SerpApi is a useful subscription reference; Serper, Bright Data, and Oxylabs are other candidates to evaluate against your request specification. This article does not assign unverified current prices, latency scores, or feature exclusions to those services.
SearchCans is worth testing when you need Google Search API JSON results and URL-to-Markdown extraction with a shared prepaid balance. It is not necessarily the cheapest choice for every volume, specialist search feature, or contractual requirement.
Run a small, comparable evaluation
- Select queries from your actual workload, including the countries and result types that matter.
- Check organic URLs, snippets, and any required rich-result fields against your application’s expectations.
- Measure median and p95 latency, error rate, retries, and billed usage on that same sample.
- Estimate six months of usage and inspect renewal, expiry, support, and throughput terms.
Parallel Lanes govern SearchCans concurrency. No hourly cap does not mean unlimited simultaneous requests. Response times depend on the query, upstream source, and selected options; this guide does not claim a measured sub-1.5-second response time or a contractual uptime guarantee.
Practical Implementation: Python SERP API Integration
Integrating the SearchCans SERP API into your Python application is straightforward. This example demonstrates how to perform batch searches for keywords, handle retries, and save the structured JSON results.
Prerequisites
Before implementing the SearchCans integration:
- Python 3.x installed
requestslibrary (pip install requests)
- Create a
keywords.txtfile with one keyword per line
Python Implementation: SERP Batch Search Client
Here’s a complete implementation for batch keyword searching with retry logic and result saving.
# serp_batch_client.py
import requests
import json
import time
import os
from datetime import datetime
class SERPAPIClient:
def __init__(self, user_key, search_engine="google", max_retries=3):
self.api_url = "https://www.searchcans.com/api/v1/search"
self.user_key = user_key
self.search_engine = search_engine
self.max_retries = max_retries
self.completed = 0
self.failed = 0
self.total = 0
def load_keywords(self, keywords_file):
"""Loads keywords from a file."""
if not os.path.exists(keywords_file):
print(f"❌ Error: {keywords_file} not found.")
print("Please create this file with one keyword per line.")
return []
keywords = []
with open(keywords_file, 'r', encoding='utf-8') as f:
for line in f:
keyword = line.strip()
if keyword and not keyword.startswith('#'):
keywords.append(keyword)
print(f"📄 Loaded {len(keywords)} keywords.")
return keywords
def search_keyword(self, keyword, page=1):
"""Searches a single keyword."""
headers = {
"Authorization": f"Bearer {self.user_key}",
"Content-Type": "application/json"
}
payload = {
"s": keyword,
"t": self.search_engine,
"d": 10000, # 10-second timeout
"p": page
}
try:
print(f" Searching: {keyword} (page {page})...", end=" ")
response = requests.post(
self.api_url,
headers=headers,
json=payload,
timeout=15
)
response.raise_for_status()
result = response.json()
if result.get("code") == 0:
data = result.get("data") or {}
organic = data.get("organic", []) if isinstance(data, dict) else []
print(f"Success ({len(organic)} organic results)")
return result
else:
msg = result.get("msg", "Unknown error")
print(f"❌ Failed: {msg}")
return None
except requests.exceptions.Timeout:
print(f"❌ Timeout")
return None
except Exception as e:
print(f"❌ Error: {str(e)}")
return None
def search_with_retry(self, keyword, page=1):
"""Searches with a retry mechanism."""
for attempt in range(self.max_retries):
if attempt > 0:
print(f" 🔄 Retrying {attempt}/{self.max_retries-1}...")
time.sleep(2)
result = self.search_keyword(keyword, page)
if result:
return result
print(f" ❌ Keyword '{keyword}' failed after {self.max_retries} attempts.")
return None
def save_result(self, keyword, result, output_dir):
"""Saves the search result to JSON files."""
safe_filename = "".join(c if c.isalnum() or c in (' ', '-', '_') else '_' for c in keyword)
safe_filename = safe_filename[:50]
json_file = os.path.join(output_dir, f"{safe_filename}.json")
with open(json_file, 'w', encoding='utf-8') as f:
json.dump(result, f, ensure_ascii=False, indent=2)
jsonl_file = os.path.join(output_dir, "all_results.jsonl")
with open(jsonl_file, 'a', encoding='utf-8') as f:
record = {
"keyword": keyword,
"timestamp": datetime.now().isoformat(),
"result": result
}
f.write(json.dumps(record, ensure_ascii=False) + "\n")
print(f" 💾 Saved: {safe_filename}.json")
def run(self, keywords_file, output_base_dir):
"""Main execution function for batch searching."""
print("=" * 60)
print("🚀 SearchCans SERP API Batch Search Tool")
print("=" * 60)
keywords = self.load_keywords(keywords_file)
if not keywords:
return
self.total = len(keywords)
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
output_dir = os.path.join(output_base_dir, f"serp_results_{timestamp}")
os.makedirs(output_dir, exist_ok=True)
print(f"📂 Results will be saved to: {output_dir}/")
print(f"🔍 Search Engine: {self.search_engine}")
print("-" * 60)
for index, keyword in enumerate(keywords, 1):
print(f"\n[{index}/{self.total}] Keyword: {keyword}")
result = self.search_with_retry(keyword)
if result:
self.save_result(keyword, result, output_dir)
self.completed += 1
else:
self.failed += 1
if index < self.total:
time.sleep(1)
print("\n" + "=" * 60)
print("📊 Execution Statistics")
print("=" * 60)
print(f"Total Keywords: {self.total}")
print(f"Successful: {self.completed} ✅")
print(f"Failed: {self.failed} ❌")
print(f"Success Rate: {(self.completed/self.total*100):.1f}%")
print(f"\n📁 Results saved to: {output_dir}/")
# Main execution
if __name__ == "__main__":
USER_KEY = os.getenv("SEARCHCANS_API_KEY", "YOUR_API_KEY")
if USER_KEY == "YOUR_API_KEY":
print("❌ Please set your SearchCans API key!")
exit()
client = SERPAPIClient(USER_KEY, "google", 3)
client.run("keywords.txt", "serp_results")
print("\n✅ Task completed!")
The client retries failed attempts. A timeout does not prove that the upstream request was unprocessed or unbilled; keep retry counts in your cost evaluation. Check the saved data.organic entries, not just HTTP success, before treating a response as useful.
Budget search and Reader extraction separately
A search request returns result URLs and snippets. Reader API fetches supported source pages and converts their content to Markdown for inspection or RAG ingestion. Access restrictions, source markup, and JavaScript can affect extraction. Review the output instead of assuming every URL produces complete content.
For a workflow with one standard search and three standard Reader extractions, the credit budget is 1 + (3 * 2) = 7 credits, before optional proxy add-ons. On the Standard pack this is $6.30 per 1,000 such workflows; on a fully utilized Ultimate pack it is $3.92. Those are workflow costs, not prices per search.
Markdown can remove unwanted page markup, but it does not by itself establish factual accuracy or improve retrieval by a fixed percentage. Test chunking, relevant passage retention, and answer citations with your own evaluation set.
Build versus buy: include operational work
A self-managed scraper adds compute, monitoring, parser maintenance, and source-access handling to the API comparison. Enter your own costs rather than treating a generic proxy or developer-rate estimate as a market price.
For illustration only, 30 maintenance hours at an assumed $100 per hour would cost $3,000, before infrastructure. A small, stable scraper might need far less work. A purchased API still requires integration, response validation, retries, and monitoring; it does not remove all engineering or source-access risk.
Evaluate the API bill alongside those costs, required support, and the value of delivered results. Optional proxy modes must be included where your workload requires them. Do not assume all advanced modes have the base request cost.
Frequently asked questions
What is the cheapest SERP API for low or irregular usage?
Compare the minimum purchase and how much you will consume before expiry. SearchCans starts at an $18 pack, with 100 free credits for new accounts. A larger pack has a lower full-utilization rate but can cost more per usable search if most credits expire unused.
Is $0.56 per 1,000 searches a monthly plan?
No. It is the unit rate for standard 1-credit SERP requests on the $1,680 Ultimate pack, assuming full utilization of its 3,000,000 credits. Purchased credits have six-month validity.
Does Reader API have the same price as SERP API?
No. Standard Reader extraction uses 2 credits, versus 1 for a standard Google or Bing search. Reader therefore costs $1.80 per 1,000 standard extractions on Standard or $1.12 on a fully utilized Ultimate pack, before optional proxy charges.
Can I use SearchCans for Google and Bing?
Yes. Select the engine with the t request parameter. Review the Google Search API and Bing Search API examples for the output your application needs.
Does adding web search prevent AI hallucinations?
No. Search supplies candidate sources; your application still needs to evaluate relevance, verify claims, and cite supporting passages. Extraction, retrieval, and answer generation are separate steps.
Test your workload before buying a larger pack
Start with representative queries, inspect the responses, and calculate costs using expected consumption. Choose a pack after confirming both output quality and capacity.
Create an account for 100 free credits, try the API Playground, or review the current credit packs. For extraction comparisons, see SearchCans Reader API versus Jina Reader.