Search & SEO · Live on Apify

Google Search Results Scraper (SERP)

Add keywords and get Google results as rows. You get organic results with their positions and related searches. You pay per loaded results page.

About $2.00 for 1,000 results$0.002 per result + $0.004 per run. Apify bills you, not us.Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Run it on Apify Opens apify.com, the website where our tools run. Sign up free with Google or email, no card needed.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure

What you get, for example

querycoffee machine
page1
typeorganic

How to use it: 3 steps

  1. 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.
  2. 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 scraping in Search queries. Each start is one run.
  3. 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 forPriceWhen
Start fee$0.004Charged 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
  1. Open the Input tab.
  2. In Search queries (queries), keep the prefilled apify web scraping or add your own queries, one per line.
  3. Keep Country us and Language en (defaults), or choose others.
  4. Keep Pages per query (maxPagesPerQuery) at 1 (prefill), or set up to 10.
  5. Click Start.
  6. Open the Output tab (Dataset) and check type, position, title and url.
Use cases
TaskInputYou getKey fieldsNext step
Rank trackingqueries, countryCode, maxPagesPerQueryorganic rowquery, position, url, pageSchedule + Google Sheets or API
SEO content researchqueries, languageCodeorganic rowtitle, description, displayedUrl, dateExport CSV / JSON
Shop and brand checkqueries, countryCodeorganic rowtitle, url, displayedUrl, descriptionExport to spreadsheet
Keyword ideasqueries, includeRelatedrelated rowtitle, urlFeed 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
  • error rows (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.

one result · JSON
{
  "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.

Python · apify-client
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
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"}'
LangChain · langchain-apify
# 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)
FieldTypeMeaning
querystringYour search query.
pageintegerGoogle result page (1 = first page).
typestringorganic result or related search (ad is reserved and not written today); null on not_found/error rows.
positionintegerPlace among rows of the same type for this query; organic positions continue across pages (page 2 starts at 11 when page 1 had 10).
titlestringResult title or the related search text.
urlstringResult URL. For related: Google search URL. Null when Google hid an organic link and did not reveal it (see statusReason).
displayedUrlstringSite as Google shows it (domain and breadcrumb).
descriptionstringSnippet text.
datestringDate shown before the snippet, as Google prints it (e.g. "Oct 2, 2026", "3 days ago").
sitelinksarrayLinks 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.
pricestringAlways null: the simple Google results page shows no prices.
countryCodestringGoogle country used (gl).
languageCodestringGoogle language used (hl).
searchUrlstringGoogle results page that was scraped.
statusstringcomplete = 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.
statusReasonstringPlain-English reason for not_found/error rows, or a note on a result (e.g. hidden URL).
errorCodestringMachine code for error rows, e.g. SOURCE_BLOCKED, DEADLINE_REACHED.
fetchedAtstringWhen the page was scraped (ISO 8601).
Input settings (7)

The main fields of the input form. With the API you send them as JSON.

SettingName in the APITypeExample value
Search queries requiredqueriesarray["apify web scraping"]
CountrycountryCodestring"us"
LanguagelanguageCodestring"en"
Pages per querymaxPagesPerQueryinteger1
Include ads (not available)includeAdsbooleantrue
Include related searchesincludeRelatedbooleantrue
ProxyproxyConfigurationobject{"useApifyProxy": true}

Use cases with this tool

Each guide shows all the steps and the other tools.

Start on Apify

Make a free Apify account: you get $5 of free usage every month. Missing a tool? Suggest it. We read every idea, but we do not promise to build it.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure