Rank tracking

How to Track Google Rankings in Bulk for Thousands of Keywords

How to track rankings in bulk for thousands of keywords by city and device: a keyword list with location codes, nightly async jobs, storage, and reports.

Rank tracking tools charge by the keyword. At 500 keywords that is fine. At 10,000 keywords across 30 cities it is a five-figure yearly bill for daily checks you may not need. And you still cannot get the report you want.

A rank tracker API flips the model. You pay per check, you choose the schedule, and the data lands in your own table. This guide shows how to set that up, step by step, using Serplify’s API as the example. The same shape works with any SERP API.

What each rank check returns

Each check fetches the Google results page for a keyword in a location on a device, and tells you where a domain sits on it. Two numbers matter:

  • Organic rank (rank_group in most APIs): your place among the normal results.
  • Absolute position (rank_absolute): your place counting every block on the page, including AI Overviews, ads, and map packs.

In our September 2026 sample of 200 US result pages, the first organic result held the very first spot on only 14.5 percent of pages. Reporting both numbers is how you explain why clicks and rank do not move together. If you are new to that distinction, start with the basics of checking your rank.

Step 1: Build the keyword list with locations and devices

Start a table with one row per thing you want to track. Not one row per keyword. One row per keyword, location, and device.

keywordlocation_codedevicetargetlabel
emergency plumber1023191mobileacmeplumbing.comnyc
emergency plumber1014221mobileacmeplumbing.comchicago
plumber near me1023191mobileacmeplumbing.comnyc

Add one more column for the topic or page each keyword belongs to, so you can report by group. Keywords that share most of their top results belong together. Our guide on how to cluster keywords shows how to find those groups.

Location codes are Google’s own IDs for countries, regions, and cities. 2840 is the United States. 1023191 is New York. You can pull the list from the API for free:

curl "https://api.serplify.io/v1/locations?country=US&limit=5000" \
  -H "Authorization: Bearer live_your_key_here"

Use the most specific code your customers match. A city code for local services. A country code for national brands. The difference is large for anything local, which we cover in how to check local rankings.

Device matters as much as location. Mobile and desktop pages differ in blocks and order, as our mobile vs desktop sample shows. Track the device your customers use, or both.

Step 2: Pick a schedule

More checks cost more and show more noise. A good default:

Keyword groupFrequency
Top revenue keywords, 50 to 200Daily
Everything elseWeekly
During a confirmed Google updateDaily for the week

Rankings wobble by a position or two every day. Weekly checks smooth that out. Daily checks are for the keywords where you would act on a change.

Step 3: Send async requests, not live ones

A live request waits for the page. It is fine for one keyword in a dashboard. For a batch of 10,000 it ties up connections and hits timeouts.

An async request drops a task in a queue and returns at once. You collect results later, by polling or by webhook. Same price on Serplify, no waiting. If this is your first call to the API, walk through your first SERP API request, step by step before you script a batch.

Here is one task. The track block tells the API which domain to find and how to label the check:

curl -X POST https://api.serplify.io/v1/serp/tasks \
  -H "Authorization: Bearer live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "keyword": "emergency plumber",
    "location": { "code": 1023191 },
    "language": { "code": "en" },
    "device": "mobile",
    "depth": 100,
    "track": { "target": "acmeplumbing.com", "label": "nyc" },
    "webhook": { "result_url": "https://you.example.com/hooks/serplify?id=$id" }
  }'

The API answers with a task ID right away. When the page is fetched, it posts the full result to your webhook, or you fetch it from /v1/serp/tasks/{id}. Fetching a result is free.

A nightly job in any language loops over the table and sends one task per row. In Python that is about twenty lines with requests.

Step 4: Read the result

Each result carries the whole page plus a small block with the answer:

"tracked_rank": {
  "target": "acmeplumbing.com",
  "rank_absolute": 6,
  "rank_group": 3,
  "url": "https://acmeplumbing.com/emergency",
  "found": true
}

That says the site is organic rank 3 and the sixth block on the page. When the domain is not in the top 100, found is false and the ranks are null. Store that too. A gap in the history is information.

Also store feature_types from the result. It lists every block on the page, like ["local_pack", "organic", "people_also_ask", "ai_overview"]. Next month, when a keyword’s clicks fall and its rank did not, this column tells you what arrived above you.

Step 5: Store it

You do not need a big system. One table with these columns covers most reporting:

