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
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.
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.
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 + marketgivesa configured SERP monitor
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 browsergivesthe rendered results page
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_rankgivesthis run’s rank and the page-1 list
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_deltagivesrank_delta, or an entered/left event
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_thresholdgivesa signed webhook, or a quiet run
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.
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/..." }
]
}'{
"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..."
}
}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.
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" }
]
}'{
"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..."
}
}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.
{
"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.
| Engine | Results parser | If the check is blocked |
|---|---|---|
| Verified against live results pages | Falls back to a paid provider and completes the run | |
| bing | Verified against live results pages | Recorded as a failed check |
| yahoo | Ships, not yet verified | Recorded as a failed check |
| duckduckgo | Ships, not yet verified | Recorded as a failed check |
| yandex | Ships, not yet verified | Recorded 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.
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
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
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
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.
+ 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.
| Plan | Per month | Runs a month | Keywords checked daily (page 1) | Delivery endpoints per monitor | Run history |
|---|---|---|---|---|---|
| Lite + SERPentry point | $14 | 1,000 | 33 | 2 | 90 days |
| Starter + SERP | $29 | 5,000 | 166 | 3 | 180 days |
| Pro + SERP | $74 | 15,000 | 500 | 10 | 365 days |
| Scale + SERP | $224 | 100,000 | 3,333 | 25 | 2 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 →
- ai_overviewxpaththe Overview’s text, empty until one appears
- featured_snippetxpaththe snippet that answers above the results
- top_result_urlxpathwho holds position one
- my_rankregexyour position as a number a threshold can read
- blocks_abovepromptthe blocks above your listing, in order
- paacssthe People Also Ask questions
The keys are yours, and the diff names them. Each row links to its method guide.
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.
| Criterion | Verid SERP tracking API | Rank trackers | SERP scraping APIs | Search Console |
|---|---|---|---|---|
| What you receive | A signed webhook with rank, previous rank and rank_delta, plus a rank chart in the dashboard | A dashboard and position history | A parsed results page per call | Clicks, impressions and average position |
| Freshness | As often as every 10 minutes, on every + SERP plan | Usually daily | Whenever you call | Hourly preliminary data in the 24-hour view |
| Alerting | Pushed when your threshold is crossed | Email or in-app, usually after the daily crawl | None, you build it | None for ranking movement |
| Position | The position this check saw | The position their crawler saw that day | The position in the response you paid for | An average across searches |
| Keyword research data | No, bring your list | Usually | Some, through separate endpoints | Only queries you already appear for |
| Cost model | + SERP plans from $14/mo, 14-day free trial | Per tracked keyword per month | Per request or credit | Free |
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.
Where it stops
What this SERP tracking API does not do
Better you read these here than find them in week one.
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.
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.
Desktop results only
device accepts mobile, but every check runs as desktop today. Do not use it for a mobile rank.
A fallback for Google only
A blocked Bing, Yahoo, DuckDuckGo or Yandex check is a failed run, not a retried one.
No keyword volume or difficulty
Bring your keyword list. Nothing is backfilled, so history starts at the monitor’s first run.
No one-off lookups
Every check belongs to a monitor. For ad-hoc queries, a pay-per-call SERP API is the better tool.
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.