Google Killed &num=100: Why Your Rank Tracker Costs 10× More (and the Fix)
For years, one tiny piece of a URL did a lot of quiet work. Add &num=100 to the end of a Google search and you got 100 results on a single page instead of 10. Every serious rank tracker, SEO crawler, and homemade Python script leaned on it.
On September 11, 2025, Google switched it off. No announcement, no blog post — the parameter just stopped doing anything. And the fallout was immediate: Search Console graphs cratered overnight, average-position numbers magically "improved", and the cost of tracking deep rankings roughly multiplied by ten.
If your reporting looks broken and you're not sure what's real, this guide explains exactly what happened, what's genuinely different, and the two ways to get the top 100 back.
TL;DR: &num=100 no longer works. Google caps you at 10 results per request. To see the top 100 you must paginate ten times — or send one call to a SERP API that paginates for you. Your real rankings didn't change; only the measurement did.
What &num=100 actually was
By default, Google shows 10 organic results per page. The num URL parameter let you ask for more. So google.com/search?q=running+shoes&num=100 returned the top 100 in one shot.
Humans almost never typed it. Tools did. If you wanted to know whether a site ranked at position 7 or position 73 for a keyword, one request with &num=100 told you. It was cheap, fast, and it was the backbone of how the whole industry measured "deep" rankings.
That's the important part: this was never a consumer feature. It was infrastructure for rank trackers, SEO platforms, and anyone scraping the SERP. Which is exactly why its removal hit tooling so hard and ordinary searchers not at all.
What changed on September 11, 2025
Google stopped honoring the parameter. You can still add &num=100 to a search URL today — it just gets ignored. You get 10 results back, every time.
There was no formal deprecation notice. When pressed, Google's Danny Sullivan described it as something that was never a guaranteed, supported feature, framing the move as part of keeping search simple and limiting automated abuse. In other words: it worked for years, but it was never promised, and now it's gone.
Here's the before-and-after in one view:
| Before Sept 11, 2025 | After Sept 11, 2025 | |
|---|---|---|
| Results per request | Up to 100 (&num=100) | 10 (parameter ignored) |
| Requests to read top 100 | 1 | 10 (paginate with start) |
| Bandwidth per "top 100" pull | ~1 page load | ~10 page loads |
| Deep impressions in GSC | Counted (incl. bots) | Mostly gone |
| Your real rankings | — | Unchanged |
Why your Search Console impressions fell off a cliff
This is the part that scared a lot of people. Around September 10–12, 2025, Search Console impressions for huge numbers of sites dropped sharply — sometimes 30–50% on desktop — with no algorithm update to blame.
The cause wasn't a penalty. It was the bots leaving.
When a rank tracker loaded 100 results for a keyword, Google logged an impression for every URL on that page — including yours sitting at position 80. Multiply that across thousands of tools checking millions of keywords every day and a big slice of "impressions" was never human at all. When &num=100 died, those deep bot impressions vanished.
The numbers back this up. According to Search Engine Land's analysis, around 77% of sites lost reported keyword visibility and roughly 87.7% saw impressions fall after the change. Here's how the core metrics shifted:
| Metric | What you saw | Why |
|---|---|---|
| Impressions | Sharp drop | Bot-driven deep impressions (positions ~11–100) disappeared |
| Average position | Looked better | Low-ranking impressions stopped dragging the average down |
| Clicks | Basically flat | Bots never clicked — real users were unaffected |
| Unique query count | Fell | Long-tail terms you only "ranked" for at position 90 dropped out |
So if your impressions fell but clicks held steady and average position improved, nothing is wrong with your site. Your reports just got more honest. The trap is comparing September-onward data to August as if it's the same yardstick — it isn't.
Why rank tracking just got 10× more expensive
Here's the quieter story that hit developers and SEO platforms harder than the GSC graphs.
Reading the top 100 used to be one request. Now it's ten. To collect positions 1–100 you have to walk through the pages one block at a time using the start parameter (start=0, start=10, start=20 … start=90). Ten page loads where there used to be one.
That multiplies almost everything that matters when you scrape at scale:
- Bandwidth: ~10× the data transferred per keyword.
- Proxy spend: roughly 10× the requests through your IP pool.
- Block risk: ten times the surface area to trip rate limits and CAPTCHAs.
- Time: ten sequential loads per keyword instead of one.
This is why several rank-tracking vendors quietly raised prices, throttled refresh frequency, or stopped tracking past the top 10 or top 20 by default in late 2025. The unit economics of "track the top 100 daily" changed overnight. If you run your own scraper, you felt it as a bigger proxy bill and more 3 a.m. breakages — the kind we dug into in why your SERP scraper breaks at 3 a.m.
You have two realistic ways out: paginate it yourself, or hand the pagination to an API. Let's do both.
Fix #1: paginate it yourself with start
If you maintain your own scraper, the mechanical fix is to loop through the start offsets and stitch the pages together. The logic looks like this:
import requests
from bs4 import BeautifulSoup
def fetch_page(query, start):
# NOTE: hitting Google directly like this gets blocked fast.
url = "https://www.google.com/search"
params = {"q": query, "start": start, "hl": "en"}
headers = {"User-Agent": "Mozilla/5.0 ..."}
return requests.get(url, params=params, headers=headers).text
def top_100(query):
results = []
for start in range(0, 100, 10): # 0, 10, 20 ... 90 -> 10 requests
html = fetch_page(query, start)
soup = BeautifulSoup(html, "html.parser")
for block in soup.select("div.g"): # selectors change often
link = block.select_one("a")
if link:
results.append(link["href"])
return results[:100]
It works — for about a day. Then reality arrives:
- Ten times the requests means ten times faster to a CAPTCHA or a 429.
- Google renders results with JavaScript, so a plain
requests.getoften returns a near-empty shell. You end up needing a headless browser. - The HTML selectors drift (
div.gand friends change), so your parser breaks without warning. - You need a residential proxy pool and rotation logic, or your server IP gets blocked.
None of that is impossible — it's just an ongoing maintenance tax that got 10× heavier the day &num=100 died. We compared this build-vs-buy math in detail in Google Search API vs scraping.
Fix #2: one API call that still returns the top 100
The other option is to stop caring about pagination entirely. A SERP API does the ten page loads for you and hands back a clean list. With the Serpent Google SERP API, you ask for the depth you want and get structured JSON:
import requests
resp = requests.get(
"https://api.apiserpent.com/api/search",
headers={"X-API-Key": "sk_live_your_key"},
params={
"q": "best running shoes",
"engine": "google",
"country": "us",
"num": 100, # ask for the full top 100
},
)
data = resp.json()
for r in data["results"]["organic"]:
print(r["position"], r["url"])
One request in, up to 100 ranked results out — with positions, titles, URLs, snippets, plus SERP features like People Also Ask, featured snippets, and AI Overview sources in the same payload. No proxy pool, no browser fleet, no selectors to babysit.
The cost angle is the part that matters most for this specific change. Because Serpent uses flat per-call pricing, page depth doesn't multiply the price — a 100-result deep search costs the same as a 10-result one. So the exact thing that just made DIY tracking 10× pricier (needing ten page loads for the top 100) doesn't inflate your bill here. Google SERP runs from $0.60 per 10,000 searches pay-as-you-go down to $0.03 per 10,000 at the Scale tier, with 10 free searches to start and no subscription. The full breakdown is on the pricing page.
Want the top 100 back in one line? The Serpent Google SERP API returns up to 100 organic results per call with depth that doesn't change the price. Grab 10 free searches →
If you'd rather see this wired into a working rank tracker, our 100-line Python rank tracker and the Python SERP rank tracker guide both use this exact endpoint, and international rank tracking across 40+ countries shows how to add the country dimension.
How to read your SEO reports now
The change is permanent, so the smart move is to adjust how you measure rather than wait for the old numbers to return. Five practical adjustments:
- Treat September 11, 2025 as a data boundary. Don't compare impressions across it as a like-for-like trend. Annotate the date in your dashboards.
- Trust clicks over impressions. Clicks barely moved, so they're now your cleanest signal of real demand. Impressions became more honest but smaller.
- Re-baseline average position. The "improvement" you saw in September is an artifact of bots leaving, not better rankings. Reset expectations from the new floor.
- Measure deep rankings deliberately. If you need positions past 10, pull them on purpose with a SERP API rather than hoping GSC surfaces them.
- Track AI surfaces too. With fewer classic impressions, presence inside AI Overviews and AI Mode matters more — see our guide to extracting AI Overviews.
None of this means SEO got worse. It means a layer of inflated, bot-generated data got stripped out, and the tools that quietly depended on one URL parameter had to grow up. Measure with intent, separate human signals from bot noise, and the picture is actually clearer than it was before.
Get the Top 100 in One Call
Serpent's Google SERP API paginates for you and returns up to 100 results per request — with flat per-call pricing where depth doesn't change the rate. From $0.03 per 10,000 searches. 10 free searches on signup, no subscription.
Get Your Free API KeyExplore: Google SERP API · Build a Rank Tracker · Pricing
FAQ
When did Google remove the num=100 parameter?
Around September 11, 2025. Google quietly stopped honoring &num=100, so a single search URL now returns its standard 10 results no matter what value you pass. There was no formal announcement.
Why did my Google Search Console impressions suddenly drop?
Most rank trackers loaded 100 results per query, logging an impression for every URL down to position 100. When the parameter died, those bot-driven deep impressions disappeared. About 87.7% of sites saw impressions fall while real clicks stayed flat.
Can I still get 100 Google results per page?
Not from one page request. You have to paginate with the start parameter — results 1–10, then 11–20, and so on — which means ten requests. A SERP API can do that for you behind a single call.
Why did the change make rank tracking more expensive?
Reading the top 100 now takes ten page loads instead of one, so bandwidth, proxy use, and block risk all jumped roughly 10×. Several vendors raised prices or stopped tracking past the top 10–20 by default in response.
Did my rankings actually change?
No. Your real positions and human traffic didn't move. Only the measurement changed: deep bot impressions left Search Console, so average position looks better and impressions look worse while nothing about your true ranking changed.
How do I fetch the top 100 in a single request?
Use a SERP API that paginates for you. With the Serpent Google SERP API you send num=100 in one call and get up to 100 organic results. Because pricing is flat per call, 100 results costs the same as 10.