columnexample
checked_at2026-09-06T02:10:00Z
keywordemergency plumber
location_code1023191
devicemobile
targetacmeplumbing.com
rank_group3
rank_absolute6
urlhttps://acmeplumbing.com/emergency
feature_typeslocal_pack, organic, people_also_ask
first_organic_position4

Serplify also keeps its own history for every tracked request. GET /v1/serp/track?keyword=...&target=... returns the snapshots, newest first, at no charge. A spreadsheet or a small script can chart a trend from that without a database at all.

Step 6: Report the two numbers, and the features

A useful weekly report has three columns per keyword: organic rank, absolute position, and a flag when a new feature appeared above you. Add a seven-day average so daily noise does not drive decisions.

Then compare against clicks in Google Search Console. When rank held and clicks fell, look at the feature column. When rank fell across a group of keywords for more than a week, check for a Google update before you change anything.

For one number per group, turn ranks into estimated clicks and compare them with your competitors’ clicks. Our guide on how to calculate SEO share of voice shows the formula and a worked example.

What it costs

Serplify charges $0.005 per successful SERP, up to 100 results, with every feature parsed. Failed live requests are free. Async tasks are charged when they are queued. History reads are free.

SetupChecks per monthCost per month
1,000 keywords, weekly4,300about $22
1,000 keywords, daily30,000$150
10,000 keywords, weekly43,000about $215
10,000 keywords, daily300,000$1,500
10,000 keywords, 5 cities, weekly215,000about $1,075

Compare that with tool pricing, where 10,000 daily-checked keywords runs into thousands of dollars a month. We lay the tool prices side by side in how much a rank tracker costs. The break-even is usually a few thousand keywords, or any setup with many cities.

Tracking the local pack

Local businesses live or die by the map pack. It comes back as separate local_pack items, each with the business title, rating, and Google’s place ID (cid). Match on the title or the ID, record the pack position, and request a city-level or even neighborhood-level location code. Packs differ from one side of a city to the other.

Tracking SERP features, not just yourself

Once you store feature_types for every check, you have a SERP feature tracker for free. Filter for keywords where people_also_ask is present and you are not in it. Filter for keywords where ai_overview appeared this month and was absent last month. Our guide on finding SERP feature opportunities turns that data into a plan.

Mistakes that waste money

  • Depth 100 on everything. If you only ever act on top-20 changes, request depth 20 on the weekly list and 100 on the keywords you are trying to move. Serplify charges the same either way, but on per-page providers this is the difference between $0.002 and $0.02 per check.
  • Live calls in a batch. Use async. Same data, no timeouts.
  • One country code for a local business. Use the city.
  • Checking daily and reading daily. Check daily if you like, but report weekly averages.
  • Storing only the rank. Store the URL that ranked and the feature list. Both explain changes that rank alone cannot.

Frequently asked questions

What is a bulk rank checker?

It is a tool or script that checks Google rankings for a long list of keywords at once, instead of one search at a time. Most are built on an API that fetches the results page for each keyword, location, and device. Some APIs, like Serplify, also accept a target domain, return its rank directly, and keep a history you can query.

How many keywords can I track with an API?

As many as you can pay for. There is no plan cap. Each keyword, location, and device combination is one request per check. 10,000 keywords on two devices checked daily is 20,000 requests a day.

Is an API cheaper than a rank tracking tool for bulk tracking?

Usually, once you pass a few thousand keywords or need many cities. Tools charge per keyword slot per month, whether you check daily or not. An API charges per check, so weekly checks on 10,000 keywords can cost less than a 2,000-keyword tool plan. You do need a little code and somewhere to store results.

How accurate is API-based rank tracking?

As accurate as the location and device you request. A request for mobile results in Denver returns the page a mobile searcher in Denver sees, with no personalization. That is more consistent than checking by hand, and the same method commercial rank trackers use under the hood.

Can I track local map pack rankings with an API?

Yes. The local pack comes back as separate items with the business name, rating, and Google's place ID. Match on your business name or place ID to record your map rank, and request a city-level location code so the pack matches what local searchers see.

Sources and further reading

  1. Serplify docs: Rank tracking docs.serplify.io
  2. Serplify docs: Async tasks docs.serplify.io
  3. Serplify docs: Locations and languages docs.serplify.io
  4. Google Search Console Help: Performance report support.google.com

From the team that built it

Put this into practice with the SERP API.

Real-time Google SERP API with AI-ready JSON — 26+ SERP feature types, location and device targeting, 99.9% uptime — full live SERPs at a fraction of the going rate.

Start on the free balance — no card required.