Mobile vs Desktop SERPs
Same query, two different SERPs. Mobile has different blocks, different order, sometimes different organic results entirely.
What you’ll learn
- Articulate the structural differences between mobile and desktop SERPs.
- Configure a SERP-API or scraper to return mobile-shaped results.
- Track rank divergence between the two.
- Pick which to scrape for which use case.
Google's mobile-first indexing means the mobile SERP is the canonical ranking. The desktop SERP is increasingly secondary. For most queries, mobile and desktop now show different results, different block orders, sometimes different organic rankings entirely.
A scraper that ignores this returns the wrong rank.
The structural differences
| Aspect | Desktop | Mobile |
|---|---|---|
| Knowledge Panel | Right sidebar | Top of page, sometimes inline |
| Local Pack | 3 places, side-by-side with org. | 3 places, stacked above org. |
| Image Pack | Inline carousel | Larger, often higher placement |
| Video Carousel | Inline | Larger, often higher placement |
| AI Overview | Block at top | Block at top, more often expanded by default |
| Ads | Top 1-4 + side rail (legacy) | Top + bottom, no side rail |
| Pagination | "Next" link at bottom | Often "More results" with continuous scroll |
| Sitelinks | More compact | Stacked vertical layout |
Mobile is space-constrained: blocks stack, sidebar disappears, mobile-specific features (call buttons, "Get directions") inline.
Mobile-first ranking matters
Google indexes the mobile version of pages by default. If your site renders different content on mobile vs desktop (lazy-loaded, mobile-hidden, mobile-only), the mobile version is what's indexed and ranked.
Rank tracking should follow:
- Tracking desktop rank only is incomplete in 2026.
- Many SEO teams report mobile rank as the headline KPI; desktop as a secondary check.
Configuring a SERP-API for mobile
Most SERP-APIs accept a device parameter:
r = requests.get("https://api.example-serp.com/search", params={
"q": "iphone 15",
"engine": "google",
"device": "mobile", # or "desktop" or "tablet"
"gl": "us",
"hl": "en",
"api_key": "...",
})
Some providers default to desktop and require explicit device=mobile; some offer both in one call as a premium feature.
Scraping Google directly with a mobile UA
If you're (against advice) scraping Google directly, sending a mobile User-Agent gets a mobile SERP:
mobile_ua = (
"Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) "
"AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 "
"Mobile/15E148 Safari/604.1"
)
r = requests.get(
"https://www.google.com/search?q=iphone+15",
headers={"User-Agent": mobile_ua},
)
The HTML you get back is mobile-shaped. Selectors differ from desktop; you'll need separate parsers (or, again, use a SERP-API).
Rank divergence: a real thing
Same query, same location, same time:
- "iphone 15" on desktop → your site at organic position 3.
- Same query on mobile → your site at organic position 5.
Causes:
- Mobile blocks (AI Overview, mobile-friendly checks) push organic down differently.
- Some sites have poor mobile UX and lose mobile rank as a penalty.
- Some have aggressive mobile redirects that hurt mobile crawlability.
Tracking both surfaces lets you see when desktop wins and mobile lags, usually a sign you have a mobile UX problem worth fixing.
Use cases by device
| Use case | Device |
|---|---|
| Headline SEO rank tracking | Mobile primarily |
| Desktop-focused B2B research | Desktop |
| Local SEO | Mobile (most "near me" queries are mobile) |
| News/breaking | Both, Top Stories shows differently |
| Shopping research | Both, shopping ads look different |
Tablet, a third surface
Some SERP-APIs offer device=tablet. Practically:
- Tablet results are often closer to desktop than mobile.
- Tablet is a small share of total traffic.
- Worth tracking if your audience uses iPads heavily; otherwise skip.
A combined-device rank tracker
def rank_for_query(q: str, my_domain: str, devices=("desktop", "mobile")) -> dict:
out = {}
for d in devices:
data = requests.get("https://api.example-serp.com/search", params={
"q": q, "engine": "google", "device": d,
"gl": "us", "hl": "en", "api_key": "...",
}).json()
org = data.get("organic_results", [])
rank = next(
(i + 1 for i, r in enumerate(org) if my_domain in r.get("link", "")),
None,
)
out[d] = rank
return out
print(rank_for_query("api scraping guide", "scrapingcentral.com"))
# → {"desktop": 1, "mobile": 2}
PHP equivalent: same loop with Guzzle.
SERP-API cost considerations
Most providers charge per "search," not per device. A device=mobile query usually counts as one call. Some bundle desktop+mobile as a single search; check your provider's pricing.
If you're tracking 10k keywords daily and want both desktop and mobile, that's 20k calls. At $1–$5 per 1k, $20–$100/day. Plan accordingly (lesson 3.33 on cost optimization).
Hands-on lab
If you're using a SERP-API trial: run a query like "iphone 15" twice, once with device=desktop and once with device=mobile. Compare organic positions side-by-side, you'll find at least a few queries with non-trivial divergence. If you're scraping Catalog108 only (no real SERP-API): hit /search with a mobile User-Agent and inspect the response to see if the mock SERP returns a mobile-shaped layout (the lab's intentionally light here).
Hands-on lab
Practice this lesson on Catalog108, our first-party scraping sandbox.
Open lab target →/searchQuiz, check your understanding
Pass mark is 70%. Pick the best answer; you’ll see the explanation right after.