One API for the SERP and the pages behind it. Fetch Google results through rotating residential proxies, then extract the fields you care about with AI — into your schema, not a vendor's.
2,000 free API credits · No credit card required
Worth being clear about up front — the two product shapes fit different jobs.
SerpApi, Serper, SearchAPI.io, DataForSEO…
organic_results, ads, PAA, knowledge graph.A general scraping API that treats Google like any page
organic_results schema — if you need every SERP feature pre-parsed, a dedicated SERP API is the better fit.Set gl, hl, and num right in the Google URL; pick the fields you want back.
curl -G "https://api.webscraping.ai/ai/fields" \
--data-urlencode "api_key=YOUR_API_KEY" \
--data-urlencode "url=https://www.google.com/search?q=web+scraping+api&gl=us&hl=en" \
--data-urlencode "fields[results]=Organic results as a JSON array of {position, title, url, snippet}" \
--data-urlencode "fields[people_also_ask]=People Also Ask questions as a JSON array" \
--data-urlencode "fields[total_organic]=Number of organic results on the page"
# Response (excerpt):
# {
# "results": [
# {"position": 1, "title": "WebScraping.AI - AI-Powered Web Scraping API",
# "url": "https://webscraping.ai", "snippet": "Extract data from any website..."},
# {"position": 2, "title": "ScrapingBee - Web Scraping API", ...}
# ],
# "people_also_ask": ["What is a web scraping API?", "Is web scraping legal?"],
# "total_organic": "10"
# }
# pip install webscraping_ai
# https://pypi.org/project/webscraping-ai/
from webscraping_ai import Client
client = Client(api_key="YOUR_API_KEY")
result = client.fields(
"https://www.google.com/search?q=web+scraping+api&gl=us&hl=en",
fields={
"results": "Organic results as a JSON array of {position, title, url, snippet}",
"people_also_ask": "People Also Ask questions as a JSON array",
"total_organic": "Number of organic results on the page",
},
)
print(result)
# Response (excerpt):
# {
# "results": [
# {"position": 1, "title": "WebScraping.AI - AI-Powered Web Scraping API",
# "url": "https://webscraping.ai", "snippet": "Extract data from any website..."},
# {"position": 2, "title": "ScrapingBee - Web Scraping API", ...}
# ],
# "people_also_ask": ["What is a web scraping API?", "Is web scraping legal?"],
# "total_organic": "10"
# }
// npm install webscraping-ai
// https://www.npmjs.com/package/webscraping-ai
import { WebScrapingAI } from 'webscraping-ai';
const client = new WebScrapingAI({ apiKey: 'YOUR_API_KEY' });
const result = await client.fields({
url: 'https://www.google.com/search?q=web+scraping+api&gl=us&hl=en',
fields: {
results: 'Organic results as a JSON array of {position, title, url, snippet}',
people_also_ask: 'People Also Ask questions as a JSON array',
total_organic: 'Number of organic results on the page',
},
});
console.log(result);
// Response (excerpt):
// {
// "results": [
// {"position": 1, "title": "WebScraping.AI - AI-Powered Web Scraping API",
// "url": "https://webscraping.ai", "snippet": "Extract data from any website..."},
// {"position": 2, "title": "ScrapingBee - Web Scraping API", ...}
// ],
// "people_also_ask": ["What is a web scraping API?", "Is web scraping legal?"],
// "total_organic": "10"
// }
<?php
// composer require webscraping-ai/webscraping-ai-php
// https://packagist.org/packages/webscraping-ai/webscraping-ai-php
require 'vendor/autoload.php';
use WebScrapingAI\Client;
$client = new Client('YOUR_API_KEY');
$result = $client->fields('https://www.google.com/search?q=web+scraping+api&gl=us&hl=en', [
'results' => 'Organic results as a JSON array of {position, title, url, snippet}',
'people_also_ask' => 'People Also Ask questions as a JSON array',
'total_organic' => 'Number of organic results on the page',
]);
print_r($result);
// Response (excerpt):
// {
// "results": [
// {"position": 1, "title": "WebScraping.AI - AI-Powered Web Scraping API",
// "url": "https://webscraping.ai", "snippet": "Extract data from any website..."},
// {"position": 2, "title": "ScrapingBee - Web Scraping API", ...}
// ],
// "people_also_ask": ["What is a web scraping API?", "Is web scraping legal?"],
// "total_organic": "10"
// }
# gem install webscraping_ai
# https://rubygems.org/gems/webscraping_ai
require 'webscraping_ai'
client = WebScrapingAI::Client.new(api_key: 'YOUR_API_KEY')
result = client.fields(
'https://www.google.com/search?q=web+scraping+api&gl=us&hl=en',
fields: {
results: 'Organic results as a JSON array of {position, title, url, snippet}',
people_also_ask: 'People Also Ask questions as a JSON array',
total_organic: 'Number of organic results on the page',
}
)
puts result.inspect
# Response (excerpt):
# {
# "results": [
# {"position": 1, "title": "WebScraping.AI - AI-Powered Web Scraping API",
# "url": "https://webscraping.ai", "snippet": "Extract data from any website..."},
# {"position": 2, "title": "ScrapingBee - Web Scraping API", ...}
# ],
# "people_also_ask": ["What is a web scraping API?", "Is web scraping legal?"],
# "total_organic": "10"
# }
// go get github.com/webscraping-ai/webscraping-ai-go/v4
// https://pkg.go.dev/github.com/webscraping-ai/webscraping-ai-go/v4
package main
import (
"context"
"fmt"
webscrapingai "github.com/webscraping-ai/webscraping-ai-go/v4"
)
func main() {
client, _ := webscrapingai.NewClient(&webscrapingai.Config{APIKey: "YOUR_API_KEY"})
result, _ := client.Fields(context.Background(), &webscrapingai.FieldsOptions{
URL: "https://www.google.com/search?q=web+scraping+api&gl=us&hl=en",
Fields: map[string]string{
"results": "Organic results as a JSON array of {position, title, url, snippet}",
"people_also_ask": "People Also Ask questions as a JSON array",
"total_organic": "Number of organic results on the page",
},
})
fmt.Println(result.Result)
}
// Response (excerpt):
// {
// "results": [
// {"position": 1, "title": "WebScraping.AI - AI-Powered Web Scraping API",
// "url": "https://webscraping.ai", "snippet": "Extract data from any website..."},
// {"position": 2, "title": "ScrapingBee - Web Scraping API", ...}
// ],
// "people_also_ask": ["What is a web scraping API?", "Is web scraping legal?"],
// "total_organic": "10"
// }
// Maven: ai.webscraping:webscraping-ai:4.0.0
// https://central.sonatype.com/artifact/ai.webscraping/webscraping-ai
import ai.webscraping.Client;
import ai.webscraping.Config;
import ai.webscraping.option.FieldsOptions;
import ai.webscraping.result.FieldsResult;
Client client = new Client(Config.builder().apiKey("YOUR_API_KEY").build());
FieldsResult result = client.fields(FieldsOptions.builder()
.url("https://www.google.com/search?q=web+scraping+api&gl=us&hl=en")
.addField("results", "Organic results as a JSON array of {position, title, url, snippet}")
.addField("people_also_ask", "People Also Ask questions as a JSON array")
.addField("total_organic", "Number of organic results on the page")
.build());
System.out.println(result.getResult());
// Response (excerpt):
// {
// "results": [
// {"position": 1, "title": "WebScraping.AI - AI-Powered Web Scraping API",
// "url": "https://webscraping.ai", "snippet": "Extract data from any website..."},
// {"position": 2, "title": "ScrapingBee - Web Scraping API", ...}
// ],
// "people_also_ask": ["What is a web scraping API?", "Is web scraping legal?"],
// "total_organic": "10"
// }
// dotnet add package WebScrapingAI
// https://www.nuget.org/packages/WebScrapingAI
using WebScrapingAI;
var client = new WebScrapingAIClient(new WebScrapingAIClientOptions { ApiKey = "YOUR_API_KEY" });
var result = await client.FieldsAsync(new FieldsRequest {
Url = "https://www.google.com/search?q=web+scraping+api&gl=us&hl=en",
Fields = new Dictionary<string, string> {
["results"] = "Organic results as a JSON array of {position, title, url, snippet}",
["people_also_ask"] = "People Also Ask questions as a JSON array",
["total_organic"] = "Number of organic results on the page",
},
});
Console.WriteLine(result.Result);
// Response (excerpt):
// {
// "results": [
// {"position": 1, "title": "WebScraping.AI - AI-Powered Web Scraping API",
// "url": "https://webscraping.ai", "snippet": "Extract data from any website..."},
// {"position": 2, "title": "ScrapingBee - Web Scraping API", ...}
// ],
// "people_also_ask": ["What is a web scraping API?", "Is web scraping legal?"],
// "total_organic": "10"
// }
Rank checks usually lead to "now fetch the top 10 pages." One API and one bill covers both steps.
Describe exactly the fields you need in plain language — no mapping a vendor's 200-key SERP schema to your app.
Rotating residential proxies with 13-country geotargeting, JS rendering, and device emulation (desktop/mobile/tablet).
Priced by request configuration like any other page — no Google surcharge, no 10× billing for 100-result pages. Failed requests free.
Entry-tier pricing, checked July 2026. An honest table — some SERP-only vendors are cheaper; none also scrape the pages behind the results.
| Provider | Entry cost / 1k searches | Output |
|---|---|---|
| Serper.dev | ~$0.30–1.00 | Parsed JSON, SERP only |
| DataForSEO | $0.60 (queued, ~5–min latency); $2.00 live | Parsed JSON, SERP only |
| Scrapingdog | ~$1.00 | Parsed JSON, SERP only |
| Bright Data SERP | $1.50 (PAYG) | JSON/HTML, SERP only |
| WebScraping.AI | ~$2.90–5.80 (25–50 credits/search on the $29 plan) | HTML, text, or AI fields — any page, not just SERPs |
| SearchAPI.io | $4.00 | Parsed JSON, SERP only |
| ScraperAPI (structured Google) | ~$12.25 (25 credits/req) | Parsed JSON |
| SerpApi | $25.00 | Parsed JSON, 80+ engines |
Vendor prices change often — verify on their pricing pages. Ours: published credit table; a Google scrape typically needs JS rendering + residential proxies (25–50 credits).
In December 2025, Google sued SerpApi — the category's biggest vendor — alleging DMCA circumvention of its anti-bot systems; the case is pending as of July 2026. Whatever the outcome, it's a reminder that building a pipeline on a single SERP-only vendor concentrates risk.
To be clear: scraping Google at scale carries inherent legal and technical uncertainty for every provider, including us — nobody can promise otherwise. A general-purpose API diversifies what your integration can do: if your Google needs change, the same code scrapes any other site. See our SerpApi comparison for the fuller picture.
Does this return parsed SERP JSON like SerpApi?
Not as a fixed schema. You get the rendered HTML or clean text of the results page, or — the usual choice — AI-extracted fields in a JSON shape you describe (positions, titles, URLs, snippets, PAA questions). If you need every SERP feature pre-parsed into a standard schema at high volume, a dedicated SERP API is honestly the better tool; this one wins when you also need the pages behind the results or a custom schema.
Can I target specific countries, languages, and devices?
Yes. Set gl, hl, and num directly in the Google URL you scrape, route the request through one of 13 proxy countries with the country parameter, and switch device emulation between desktop, mobile, and tablet.
How much does scraping Google cost?
Google results pages typically need JS rendering plus residential proxies — 25 to 50 credits per search. On the $29/mo plan (250,000 credits) that's roughly $2.90–5.80 per 1,000 searches, cheaper at higher tiers. There's no per-domain surcharge and failed requests are free.
Is it legal to scrape Google search results?
Search results pages are publicly accessible, and scraping public data has generally been treated as lawful in US case law — but Google's terms prohibit automated access as a contractual matter, and Google's December 2025 lawsuit against SerpApi (pending) shows it is willing to litigate at scale. Don't treat any vendor's service, ours included, as a legal guarantee; consult a lawyer for your use case.
Can I scrape the pages that rank, not just the SERP?
Yes — that's the point of a general API. Extract the top URLs from the results page, then feed them back into /html, /text, or /ai/fields to scrape the destination pages themselves. Rank tracking, content analysis, and competitor research run through one integration.
What about Bing, DuckDuckGo, or other search engines?
The same approach works on any public search engine's results URL — there's no per-engine endpoint to wait for, because there's no per-engine parser involved.
Get started with 2,000 free API credits. No credit card required.