Organic Results vs Paid Ads vs Shopping Results
Three result types share the SERP. Each is a different data shape, a different scrape target, and a different question your scraper answers.
What you’ll learn
- Distinguish organic results, text ads, and shopping ads on the page and in JSON.
- Understand the metadata each carries (position, ad rank, price, merchant).
- Pick which to scrape for which analytics use case.
- Be aware of the ethical / ToS context around scraping paid ads.
Three different "result types" share the SERP, and they're solving three different problems for the user, and for the scraper.
Organic Results
The classic blue-link list. Algorithmically ranked, not paid. What SEO is about.
Shape in a SERP-API JSON:
{
"organic_results": [
{
"position": 1,
"title": "iPhone 15 - Apple",
"link": "https://www.apple.com/iphone-15/",
"displayed_link": "https://www.apple.com › iphone-15",
"snippet": "iPhone 15. With the powerful A16 Bionic chip...",
"sitelinks": [
{"title": "Compare", "link": "..."},
{"title": "Specs", "link": "..."}
],
"rich_snippet": {"price": "$799", "rating": 4.8}
}...
]
}
Key fields:
position, rank within the organic block (after ads).title,link,snippet, the visible content.sitelinks, sub-links Google bolts onto big-brand results.rich_snippet, schema.org-derived extras (price, rating, FAQ).
Use cases: rank tracking, content gap analysis, competitor monitoring, keyword research.
Paid Search Ads
Sponsored text ads marked "Sponsored" or "Ad." Look like organic results but with an "Ad" label. Advertisers pay per click (Google Ads / Bing Ads).
{
"ads": [
{
"position": 1,
"title": "iPhone 15 | Free Shipping",
"link": "https://example.com/iphone-15?gclid=...",
"displayed_link": "https://www.example.com/iphone",
"snippet": "Save up to $200 on the new iPhone 15.",
"block_position": "top",
"phone": "(555) 123-4567",
"extensions": ["Free shipping", "30-day returns"]
}...
]
}
Key fields:
block_position, "top," "bottom," or "side", different ad slots.extensions, ad assets (call, location, snippet, image).gclidin the URL, Google's click tracking parameter.
Use cases: competitor ad-copy research, paid SEM monitoring, share-of-voice analysis.
Note: Some advertisers care strongly about not having their ad copy scraped. The competitive intelligence is real, but so is the toxicity if abused.
Shopping Ads (Product Listing Ads / Shopping Pack)
Product cards with image, price, merchant, rating. Pulled from Google Merchant Center feeds. Look completely different from text ads, visual, prominent, often above organic.
{
"shopping_results": [
{
"position": 1,
"title": "Apple iPhone 15 128GB Black",
"link": "https://www.example.com/iphone-15",
"thumbnail": "https://...",
"price": "$799",
"extracted_price": 799.0,
"currency": "$",
"merchant": "Apple Store",
"rating": 4.8,
"reviews": 1240,
"delivery": "Free 2-day delivery"
}...
]
}
Key fields:
extracted_price, numeric form of the price (vs the formattedpricestring).merchant, who's selling.rating,reviews, aggregated.delivery, shipping promise.
Use cases: price intelligence, merchant tracking, product availability monitoring, competitive pricing.
The visual distinction on the page
In Chrome:
- Text ads,
Sponsoredbadge above title; small "Ad" beside the URL. - Shopping pack, distinct visual carousel of product cards with images.
- Organic, no badge; the typical title-link-snippet layout.
Mobile SERPs blur the distinction more; ads now look very similar to organic, by design.
Why scrapers care about all three
| Use case | Organic | Ads | Shopping |
|---|---|---|---|
| Rank tracking (SEO) | Primary | Optional | Optional |
| SEM intelligence | Optional | Primary | Optional |
| Price intelligence | Tangential | No | Primary |
| Competitor monitoring | Partial | Strong | Strong |
| Content strategy | Primary | Indirect | No |
If you're doing serious SERP analytics, all three matter. Pure SEO tools focus organic; pure SEM tools focus paid; pricing tools focus shopping. The big platforms (Semrush, Ahrefs, SimilarWeb) collect all three.
A scraper that captures all three
A SERP-API request typically returns all three in one JSON response. Your scraper splits them by block:
import requests
def parse_serp(data):
return {
"organic": [
{
"position": r["position"],
"url": r["link"],
"title": r["title"],
"snippet": r.get("snippet", ""),
}
for r in data.get("organic_results", [])
],
"ads": [
{
"position": a["position"],
"url": a["link"],
"title": a["title"],
"block": a.get("block_position"),
}
for a in data.get("ads", [])
],
"shopping": [
{
"title": s["title"],
"price": s.get("extracted_price"),
"merchant": s.get("merchant"),
"rating": s.get("rating"),
"url": s.get("link"),
}
for s in data.get("shopping_results", [])
],
}
PHP version: same shape, with ?? null for missing fields.
Position numbers and how to interpret them
A SERP-API will give you:
position(orrank) within each block.- Sometimes an
absolute_positioncombining blocks.
If you're tracking "rank for iPhone", careful. There are at least three "rank 1"s on the page (organic 1, ad 1, shopping 1). Pick which one matters for your KPI and be consistent.
The legal context
A few notes that apply to scraping ads especially:
- Google's ToS forbids automated scraping of Google. Many SERP-APIs route around this by using residential proxies and presenting as real users. The legal status is genuinely murky.
- Competitor ad scraping has been litigated. Generally OK for analytics; clearly NOT OK for cloning, fraud-clicking, or harassment.
- Shopping data is more open, many merchants want their products surfaced widely. But the Google shopping feed is Google's.
When in doubt, use a SERP-API (lessons 3.31–3.40). Their lawyers have already thought about this.
Hands-on lab
On practice.scrapingcentral.com/search?q=phone, identify visually: which result is organic, which (if any) is an ad placeholder, which is shopping. Open Network → Fetch/XHR and look at the JSON that populates the page. Note how the three are separated by block. Then in a real Google search, do the same visual exercise, note how Google's CSS makes it harder, which is exactly why SERP APIs exist.
Hands-on lab
Practice this lesson on Catalog108, our first-party scraping sandbox.
Open lab target →/search?q=phoneQuiz, check your understanding
Pass mark is 70%. Pick the best answer; you’ll see the explanation right after.