# Google SERP Scraper: AI Overview, PAA and Rank Tracking

> Google SERP Scraper is an Apify actor (API) by CheapAPI Labs. Organic results, ads, AI Overview, People also ask and the local pack for any keyword and country, with rank tracking. It costs $1.50 per 1,000 result pages on the Apify Free plan and $1.20 on Gold, plus $0.002 per run ($0.0006 on Gold), billed through your Apify account with no API key. Compared with the most used Apify Store actor for Google Search (about 193,000 users): 1,000 Google result pages costs $1.50 on Free and $1.20 on Gold here and $4.50 and $1.80 there (Apify Store listing prices, checked September 2026). The cheapest per page actor charges $0.50 on every plan but returns organic results only, without AI Overview or People also ask.

- Page: https://cheapapilabs.com/actors/google-serp-scraper/
- Run on Apify: https://apify.com/cheapapi/google-serp-scraper
- Publisher: CheapAPI Labs (Apify username cheapapi)
- Main price: $1.50 per 1,000 result pages on Free, $1.20 on Gold
- Our prices updated: 2026-10-30

## Prices per event (USD)

| Event | Free | Bronze | Silver | Gold |
|---|---:|---:|---:|---:|
| Run start | $0.002 | $0.002 | $0.001 | $0.0006 |
| Search results page | $0.0015 | $0.0015 | $0.0015 | $0.0012 |
| Search results page with search operators | $0.0045 | $0.0045 | $0.0045 | $0.0045 |
| Google AI Mode answer | $0.0025 | $0.0025 | $0.0025 | $0.0018 |
| AI Overview loading | $0.0009 | $0.0009 | $0.0009 | $0.0008 |
| Pixel positions | $0.0009 | $0.0009 | $0.0009 | $0.0009 |
| Extra “People also ask” question | $0.0003 | $0.0003 | $0.0003 | $0.0003 |
| Fast processing add on | $0.0008 | $0.0008 | $0.0008 | $0.0008 |
| Instant processing add on | $0.0018 | $0.0018 | $0.0018 | $0.0018 |
| Search without results | $0.001 | $0.001 | $0.001 | $0.001 |

Platinum and Diamond pay the Gold price. Apify platform usage: billed separately by Apify.

