keyword, engine, market, alert

SERP tracking API that pings your code when your rank moves

Give it a keyword, an engine and a market. Verid checks on your schedule and sends an HMAC-signed webhook when your rank moves past your threshold. From $14/mo.

Start a 14-day free trial, then pick a + SERP plan from $14/mo.

  • 5 search engines
  • No selectors to write
  • HMAC-signed webhooks
A board shows page one of Google results in the US for the keyword best invoicing software, checked hourly. Eight result tiles stand in rank order, and the tracked domain, invoicing.example, sits at rank 3 with an amber edge. On the first check nothing moves and the run stays quiet. On the second, two other results swap places at ranks 5 and 6, but the tracked domain is still at rank 3, so the run stays quiet again. On the third check the tracked tile drops to rank 7 as four results move up past it. The readout shows target_rank 7, was 3, and a rank_delta of plus 4; a needle on the rank_change_threshold scale crosses the line at 3 and the run fires. ai_overview_present reads true and is marked recorded, because Verid stores that field on every run but does not alert on it. A notification slides down onto the top of the board: webhook delivered, best invoicing software moved from rank 3 to 7, POST to /hooks/serp with a rank_delta of 4 answered 200.

At a glance

SERP tracking API at a glance

A SERP tracking API watches a search results page on a schedule and reports what changed on it. Verid runs it as a monitor: a keyword, an engine and a market go in, a signed rank event comes out, with no selector to maintain.

What it is
A rank monitor per keyword
A keyword, an engine and a market go in. A signed rank event comes out, with no selector to maintain.
Input
Keyword, engine, market
One of five engines, a two-letter location_code and language_code, and a target_domain when you are tracking one site.
What every run stores
Page 1, plus your rank
The page-1 organic results, target_rank, rank_delta, and whether an AI Overview or featured snippet was on the page.
When it alerts
rank_change_threshold
When your rank moves at least that many positions, or your domain enters or leaves the results. Leave it unset and the monitor records every run and stays quiet.
SERP Analysis mode
Full page-1 as JSON
Same monitor, mode: "full_analysis" instead of the default rank_tracking. No target domain - every run returns the full page-1 result list as JSON, a delivery fires when anything in it changes, and the dashboard diffs it against the previous run.
Engines
5
Google, Bing, Yahoo, DuckDuckGo and Yandex.
Fastest check
Every 10 minutes
On every + SERP plan and the free trial. Each check uses one run per result page from the plan's monthly runs.
Scale
Unlimited monitors
One monitor per keyword per market. Runs per month set the volume.
Delivery
Signed and retried
Webhook, Slack, Discord or email. Six attempts over about four hours, then a dead-letter queue you can replay from.

See + SERP pricing →

How it works

How the SERP monitor runs, from keyword to webhook

Five steps on every check. You configure the first. You only hear about the last.

  1. Pin a keyword, an engine and a market

    Pick one of five engines, set location_code and language_code, and add target_domain if you are tracking one site. No search URL to build, no selector to write.

    takesa keyword and a market

    target: keyword + market

    givesa configured SERP monitor

  2. Verid runs the search in a real browser

    Checks on one engine are paced across every monitor, so one refused check does not take the engine offline for everyone. A block page is recorded as blocked, never stored as results, and a blocked Google check falls back to a paid provider.

    takesa configured SERP monitor

    render: real browser

    givesthe rendered results page

  3. Read page 1

    Each engine has its own parser. It reads the page-1 organic results, finds your target_domain among them, and records whether an AI Overview or a featured snippet is showing.

    takesthe rendered results page

    extract: target_rank

    givesthis run’s rank and the page-1 list

  4. Compare with the last run

    rank_delta is this run’s position against the monitor’s previous run, so a new monitor’s first rank_delta is null.

    takesthis run’s rank and the page-1 list

    compare: rank_delta

    givesrank_delta, or an entered/left event

  5. Decide whether to wake anyone

    A delivery fires when the rank moves by at least your rank_change_threshold, or when your domain enters or leaves the results. Leave the threshold unset and the monitor records every run and stays quiet.

    takesrank_delta, or an entered/left event

    gate: rank_change_threshold

    givesa signed webhook, or a quiet run

