sfoln/google-search-results · SEO tools, AI, Automation On request
Scrape Google organic search results for any query and country: rank, title, URL, domain, snippet, date and sitelinks, plus knowledge graph, answer box, People Also Ask and related searches. $2.50 per 1,000 result pages of 10 results.
Google Search Results Scraper gets Google organic search results as clean, stable JSON, with one dataset row per result: rank, title, URL, domain, snippet, date and sitelinks. Each query also gets a summary row with the knowledge graph, answer box, People Also Ask and related searches. Built for SEO rank tracking, lead research, market monitoring and AI agents that need fresh Google results without running a browser.
Price
Price per delivered record
Event
Price
Per 1,000
Charged for
Google results page google-search-query
$0.0025
$2.5 / 1,000
Charged once per Google results page of up to 10 organic results (one upstream credit). A query with 10 results = 1 event, 20 results = 2 events, and so on.
Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.
Run
Call it from code, an agent or the Console
This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com
curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~google-search-results/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries":["apify web scraping"]}'
POST https://api.apify.com/v2/actors/sfoln~google-search-results/runs?maxTotalChargeUsd=1
GET https://api.apify.com/v2/actor-runs/{runId} # until status is SUCCEEDED
GET https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json
Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Search Google in the US for "best crm for startups" and list the top 10 organic results with their domains, plus the People Also Ask questions.
Input
Input fields
Enter search queries (one per line). For every query the Actor writes one row per organic result plus one `query_summary` row (knowledge graph, answer box, People Also Ask, related searches).
Field
Type
Default
Meaning
queries *
array
required
Search queries Google search queries, one per line. Search operators such as site: or intitle: work. Duplicates are removed. Accounts on the Apify free plan can process up to 10 queries per run.
country
string
"us"
Country (gl) Two-letter country code for the Google domain and ranking, e.g. us, gb, de, in.
language
string
"en"
Language (hl) Interface language code, e.g. en, de, es, pt-br.
location
string
—
Location Optional free-text location to search from, e.g. "Austin, Texas, United States". Leave empty for country-level results.
resultsPerQuery
integer
10
Results per query How many organic results to fetch per query, rounded up to a multiple of 10. Each page of 10 results costs one google-search-query event. Range 10–100.
page
integer
1
Start page Result page to start from (1 = top results). Use 2 to get positions 11–20, and so on. Range 1–100.
timeRange
string
"any"
Time range Only return results published within this period. One of "any", "hour", "day", "week", "month", "year".
autocorrect
boolean
true
Autocorrect query Let Google correct spelling mistakes in the query. Turn it off for exact-match research.
includePeopleAlsoAsk
boolean
true
Include People Also Ask Add the People Also Ask questions to the query_summary row.
includeRelatedSearches
boolean
true
Include related searches Add Google's related searches to the query_summary row.
maxQueries
integer
1000
Max queries Safety cap on the number of queries processed in this run. Range 1–10000.
concurrency
integer
5
Concurrency How many queries run in parallel. Range 1–10.
includeRaw
boolean
false
Include raw upstream response Attach the unmodified upstream pages to each query_summary row (larger output).
Example input
{
"queries": [
"apify web scraping"
]
}
Output
One record per input item
Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.
Field
Type
Meaning
input
string
Input The query this row belongs to.
query
string
Query Search query. e.g. "apify web scraping"
resultType
string
Result type organic = one search result; query_summary = one row per query (not charged itself). e.g. "organic"
rank
integer | null
Rank Overall position: (page − 1) × 10 + the result's place on its page, so page 2 starts at 11 even when page 1 had fewer organic results.
position
integer | null
Position Position as reported by the upstream for this result, passed through unchanged.
page
integer | null
Page Results page the row came from.
title
string | null
Title
url
string | null
URL
domain
string | null
Domain Host without www., derived from url.
snippet
string | null
Snippet
date
string | null
Date Date shown by Google, as displayed (e.g. "Mar 10, 2022").
sitelinks
array
Sitelinks [{ title, url }] shown under the result.
attributes
object | null
Attributes Extra key/value facts Google shows under some results.
totalOrganic
integer | null
Organic results query_summary: number of organic rows written for the query.
pagesFetched
integer | null
Pages fetched
creditsUsed
number | null
Credits used query_summary: upstream credits the query used.
creditsCharged
number | null
Credits charged query_summary: google-search-query events charged for the query, before any of its rows was written (equal to creditsUsed unless the maximum cost per run was reached).
topResultUrl
string | null
Top result URL
topDomains
array
Top domains Distinct domains in rank order (max 10).
knowledgeGraph
object | null
Knowledge graph
answerBox
object | null
Answer box
peopleAlsoAsk
array
People Also Ask [{ question, snippet, title, url }]
relatedSearches
array
Related searches Related query strings.
correctedQuery
string | null
Corrected query Query Google actually searched when it differs from the input.
country
string | null
Country query_summary: country code (Google gl) used for the query.
language
string | null
Language query_summary: interface language (Google hl) used for the query.
location
string | null
Location query_summary: free-text location used for the query, or null.
status
string
Status ok | not_found | error | skipped_budget | skipped_free_plan e.g. "ok"
charged
boolean
Charged true on an organic row covered by the google-search-query charge of its results page; the query_summary row is never charged itself (see creditsCharged).
chargedEvent
string
Charged event
chargedCount
integer
Events charged Events actually charged when the charge came back short of the requested count (present only then; a warning explains it).
source
string
Source
fetchedAt
string
Fetched at
Example record
{
"input": "apple inc",
"query": "apple inc",
"resultType": "organic",
"rank": 2,
"position": 2,
"page": 1,
"title": "Apple Inc. - Wikipedia",
"url": "https://en.wikipedia.org/wiki/Apple_Inc.",
"domain": "en.wikipedia.org",
"snippet": "Apple Inc. is an American multinational corporation and technology company…",
"date": "Mar 10, 2022",
"sitelinks": [],
"attributes": {
"Founded": "April 1, 1976"
},
"status": "ok",
"charged": true,
"chargedEvent": "google-search-query",
"source": "serper",
"fetchedAt": "2026-10-14T10:00:00.000Z"
}