## Call it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/cheapapi~google-serp-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"searchTerms":["best running shoes","how to brew cold brew coffee"],"country":"US","language":"en","maxPagesPerQuery":1,"searchType":"organic","device":"desktop","processingSpeed":"auto"}'
```

## Example output row

```json
{
  "id": "482afcf38b538266347d",
  "rowType": "serpPage",
  "searchTerm": "pizza",
  "searchType": "organic",
  "country": "GB",
  "language": "en",
  "location": "London,England,United Kingdom",
  "device": "desktop",
  "googleDomain": "google.com",
  "searchUrl": "https://www.google.com/search?q=pizza&hl=en&gl=GB&ie=UTF-8&uule=w+CAIQIFISCXXeIa8LoNhHEZkq1d1aOpZS",
  "totalResultsEstimate": 1210000000,
  "serpFeatures": [
    "find_results_on",
    "local_pack",
    "organic",
    "people_also_ask",
    "related_searches",
    "google_reviews",
    "knowledge_graph"
  ],
  "scrapedAt": "2026-09-28T06:19:15.000Z",
  "page": 1,
  "organicResults": [
    {
      "position": 4,
      "absolutePosition": 9,
      "title": "30 best pizza restaurants in London 2026",
      "url": "https://www.bbcgoodfood.com/travel/the-best-pizza-in-london",
      "domain": "www.bbcgoodfood.com",
      "displayedUrl": "https://www.bbcgoodfood.com › Travel",
      "websiteName": "Good Food",
      "description": "12 Apr 2026 — Best for a bargain · 1. Vincenzo's · 2. Ria's · 3. Dough Hands · 4. Voodoo Ray's ·  Read more",
      "preSnippet": "04/12/2026 00:00:00",
      "extendedSnippet": null,
      "highlighted": [
        "1. Vincenzo's"
      ],
  …
}
```

## Fields

Every dataset row has a stable `id` and a `rowType`: `serpPage` (one Google results page), `aiModeAnswer` (Google AI Mode), or, when **Also output one row per result** is on, `organicResult`, `paidResult`, `newsResult`, `imageResult` or `citation`.

**Results page (`rowType: "serpPage"`)**

| Field | Type | Example |
|---|---|---|
| `id` | string | `"482afcf38b538266347d"`, stable hash of row type, search context, page (position and URL for result rows) and capture time; use it to de duplicate appended exports |
| `searchTerm` | string | `"pizza"` |
| `searchType` | string | `"organic"` (or `aiMode`, `news`, `images`) |
| `page` | integer | `1` |
| `country` / `language` | string | `"GB"` / `"en"` |
| `location` | string or null | `"London,England,United Kingdom"` |
| `device` | string | `"desktop"` |
| `googleDomain` | string | `"google.com"` |
| `searchUrl` | string | `"https://www.google.com/search?q=pizza&hl=en&gl=GB&ie=UTF-8&uule=…"` (the page Google was asked for) |
| `totalResultsEstimate` | integer | `1210000000` |
| `serpFeatures` | array of strings | `["local_pack", "organic", "people_also_ask", "knowledge_graph"]` |
| `organicResults` | array of objects | `position`, `absolutePosition`, `title`, `url`, `domain`, `displayedUrl`, `websiteName`, `description`, `preSnippet`, `extendedSnippet`, `highlighted`, `date`, `rating`, `price`, `sitelinks`, `images`, `faq`, `isFeaturedSnippet`, `isImage`, `isVideo`, `isAmp`, `relatedResults` |
| `paidResults` | array of objects | `position`, `title`, `url`, `domain`, `description`, `sitelinks`, `price`, `rating` |
| `aiOverview` | object or null | `text`, `markdown`, `citations` (`position`, `title`, `url`, `domain`, `source`, `snippet`), `loadedAsynchronously` |
| `peopleAlsoAsk` | array of objects | `question`, `answer`, `sourceUrl`, `sourceDomain`, `answerIsAiGenerated`, `citations`, `revealedByQuestion` |
| `localPack` | array of objects | `name`, `phone`, `website`, `rating`, `reviewsCount`, `isPaid`, `googleMapsUrl` |
| `featuredSnippet` | object or null | `title`, `text`, `url`, `domain`, `table`, `images` |
| `knowledgeGraph` | object or null | `title`, `subtitle`, `description`, `details` |
| `topStories`, `videos`, `images`, `shopping`, `answerBox` | arrays / object | when Google shows them |
| `relatedSearches`, `peopleAlsoSearch`, `refinementChips` | array of strings | `["Pizza near me", "Pizza near London"]` |
| `spellingCorrection` | object or null | Google's "Did you mean" |
| `otherFeatures` | array of objects | every other SERP element Google shows |
| `rankTracking` | array of objects | `domain`, `found`, `position`, `absolutePosition`, `page`, `url`, `title`, `resultsFromDomain`, `citedInAiOverview`, `aiOverviewCitationPosition`, `inFeaturedSnippet`, `inPaidResults`, `inLocalPack` |
| `scrapedAt` | string (ISO date) | `"2026-09-28T06:19:15.000Z"` |

**AI Mode answer (`rowType: "aiModeAnswer"`)**: the context fields above plus `answerText`, `answerMarkdown`, `citations`, `otherElements` and `rankTracking` (whether and where your domain is cited).

**News / Images rows**: `newsResults` (`title`, `url`, `domain`, `source`, `snippet`, `published`, `date`, `imageUrl`) or `imageResults` (`title`, `alt`, `source`, `pageUrl`, `imageUrl`, `thumbnailUrl`, `domain`), plus `resultsCount`, `pagesCovered` and `rankTracking`.

**Flat result rows** (free, optional): `id`, `rowType`, `searchTerm`, `page`, `position`, `absolutePosition`, `title`, `url`, `domain`, `displayedUrl`, `description`, `date`, `isTrackedDomain`, `country`, `language`, `scrapedAt`.

## Compared with alternatives

Typical run: **1,000 keywords × 1 results page** (about 10,000 organic results). Prices are the Actor fees per listing (Free plan / Gold plan).

| Option | 1,000 keywords × 1 page | AI Overview on the page | Google AI Mode | People also ask | Local pack | Built in rank tracking |
|---|---|---|---|---|---|---|
| Most used Store Actor for Google Search (~193k users) | $4.50 / $1.80 | add on, +$3.00 / +$1.00 per 1,000 captured | ✓ | ✓ | not listed | not listed |
| Cheapest per page Actor (~12k users) | **$0.50 / $0.50** | ✗ | ✗ | ✗ | ✗ | ✗ |
| Per result budget Actor (~2,300 users) | ≈ $3.00 / ≈ $1.30 (≈ 10 results per page) | ✗ | ✗ | ✗ | ✗ | ✗ |
| Per query budget Actor (~1,300 users) | $2.00 / $2.00 (first 10 results per query included) | ✗ | ✗ | ✗ | ✗ | ✗ |
| **This Actor** | **$1.50 / $1.20** | ✓ included | ✓ ($2.50 / $1.80 per 1,000) | ✓ | ✓ | ✓ |

Prices from public Apify Store listings, checked September 2026 (start fees of $0.0003 to $0.002 per run left out). ✗ = not mentioned in the listing. Apify platform usage is billed separately by Apify for this Actor too (see Pricing); the table compares Actor fees only.

**Per plan, 1,000 result pages (most used Actor vs. this Actor).** Apify lets us set Free, Bronze, Silver and Gold prices; Platinum and Diamond pay our Gold price.

| Apify plan | Most used Actor | This Actor | Difference |
|---|---|---|---|
| Free | $4.50 | $1.50 | 67% cheaper |
| Bronze | $2.50 | $1.50 | 40% cheaper |
| Silver | $1.95 | $1.50 | 23% cheaper |
| Gold | $1.80 | $1.20 | 33% cheaper |
| Platinum | $1.50 | $1.20 | 20% cheaper |
| Diamond | $1.20 | $1.20 | same price |

Plainly: on Silver we are 23% cheaper, not more; on Gold and above our page price matches the most used Actor's Diamond price, so a Diamond customer pays the same per page (their AI Overview add on, $0.50 per 1,000 on Diamond, is included here).

**Honest take:** if you only need position, title, URL and snippet of organic results, the cheapest per page Actor costs about a third of our price, and a per result Actor is similar on Gold. You pay $1.50 here for the full page in one row, AI Overview with cited sources, People also ask, local pack, ads, featured snippet, knowledge graph, plus rank tracking of your domains and optional Google AI Mode, at no add on fee for the AI Overview Google shows on the page.

## Not included

- **AI answers from other engines (ChatGPT, Perplexity, Gemini, Claude)**, this Actor covers Google only (AI Overview and AI Mode). For cross engine AI answers and brand citations use our [AI Search Visibility Tracker](https://cheapapilabs.com/actors/ai-search-visibility-tracker/).
- **Full Google Maps place data** (opening hours, all reviews, photos) beyond the local pack, use our [Google Maps Scraper Plus](https://cheapapilabs.com/actors/google-maps-scraper-plus/).
- **Search volume, keyword difficulty and keyword ideas**, use our [Keyword Research Tool](https://cheapapilabs.com/actors/keyword-research-tool/).
- **Content of the ranking pages, contact/lead enrichment**, Google Shopping product pages and screenshots of the results page, not collected; the Actor returns what Google shows on the results page.

## Limits

- Results reflect Google at the moment of collection. Google personalizes and tests results constantly, so small differences from your own browser are normal.
- Google shows about 10 organic results per page, sometimes fewer. Depth is limited to 700 results per search term (Google Search, News and Images).
- AI Mode returns one answer per search term (no result pages) and cannot use Google search URLs. News is always collected as desktop.
- Embedded images inside AI answers are not included (the text, links and all cited sources are).
- With Standard speed, runs at busy times can take longer than 5 minutes; searches not finished within "Maximum wait" are reported in `RUN_SUMMARY` and charged the no results fee. If the platform moves a run to another server, searches already sent are collected, never sent twice.
- Some fields (ratings, dates) are `null` when Google does not show them. People also ask **questions** are always collected, but Google now loads most answers as AI generated text only after a click, so `answer` is often `null` (`answerIsAiGenerated: true`) even with expansion on, in our September 2026 test runs every answer was `null`. Expansion reveals extra questions, not answers.

## FAQ

**Is there a limit on the Apify Free plan?**
Yes: up to $0.25 of this Actor's results per calendar month, enough to try it. Apify pays developers nothing for Free plan usage while our data costs are real, so this keeps the Actor sustainable. Runs that reach the allowance stop cleanly and keep everything collected so far; the allowance resets on the 1st of the month. Any paid Apify plan has no limit.

**Is it legal to scrape Google search results?**
This Actor collects publicly visible search results. You are responsible for using the data in line with applicable laws and Google's terms. If you are unsure, ask a lawyer.

**How fresh is the data?**
Every search is run live on Google at the time of your run. `scrapedAt` shows when the page was collected.

**Does every search have an AI Overview?**
No, Google decides when to show one, mostly for informational questions. When it does, you get the full text and cited sources. Turn on "Always load the AI Overview" to also capture those Google loads a moment after the page.

**Why did I get fewer results than I asked for?**
Google often shows fewer than 10 organic results on a page, stops offering pages for narrow searches, or returns nothing for rare terms. Your spending limit or "Stop paging when a tracked domain is found" can also end a search early. You pay for delivered pages; a search that returned nothing costs the no results fee ($0.001 per page unit), and `RUN_SUMMARY` lists every such search.

**How is the position counted?**
`position` is the organic rank (1 = first organic result). `absolutePosition` counts every SERP element (ads, local pack, AI Overview …) from the top of the page.

**How do I monitor rankings over time?**
Schedule the Actor with your keywords and `trackDomains`. Each run stores positions with a timestamp; the **Rank tracking** view and the flat result rows are easy to append to a spreadsheet or database, and the `id` field lets you de duplicate rows if an export is appended twice.

**Why was I charged for a search without results?**
The search was already run on Google (and paid for) before we could see it was empty, for example a very rare term, a `site:` search on a small site, or a search that did not finish within "Maximum wait". Instead of the page price you pay the no results fee: $0.001 per page unit (a `site:` search counts 5 units, an AI Mode answer 2), plus the Fast/Instant add on if you chose one. Searches rejected before processing are free.

**Why was I charged for "People also ask" questions that did not appear?**
With expansion on, each expansion click is paid even when Google reveals no new question, so a page that shows the box is charged at least one question per expansion level. Pages without the box are not charged for expansion.

**Why was my Fast Google News run charged as Instant?**
Google News is served faster and cheaper by Instant processing than by the Fast queue, so Fast is replaced by Instant for News (a warning is shown in the log).

**How do I control what a run costs?**
Set a maximum charge per run. The Actor plans the searches that fit, skips the rest (reported as `searchesSkippedByLimit`) and never charges above the limit.

**Can I get results for a specific city?**
Yes, use "City or region" (e.g. `Chicago,Illinois,United States`) or exact GPS "Coordinates".

**Which export formats are available?**
JSON, JSONL, CSV, Excel, XML and HTML from the Console or API, with three ready views: result pages, rank tracking and one row per result.

**Where do I get support?**
Open an issue on the Actor's **Issues** tab in Apify Console and describe what you need.