Delivery, retries and replay →

The request and the event

One request in, one signed rank event out

The request on the left creates the monitor: a keyword, an engine, a market and a threshold, with no URL and no selector. The payload on the right is what your endpoint receives on the run where the rank moved past that threshold.

POST/v1/serp-monitors
curl -X POST https://api.verid.dev/v1/serp-monitors \
  -H "Authorization: Bearer $VERID_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "SERP / best invoicing software / US",
    "keyword": "best invoicing software",
    "engine": "google",
    "target_domain": "yoursite.com",
    "location_code": "us",
    "language_code": "en",
    "schedule_interval_seconds": 3600,
    "rank_change_threshold": 3,
    "deliveries": [
      { "type": "webhook", "url": "https://api.yourapp.com/hooks/serp" },
      { "type": "slack",   "webhookUrl": "https://hooks.slack.com/services/..." }
    ]
  }'
POSThttps://api.yourapp.com/hooks/serp
{
  "id": "d_2h8Kq...",
  "version": "2026-05-01",
  "monitor_id": "9f3c...",
  "run_id": "r_71ba...",
  "fired_at": "2026-08-11T09:14:02.418Z",
  "diff": {
    "fields_changed": [],
    "before": {},
    "after": {}
  },
  "serp": {
    "keyword": "best invoicing software",
    "target_domain": "yoursite.com",
    "rank": 7,
    "previous_rank": 3,
    "rank_delta": 4
  },
  "monitor": {
    "name": "SERP / best invoicing software / US",
    "url":  "https://www.google.com/search?q=best+invoicing+software..."
  }
}
Verid-Signature: t=1785063304,v1=5257a869e7f0d8c1...

The rank dropped from 3 to 7, past a threshold of 3, so this run fired. An hourly schedule like this one needs Scale + SERP.

Read the serp block, not diff. diff.fields_changed is always empty on a SERP delivery, because there are no fields you named. The change lives in the serp block, as rank, previous_rank and rank_delta.

Verify before you trust it. Every delivery is signed with HMAC-SHA256 in a Verid-Signature header, in the same format Stripe uses. Fetch the secret once from GET /v1/serp-monitors/{id}/signing-secret and keep it out of your logs.

Failures are not dropped. A delivery is retried six times across roughly two hours, then parked in the dead letter queue for a manual replay. Field reference and the verification snippets are in the SERP tracking docs.

Page 1 is in every run. A run stores the full page-1 organic list, so the monitor that tells you your rank moved can also tell you who moved above you. It is history you read, not a second alert.

SERP Analysis mode: the full page-1 result list

Same endpoint, same monitor - set mode to full_analysis and drop target_domain and rank_change_threshold. Instead of one domain’s rank, every run returns the full page-1 result list (domain, title, description, rank for each item), and a delivery only fires when that list actually changes between checks.

POST/v1/serp-monitors
curl -X POST https://api.verid.dev/v1/serp-monitors \
  -H "Authorization: Bearer vrd_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "SERP analysis / best invoicing software / US",
    "keyword": "best invoicing software",
    "mode": "full_analysis",
    "engine": "google",
    "location_code": "us",
    "language_code": "en",
    "schedule_interval_seconds": 21600,
    "deliveries": [
      { "type": "webhook", "url": "https://api.yourapp.com/hooks/serp-analysis" }
    ]
  }'
