Pull parsed Google results on your own schedule, track positions by country and language, and scrape the pages that outrank you - a flexible base for SERP monitoring.
Search engine rankings fluctuate daily. Algorithm updates, competitor changes, and content freshness all impact your visibility. Manual checking doesn't scale.
Enterprise SEO tools are expensive and often limited in customization. You need flexible SERP monitoring you can tailor to your needs.
/serp returns organic_results with position, title, link, and domain — 15 credits per searchgl and hl for the country and language you track; use page to go past the top 10/serp doesn't parse, like People Also Ask boxes, in plain languageSee the Google SERP API page for the full response format and pricing.
Comprehensive search visibility tracking
Store position from each organic result and chart your rankings for target keywords over time.
Use AI extraction on the results page for featured snippets, People Also Ask, and other features.
Group results by domain to see which competitors rank for your keywords.
Track rankings by country and language with the gl and hl parameters.
Get parsed rankings for a keyword in one call
curl -G "https://api.webscraping.ai/serp" \
--data-urlencode "api_key=YOUR_API_KEY" \
--data-urlencode "q=web scraping api" \
--data-urlencode "gl=us" \
--data-urlencode "hl=en" \
--data-urlencode "page=1"
# Response (excerpt):
# {
# "search_information": {"query_displayed": "web scraping api",
# "organic_results_state": "Results for exact spelling"},
# "organic_results": [
# {"position": 1, "title": "...", "link": "https://...", "domain": "...",
# "displayed_link": "...", "snippet": "..."},
# ...
# ],
# "pagination": {"current": 1, "next": 2}
# }
#
# position restarts at 1 on every page:
# absolute rank = (page - 1) * 10 + position
# pip install webscraping_ai
# https://pypi.org/project/webscraping-ai/
from webscraping_ai import Client
client = Client(api_key="YOUR_API_KEY")
results = client.serp("web scraping api", gl="us", hl="en", page=1)
for r in results["organic_results"]:
print(r["position"], r["title"], r["link"])
# Response (excerpt):
# {
# "search_information": {"query_displayed": "web scraping api",
# "organic_results_state": "Results for exact spelling"},
# "organic_results": [
# {"position": 1, "title": "...", "link": "https://...", "domain": "...",
# "displayed_link": "...", "snippet": "..."},
# ...
# ],
# "pagination": {"current": 1, "next": 2}
# }
#
# position restarts at 1 on every page:
# absolute rank = (page - 1) * 10 + position
// 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 serp = await client.serp({ q: 'web scraping api', gl: 'us', hl: 'en', page: 1 });
for (const r of serp.organic_results) {
console.log(`${r.position}. ${r.title} — ${r.link}`);
}
// Response (excerpt):
// {
// "search_information": {"query_displayed": "web scraping api",
// "organic_results_state": "Results for exact spelling"},
// "organic_results": [
// {"position": 1, "title": "...", "link": "https://...", "domain": "...",
// "displayed_link": "...", "snippet": "..."},
// ...
// ],
// "pagination": {"current": 1, "next": 2}
// }
//
// position restarts at 1 on every page:
// absolute rank = (page - 1) * 10 + position
<?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');
$serp = $client->serp(q: 'web scraping api', gl: 'us', hl: 'en', page: 1);
foreach ($serp['organic_results'] as $r) {
printf("%d. %s — %s\n", $r['position'], $r['title'], $r['link']);
}
// Response (excerpt):
// {
// "search_information": {"query_displayed": "web scraping api",
// "organic_results_state": "Results for exact spelling"},
// "organic_results": [
// {"position": 1, "title": "...", "link": "https://...", "domain": "...",
// "displayed_link": "...", "snippet": "..."},
// ...
// ],
// "pagination": {"current": 1, "next": 2}
// }
//
// position restarts at 1 on every page:
// absolute rank = (page - 1) * 10 + position
# gem install webscraping_ai
# https://rubygems.org/gems/webscraping_ai
require 'webscraping_ai'
client = WebScrapingAI::Client.new(api_key: 'YOUR_API_KEY')
results = client.serp(q: 'web scraping api', gl: 'us', hl: 'en', page: 1)
results['organic_results'].each do |r|
puts "#{r['position']}. #{r['title']} — #{r['link']}"
end
# Response (excerpt):
# {
# "search_information": {"query_displayed": "web scraping api",
# "organic_results_state": "Results for exact spelling"},
# "organic_results": [
# {"position": 1, "title": "...", "link": "https://...", "domain": "...",
# "displayed_link": "...", "snippet": "..."},
# ...
# ],
# "pagination": {"current": 1, "next": 2}
# }
#
# position restarts at 1 on every page:
# absolute rank = (page - 1) * 10 + position
// 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"})
page := 1
serp, _ := client.Serp(context.Background(), &webscrapingai.SerpOptions{
Q: "web scraping api",
GL: "us",
HL: "en",
Page: &page,
})
for _, r := range serp.OrganicResults {
fmt.Println(r.Position, r.Title, r.Link)
}
}
// Response (excerpt):
// {
// "search_information": {"query_displayed": "web scraping api",
// "organic_results_state": "Results for exact spelling"},
// "organic_results": [
// {"position": 1, "title": "...", "link": "https://...", "domain": "...",
// "displayed_link": "...", "snippet": "..."},
// ...
// ],
// "pagination": {"current": 1, "next": 2}
// }
//
// position restarts at 1 on every page:
// absolute rank = (page - 1) * 10 + position
// Maven: ai.webscraping:webscraping-ai:4.1.0
// https://central.sonatype.com/artifact/ai.webscraping/webscraping-ai
import ai.webscraping.Client;
import ai.webscraping.Config;
import ai.webscraping.option.SerpOptions;
import ai.webscraping.result.SerpResult;
Client client = new Client(Config.builder().apiKey("YOUR_API_KEY").build());
SerpResult serp = client.serp(SerpOptions.builder()
.q("web scraping api")
.gl("us")
.hl("en")
.page(1)
.build());
for (SerpResult.OrganicResult r : serp.getOrganicResults()) {
System.out.println(r.getPosition() + ". " + r.getTitle() + " — " + r.getLink());
}
// Response (excerpt):
// {
// "search_information": {"query_displayed": "web scraping api",
// "organic_results_state": "Results for exact spelling"},
// "organic_results": [
// {"position": 1, "title": "...", "link": "https://...", "domain": "...",
// "displayed_link": "...", "snippet": "..."},
// ...
// ],
// "pagination": {"current": 1, "next": 2}
// }
//
// position restarts at 1 on every page:
// absolute rank = (page - 1) * 10 + position
// dotnet add package WebScrapingAI
// https://www.nuget.org/packages/WebScrapingAI
using WebScrapingAI;
var client = new WebScrapingAIClient(new WebScrapingAIClientOptions { ApiKey = "YOUR_API_KEY" });
var serp = await client.SerpAsync(new SerpRequest {
Q = "web scraping api",
Gl = "us",
Hl = "en",
Page = 1,
});
foreach (var r in serp.OrganicResults) {
Console.WriteLine($"{r.Position}. {r.Title} — {r.Link}");
}
// Response (excerpt):
// {
// "search_information": {"query_displayed": "web scraping api",
// "organic_results_state": "Results for exact spelling"},
// "organic_results": [
// {"position": 1, "title": "...", "link": "https://...", "domain": "...",
// "displayed_link": "...", "snippet": "..."},
// ...
// ],
// "pagination": {"current": 1, "next": 2}
// }
//
// position restarts at 1 on every page:
// absolute rank = (page - 1) * 10 + position
Need People Also Ask or featured snippets? Point /ai/question or /ai/fields at the Google results URL with proxy=residential and js=true (Google requires both; 30 credits per page) and describe what you want back.
Parsed positions for any keyword, country, and language via /serp
Track when you win or lose featured snippets (AI extraction)
Scrape the pages that outrank you with /html, /text, or AI extraction
Detect new domains entering your keyword space
More SEO and marketing solutions
Get started with 2,000 free API credits. No credit card required.