How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
apify web scrapingin Search queries. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Add search queries, pick a Google country and language, and get the public Google search results (SERP) as one row per result: organic results and related searches, each with its position. No Google login, no API key; you pay per loaded results page, about $0.006 for the first page of one query.
- organic results: position, title, URL, displayed URL, snippet, date and sitelinks (when Google shows them);
- related searches: the "People also search for" list, once per query.
Good for
- Track where a site ranks for a list of keywords in one country.
- Collect top 10–100 URLs for a topic for SEO or content research.
- See which shops and brands rank for product queries.
- Find related searches to grow a keyword list.
Not a good fit
- The Actor reads Google's simple HTML results page. It does not return ads, shopping prices, People Also Ask, AI Overviews, featured snippets, maps or image packs.
- Results are not personalised and not tied to a city. A Google Ads account, Search Console data or search volume are not included.
- Google sometimes blocks automated traffic. The Actor changes IP addresses and retries, but it never solves CAPTCHAs (see Troubleshooting).
Who uses it
SEO specialists
Track where a site ranks for a keyword list in one country.
Ecommerce teams
See which shops and brands rank for product searches.
Content teams
Collect top URLs and related searches for new topics.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.004 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Results page | $0.002 (from $0.0015 on paid Apify plans) | Charged once for each Google results page loaded for a query (about 10 organic results plus ads and related searches). A query with no results costs one page. Error rows are free. |
Examples
- One result: about $0.006.
- 1,000 results: about $2.00.
- Every day 100 results, for 30 days: about $6.12 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 2,400 results.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Does it return People Also Ask or AI Overviews?
No. It reads the simple Google results page. It gives organic results and related searches. Ads, sitelinks and shopping prices are not included.
How deep can it go?
Up to 10 result pages per query and up to 500 queries per run.
Are results personalised or local to a city?
No. Results are for the chosen country and language only.
Do I need a Google account or API key?
No. The Actor reads public results pages without login or cookies of any account.
How many results do I get per page?
Usually 9–10 organic results and 8–10 related searches, depending on the query.
Is the order the same as on google.com?
position follows the order on the simple Google results page for the chosen country and language. It can differ a little from a personalised desktop page.
What does null mean?
Google did not show that value, for example no date. It is not zero and not an error.
Details
Step by step on Apify
- Open the Input tab.
- In Search queries (
queries), keep the prefilledapify web scrapingor add your own queries, one per line. - Keep Country
usand Languageen(defaults), or choose others. - Keep Pages per query (
maxPagesPerQuery) at1(prefill), or set up to10. - Click Start.
- Open the Output tab (Dataset) and check
type,position,titleandurl.
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Rank tracking | queries, countryCode, maxPagesPerQuery | organic row | query, position, url, page | Schedule + Google Sheets or API |
| SEO content research | queries, languageCode | organic row | title, description, displayedUrl, date | Export CSV / JSON |
| Shop and brand check | queries, countryCode | organic row | title, url, displayedUrl, description | Export to spreadsheet |
| Keyword ideas | queries, includeRelated | related row | title, url | Feed back into queries |
Tips for better results
- Use related searches as new keywords for your next run.
- Ask for fewer pages if you only need the top 10.
- Set a maximum charge per run to control cost.
Limits and good to know
- A query with no results costs one page: Google was asked and answered
errorrows (Google refused the page) are free- If you set a maximum charge for the run, the Actor stops before it, keeps the rows and ends with status CAPPED
- Up to 500 queries and 10 pages per query in one run
- Run time depends on Google's answers: in the latest test, 40 pages took about 7 seconds without blocks. Very large runs were not measured on the current route, so start with a smaller list. After 3,600 seconds the run stops with status CAPPED and keeps all rows; split bigger lists across runs
- Google decides how many pages a query has; some queries end before page 10
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"query": "coffee machine",
"page": 1,
"type": "organic",
"position": 1,
"title": "Coffee & Espresso Makers | Macy's",
"url": "https://www.macys.com/shop/home/kitchen-dining/kitchen/coffee-espresso-makers?id=24732",
"displayedUrl": "www.macys.com › Home › Kitchen & Dining › All Kitchen",
"description": "Shop coffee makers at Macy's with stylish, high-quality ...",
"date": "Oct 9, 2026",
"sitelinks": [],
"price": null,
"countryCode": "us",
"languageCode": "en",
"searchUrl": "https://www.google.com/search?q=coffee+machine&hl=en&gl=us",
"status": "complete",
"statusReason": null,
"errorCode": null,
"fetchedAt": "2026-10-22T04:06:02.872Z"
}Use it from code
Actor ID: cliqtomedia/google-search-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/google-search-scraper").call(run_input={
"queries": [
"apify web scraping"
],
"countryCode": "us"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~google-search-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries": ["apify web scraping"], "countryCode": "us"}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/google-search-scraper")
result = tool.invoke({"run_input": {"queries": ["apify web scraping"], "countryCode": "us"}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (18)
| Field | Type | Meaning |
|---|---|---|
query | string | Your search query. |
page | integer | Google result page (1 = first page). |
type | string | organic result or related search (ad is reserved and not written today); null on not_found/error rows. |
position | integer | Place among rows of the same type for this query; organic positions continue across pages (page 2 starts at 11 when page 1 had 10). |
title | string | Result title or the related search text. |
url | string | Result URL. For related: Google search URL. Null when Google hid an organic link and did not reveal it (see statusReason). |
displayedUrl | string | Site as Google shows it (domain and breadcrumb). |
description | string | Snippet text. |
date | string | Date shown before the snippet, as Google prints it (e.g. "Oct 2, 2026", "3 days ago"). |
sitelinks | array | Links Google shows under a result, as [{title, url}]. They are not separate rows and do not change position. An empty list when Google shows none. |
price | string | Always null: the simple Google results page shows no prices. |
countryCode | string | Google country used (gl). |
languageCode | string | Google language used (hl). |
searchUrl | string | Google results page that was scraped. |
status | string | complete = a result; not_found = Google returned no results for the query; error = the query could not be scraped. A not_found row is one charged page (Google was queried); error rows are free. |
statusReason | string | Plain-English reason for not_found/error rows, or a note on a result (e.g. hidden URL). |
errorCode | string | Machine code for error rows, e.g. SOURCE_BLOCKED, DEADLINE_REACHED. |
fetchedAt | string | When the page was scraped (ISO 8601). |
Input settings (7)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Search queries required | queries | array | ["apify web scraping"] |
| Country | countryCode | string | "us" |
| Language | languageCode | string | "en" |
| Pages per query | maxPagesPerQuery | integer | 1 |
| Include ads (not available) | includeAds | boolean | true |
| Include related searches | includeRelated | boolean | true |
| Proxy | proxyConfiguration | object | {"useApifyProxy": true} |
Use cases with this tool
Each guide shows all the steps and the other tools.