POSThttps://api.yourapp.com/hooks/serp-analysis
{
  "id": "d_2h8Kq...",
  "version": "2026-05-01",
  "monitor_id": "9f3c...",
  "run_id": "r_71ba...",
  "fired_at": "2026-08-11T09:14:02.418Z",
  "diff": {
    "fields_changed": [],
    "before": {},
    "after": {}
  },
  "serp_analysis": {
    "keyword": "best invoicing software",
    "results": [
      { "rank": 1, "title": "Best invoicing software of 2026", "description": "Compare the top invoicing tools side by side.", "domain": "https://www.capterra.com/" },
      { "rank": 2, "title": "Top-rated invoicing software - G2", "description": "Real user reviews for every invoicing platform.", "domain": "https://www.g2.com/" }
    ],
    "previous_results": [
      { "rank": 1, "title": "Top-rated invoicing software - G2", "description": "Real user reviews for every invoicing platform.", "domain": "https://www.g2.com/" },
      { "rank": 2, "title": "Best invoicing software of 2026", "description": "Compare the top invoicing tools side by side.", "domain": "https://www.capterra.com/" }
    ]
  },
  "monitor": {
    "name": "SERP analysis / best invoicing software / US",
    "url":  "https://www.google.com/search?q=best+invoicing+software..."
  }
}
Verid-Signature: t=1785063304,v1=5257a869e7f0d8c1...

The advanced method's request and payload

GET /v1/serp-monitors/{id}/runs returns every check, whether or not it fired. organic_results carries page 1 with each result’s position, title, URL and domain.

GET/v1/serp-monitors/{id}/runs
{
  "id": "71ba4c0e-...",
  "serp_monitor_id": "9f3c2d1a-...",
  "status": "success",
  "started_at": "2026-08-11T09:14:00.102Z",
  "completed_at": "2026-08-11T09:14:02.391Z",
  "organic_results": [
    { "position": 1, "title": "Best invoicing software of 2026", "url": "https://www.capterra.com/invoicing-software/", "domain": "capterra.com", "description": "Compare the top invoicing tools side by side." },
    { "position": 2, "title": "Top-rated invoicing software - G2", "url": "https://www.g2.com/categories/invoicing", "domain": "g2.com", "description": "Real user reviews for every invoicing platform." }
  ],
  "target_rank": 7,
  "rank_delta": 4,
  "ai_overview_present": true,
  "featured_snippet_present": false,
  "delivery_triggered": true,
  "duration_ms": 2289,
  "error_message": null
}

Two of the page-1 results shown. The Node.js SDK exposes the same resource as client.serpMonitors.

Five engines

Five search engines, one monitor type

Google rank tracking, Bing rank tracking and a Yahoo rank tracker are the same request with one field changed.

The five search engines a Verid SERP monitor supports, whether each engine's results parser is verified against live results pages, and what happens when a check is blocked
EngineResults parserIf the check is blocked
googleVerified against live results pagesFalls back to a paid provider and completes the run
bingVerified against live results pagesRecorded as a failed check
yahooShips, not yet verifiedRecorded as a failed check
duckduckgoShips, not yet verifiedRecorded as a failed check
yandexShips, not yet verifiedRecorded as a failed check

An unreadable page returns no rank, never a false alert. After 10 failed checks in a row, a monitor pauses itself and emails you.

SERP alerts

Alerts for the rank moves a daily report misses

A daily tracker stores one number a day. This pushes an event on the run where the move happens.

1 hr
fastest check, Scale + SERP
+4

Your rank crosses the threshold

A query can sit at 4 all week, spend a few hours at 11 during an update and recover before a nightly crawl. An hourly monitor catches it and sends rank, previous_rank and rank_delta.

when
rank_change_threshold: 3
Out

Your domain enters or leaves the results

Slipping off page 1 is not a four-place move to your traffic. It is gone. Entering or leaving the results fires even when the move is smaller than your threshold, as long as a threshold is set.

when
any threshold set
−4

Your rank recovers

The threshold is an absolute distance, so a climb of four fires exactly as a fall of four does. That is the run where you find out the fix shipped, rather than reading it in a report on Monday.

when
same threshold, both directions
Now

You want a check before the schedule

POST /v1/serp-monitors/{id}/run queues an immediate check. There is no daily cap on manual runs; each one uses runs from your monthly pool like a scheduled check.

when
manual run

AI Overview and featured snippet tracking

