SEO & MARKETING

SERP Monitoring for SEO Success

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 rankings ladder with positions changing

Rankings Change Constantly

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.

WebScraping.AI Solution

  • Parsed Google Results: /serp returns organic_results with position, title, link, and domain — 15 credits per search
  • Local Rankings: Set gl and hl for the country and language you track; use page to go past the top 10
  • AI Extraction: Ask for SERP features /serp doesn't parse, like People Also Ask boxes, in plain language
  • Custom Frequency: Re-check rankings as often as you need

See the Google SERP API page for the full response format and pricing.

SERP Monitoring Features

Comprehensive search visibility tracking

Position Tracking

Store position from each organic result and chart your rankings for target keywords over time.

SERP Features

Use AI extraction on the results page for featured snippets, People Also Ask, and other features.

Competitor View

Group results by domain to see which competitors rank for your keywords.

Local & Global

Track rankings by country and language with the gl and hl parameters.

Code Examples

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.

Benefits for SEO Teams

Track Progress: See how your SEO efforts impact rankings over time.
Spot Opportunities: Identify keywords where you're close to page one.
Monitor Drops: Get alerted when rankings fall significantly.
Competitor Intel: Know who's outranking you and for what.
SERP Feature Tracking: Monitor featured snippet wins and losses with AI extraction.

What You Can Track

Organic Rankings

Parsed positions for any keyword, country, and language via /serp

Featured Snippets

Track when you win or lose featured snippets (AI extraction)

Ranking Pages

Scrape the pages that outrank you with /html, /text, or AI extraction

SERP Changes

Detect new domains entering your keyword space

Related Use Cases

More SEO and marketing solutions

Start Monitoring Your Rankings

Get started with 2,000 free API credits. No credit card required.

Icon