AI Overview tracking on the SERP monitor means presence: ai_overview_present and featured_snippet_present are recorded on every run, so the run history shows the day an AI Overview arrived, ready to line up against the day your clicks dipped. They are recorded, not alert triggers. To get a webhook when the Overview’s text or cited sources change, use the selector method below.

Why rankings drop without warning →

+ SERP plans

SERP tracking API pricing by plan

A + SERP plan replaces your base plan rather than adding to it, and keeps every base-plan limit. Lite + SERP is $14 a month in total, not $9 plus $14.

Verid's + SERP plans with their monthly price, runs per month, how many keywords those runs check daily, delivery endpoints per monitor and run history retention
PlanPer monthRuns a monthKeywords checked daily (page 1)Delivery endpoints per monitorRun history
Lite + SERPentry point$141,00033290 days
Starter + SERP$295,0001663180 days
Pro + SERP$7415,00050010365 days
Scale + SERP$224100,0003,333252 years

Price your keyword list before you sign up

One monitor is one keyword in one market, and each check uses one run per result page. 20 keywords across 5 markets is 100 monitors: checked daily on page one that is 3,000 runs a month, which fits Starter + SERP at $29. Checked every 6 hours it is 12,000, which fits Pro + SERP at $74. Tracking the top 30 (3 pages) triples the runs.

The 14-day free trial from signup includes 100 SERP runs, no card required. After it ends, ordinary monitors on any plan from Lite at $9 a month can still watch a search URL with your own selectors, using the method below.

Beyond rank

Need more than rank? Use the selector method

Everything above is the SERP monitor. For SERP feature tracking beyond presence (the text of an AI Overview, the sources it cites, People Also Ask questions, a city-level result), point an ordinary change-detection monitor at a Google results URL you build. You name each field, the diff reports those names, and any of the nine diff predicates can gate the alert.

It runs on ordinary monitor plans from Lite at $9, and during the free trial. There is no engine picker or built-in rank field, and the prompt method counts against your monthly LLM extractions.

The full worked example, with selectors and payloads →
All six extraction methods →

Honest comparison

Compared with rank trackers, SERP APIs and Search Console

Four tools that all tell you where you rank, and answer different questions. Read the row that matters to you.

Verid's SERP tracking API compared with rank tracking tools, SERP scraping APIs and Google Search Console
CriterionVerid SERP tracking APIRank trackersSERP scraping APIsSearch Console
What you receiveA signed webhook with rank, previous rank and rank_delta, plus a rank chart in the dashboardA dashboard and position historyA parsed results page per callClicks, impressions and average position
FreshnessAs often as every 10 minutes, on every + SERP planUsually dailyWhenever you callHourly preliminary data in the 24-hour view
AlertingPushed when your threshold is crossedEmail or in-app, usually after the daily crawlNone, you build itNone for ranking movement
PositionThe position this check sawThe position their crawler saw that dayThe position in the response you paid forAn average across searches
Keyword research dataNo, bring your listUsuallySome, through separate endpointsOnly queries you already appear for
Cost model+ SERP plans from $14/mo, 14-day free trialPer tracked keyword per monthPer request or creditFree

You already pay for a rank tracker

Keep it for reporting and keyword research. Add monitors on the queries where a same-day reaction is worth money, and let the tracker cover the rest.

You already call a SERP API

You are paying per call and writing the scheduler, storage, diff and alerting yourself. That loop is what this replaces. Keep the SERP API for one-off lookups.

You watch Search Console

It reports what happened to clicks and averages position across searches. It cannot push your code this morning’s rank move.

Why the loop is the product →

Where it stops

What this SERP tracking API does not do

Better you read these here than find them in week one.

[01]

SERP tracking is free for 14 days, then paid

Every account gets a 14-day free trial with 100 SERP runs. After that, Lite + SERP at $14 a month is the entry point, or the selector method runs on any ordinary plan from Lite at $9.

[02]

Country and language, not city

location_code and language_code are two-letter codes. A city-level result needs the selector method, where the location goes into the search URL. Rank tracking and location monitoring are different measurements.

[03]

Desktop results only

device accepts mobile, but every check runs as desktop today. Do not use it for a mobile rank.

[04]

A fallback for Google only

A blocked Bing, Yahoo, DuckDuckGo or Yandex check is a failed run, not a retried one.

[05]

No keyword volume or difficulty

Bring your keyword list. Nothing is backfilled, so history starts at the monitor’s first run.

[06]

No one-off lookups

Every check belongs to a monitor. For ad-hoc queries, a pay-per-call SERP API is the better tool.

[07]

The engine’s terms are yours to weigh

A monitor checks the engine you picked on the schedule you set, and a 10 minute minimum interval is not a legal opinion. Read the legal ground first.

see alsoREST API referencedelivery and retriesthe worked SERP example+ SERP pricing

SERP tracking API questions

The ten things SEO and growth engineers ask before the first monitor, answered with the numbers the product enforces.

What is a SERP tracking API?

A SERP tracking API, sometimes called a SERP tracker API, checks a search results page for a keyword on a schedule and reports what changed. Verid’s reads your rank on each check, compares it with the last one, and sends a signed webhook when it moves past your threshold.

Is this a rank tracking API or a SERP scraping API?

It is a rank tracker API. Every check belongs to a monitor with a schedule and a history, and each run also stores the full page-1 organic list alongside your rank. There is no endpoint for a one-off lookup of a keyword you are not tracking, which is the job of a SERP scraping API.

Can I pull keyword ranking data out through the API?

Yes. GET /v1/serp-monitors/{id}/runs returns every run with target_rank, rank_delta and the full page-1 organic results, and the dashboard charts target_rank over time. The Node.js SDK exposes the same resource as client.serpMonitors.

Can I see where competitors rank?

Yes, in the run history rather than as an alert. Every run stores the page-1 organic list with each result’s position, title, URL and domain, so you can read who moved above you on the check where your rank moved. A delivery still fires on your own rank, not on a competitor’s. Pair it with the competitor monitoring API to catch the landing page rewrite behind a competitor’s climb.

Which search engines does it check?

Five: Google, Bing, Yahoo, DuckDuckGo and Yandex. Google and Bing parsers are verified against live results pages; the other three ship but are not yet verified. Only Google has a fallback provider when a check is blocked.

Does it alert me when an AI Overview appears?

No. ai_overview_present is recorded on every run and shows in the run history, but only rank moves and entering or leaving the results fire a delivery. For a webhook on the Overview itself, extract its container with the selector method and gate it with a field_changes predicate.

How much does SERP tracking cost, and is + SERP an add-on?

+ SERP plans cost $14, $29, $74 or $224 a month, and each one replaces your base plan instead of adding to it. They include 1,000, 5,000, 15,000 or 100,000 runs a month, shared with your other monitors, and unlimited SERP monitors. A SERP check uses one run per result page, so one keyword on page one checked daily is 30 runs a month.

What happens if my endpoint is down when a rank moves?

The delivery is attempted six times: immediately, then after 5 minutes, 15 minutes, 30 minutes, 1 hour and 2 hours. If all six fail, it lands in the dead-letter queue, where you can replay it once your endpoint is back.

Is there a free way to track SERP changes?

Yes, for 14 days. Every new account gets a SERP tracking trial with 100 SERP runs, enough to check seven keywords on page one once a day for the whole trial. After that the SERP monitor starts at Lite + SERP for $14 a month, or ordinary monitors on any plan from Lite at $9 a month can watch a Google results URL with your own selectors.

Can agencies use it as a white-label SERP tracking API?

Yes, through the API rather than a rebranded dashboard. The payload carries your monitor name and the rank data with no Verid branding in it, so you create monitors per client and render reports in your own product.

Start tracking

+ SERP plans start at $14/mo with unlimited monitors across five engines, after a 14-day free trial. Point the first one at the query that pays your bills.