Google Search Results Scraper: Organic & SERP Boxes
Search Google and get organic results plus AI Overview, knowledge panel, People Also Ask, related searches, local pack, top stories and ads for each query, across 48 countries with language and date filters.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
queries | array | required | Google search queries. Each is searched separately; blank entries are dropped with a warning. |
searchType | string | optional | Which Google surface to scrape: web organic results, news cards, images, or videos. |
maxResults | integer | optional | Maximum items to return per query. Web results stop at Google's own ceiling of roughly 70-100; images return 50-100 per query and news/videos paginate in pages of 10. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
queries | array | required | Google search queries. Each is searched separately; blank entries are dropped with a warning. |
searchType | string | optional | Which Google surface to scrape: web organic results, news cards, images, or videos. |
maxResults | integer | optional | Maximum items to return per query. Web results stop at Google's own ceiling of roughly 70-100; images return 50-100 per query and news/videos paginate in pages of 10. |
countryCode | string | optional | Country for the Google domain and searcher-location (gl) signal. Leave empty for US (google.com); if Precise Location is set and this is empty, the country is derived from it. |
restrictResultsCountry | string | optional | Only return pages whose content originates from this country (Google's cr parameter), independent of Country/gl. Leave empty for no restriction. |
languageCode | string | optional | Language of Google's own interface, e.g. en, de, fr, es. This does not restrict the language of the matched pages. |
restrictResultsLanguage | string | optional | Only return pages written in this language, e.g. en or en,fr for either. Leave empty for no restriction. |
maxPagesPerQuery | integer | optional | Result pages to crawl per query for web, news and videos. Images are a single page. Web results stop at Google's own ceiling of roughly 7-10 pages. |
timePeriod | string | optional | Filter results by relative time. Leave empty for any time. |
safeSearch | string | optional | Filter explicit content (safe=). Leave empty for Google's default. |
includeAiOverview | boolean | optional | Opt-in browser-rendered AI Overview for web searches. Slower and not guaranteed: Google may not show one, and the text is best-effort. Only applies to web search. |
includeDestinationUrl | boolean | optional | Add a destinationUrl field with the real destination behind Google's redirect link. Adds one lookup per organic result. Only applies to web search. |
csvFriendlyOutput | boolean | optional | For web search, output one organic/paid result per row instead of one SERP page per row. Other SERP features are not included in this layout. |
includeExtraBoxes | boolean | optional | For web search, also extract weather, time zone, currency/unit converter, stock, jobs, videos, shopping and dictionary boxes when present. |
uule | string | optional | Optional Google-encoded location for city-level targeting. Best-effort: country targeting is reliable, city precision is not guaranteed. Leave empty to use Country only. |
dateFrom | string | optional | Only include results published on or after this date (YYYY-MM-DD). Must be used with Date to. |
dateTo | string | optional | Only include results published on or before this date (YYYY-MM-DD). Must be used with Date from. |
exactPhrase | boolean | optional | Wrap each query in quotes so Google matches it as an exact phrase. |
site | string | optional | Restrict results to this domain, e.g. nike.com. Every organic result is checked against it; off-domain results Google slips in are dropped. |
intitle | string | optional | Restrict results to pages containing this word in the title. Sent to Google as-is. |
intext | string | optional | Restrict results to pages containing this word in the body text. Sent to Google as-is. |
inurl | string | optional | Restrict results to pages containing this word in the URL. Sent to Google as-is. |
fileType | string | optional | Restrict results to a file type, e.g. pdf, doc, xls. Sent to Google as-is. |
excludeTerms | string | optional | Words to exclude, comma- or space-separated, e.g. jaguar, cats. |
Download the published input schema
View complete JSON
{
"description": "Scrape Google web, news, image and video results with country/language targeting, time filters, operators and optional AI Overview or real destination URLs.",
"properties": {
"countryCode": {
"default": "",
"description": "Country for the Google domain and searcher-location (gl) signal. Leave empty for US (google.com); if Precise Location is set and this is empty, the country is derived from it.",
"editor": "select",
"enum": [
"",
"us",
"uk",
"ca",
"au",
"de",
"fr",
"es",
"it",
"br",
"mx",
"in",
"jp",
"kr",
"nl",
"be",
"at",
"ch",
"se",
"no",
"dk",
"fi",
"pl",
"cz",
"pt",
"ie",
"nz",
"za",
"sg",
"hk",
"tw",
"ph",
"th",
"id",
"my",
"vn",
"ar",
"cl",
"co",
"pe",
"tr",
"ru",
"ua",
"il",
"ae",
"sa",
"eg",
"ng",
"ke"
],
"enumTitles": [
"United States (default)",
"United States",
"United Kingdom",
"Canada",
"Australia",
"Germany",
"France",
"Spain",
"Italy",
"Brazil",
"Mexico",
"India",
"Japan",
"South Korea",
"Netherlands",
"Belgium",
"Austria",
"Switzerland",
"Sweden",
"Norway",
"Denmark",
"Finland",
"Poland",
"Czech Republic",
"Portugal",
"Ireland",
"New Zealand",
"South Africa",
"Singapore",
"Hong Kong",
"Taiwan",
"Philippines",
"Thailand",
"Indonesia",
"Malaysia",
"Vietnam",
"Argentina",
"Chile",
"Colombia",
"Peru",
"Turkey",
"Russia",
"Ukraine",
"Israel",
"UAE",
"Saudi Arabia",
"Egypt",
"Nigeria",
"Kenya"
],
"prefill": "us",
"title": "Country",
"type": "string"
},
"csvFriendlyOutput": {
"default": false,
"description": "For web search, output one organic/paid result per row instead of one SERP page per row. Other SERP features are not included in this layout.",
"prefill": false,
"title": "CSV friendly output (one result per row)",
"type": "boolean"
},
"dateFrom": {
"description": "Only include results published on or after this date (YYYY-MM-DD). Must be used with Date to.",
"editor": "datepicker",
"prefill": "",
"title": "Date from",
"type": "string"
},
"dateTo": {
"description": "Only include results published on or before this date (YYYY-MM-DD). Must be used with Date from.",
"editor": "datepicker",
"prefill": "",
"title": "Date to",
"type": "string"
},
"exactPhrase": {
"default": false,
"description": "Wrap each query in quotes so Google matches it as an exact phrase.",
"prefill": false,
"title": "Exact phrase match",
"type": "boolean"
},
"excludeTerms": {
"description": "Words to exclude, comma- or space-separated, e.g. jaguar, cats.",
"editor": "textfield",
"prefill": "",
"title": "Exclude terms (-word)",
"type": "string"
},
"fileType": {
"description": "Restrict results to a file type, e.g. pdf, doc, xls. Sent to Google as-is.",
"editor": "textfield",
"prefill": "",
"title": "File type (filetype:)",
"type": "string"
},
"includeAiOverview": {
"default": false,
"description": "Opt-in browser-rendered AI Overview for web searches. Slower and not guaranteed: Google may not show one, and the text is best-effort. Only applies to web search.",
"prefill": false,
"title": "Include AI Overview (slower, best-effort)",
"type": "boolean"
},
"includeDestinationUrl": {
"default": false,
"description": "Add a destinationUrl field with the real destination behind Google's redirect link. Adds one lookup per organic result. Only applies to web search.",
"prefill": false,
"title": "Resolve real result URLs",
"type": "boolean"
},
"includeExtraBoxes": {
"default": false,
"description": "For web search, also extract weather, time zone, currency/unit converter, stock, jobs, videos, shopping and dictionary boxes when present.",
"prefill": false,
"title": "Include extra info boxes",
"type": "boolean"
},
"intext": {
"description": "Restrict results to pages containing this word in the body text. Sent to Google as-is.",
"editor": "textfield",
"prefill": "",
"title": "Word in text (intext:)",
"type": "string"
},
"intitle": {
"description": "Restrict results to pages containing this word in the title. Sent to Google as-is.",
"editor": "textfield",
"prefill": "",
"title": "Word in title (intitle:)",
"type": "string"
},
"inurl": {
"description": "Restrict results to pages containing this word in the URL. Sent to Google as-is.",
"editor": "textfield",
"prefill": "",
"title": "Word in URL (inurl:)",
"type": "string"
},
"languageCode": {
"default": "",
"description": "Language of Google's own interface, e.g. en, de, fr, es. This does not restrict the language of the matched pages.",
"editor": "textfield",
"prefill": "en",
"title": "Interface language (hl)",
"type": "string"
},
"maxPagesPerQuery": {
"default": 1,
"description": "Result pages to crawl per query for web, news and videos. Images are a single page. Web results stop at Google's own ceiling of roughly 7-10 pages.",
"maximum": 10,
"minimum": 1,
"prefill": 1,
"title": "Max pages per query",
"type": "integer"
},
"maxResults": {
"default": 100,
"description": "Maximum items to return per query. Web results stop at Google's own ceiling of roughly 70-100; images return 50-100 per query and news/videos paginate in pages of 10.",
"maximum": 200,
"minimum": 1,
"prefill": 3,
"title": "Max results per query",
"type": "integer"
},
"queries": {
"description": "Google search queries. Each is searched separately; blank entries are dropped with a warning.",
"editor": "stringList",
"items": {
"type": "string"
},
"minItems": 1,
"prefill": [
"Hotels in NYC"
],
"title": "Search Queries",
"type": "array"
},
"restrictResultsCountry": {
"default": "",
"description": "Only return pages whose content originates from this country (Google's cr parameter), independent of Country/gl. Leave empty for no restriction.",
"editor": "select",
"enum": [
"",
"us",
"uk",
"ca",
"au",
"de",
"fr",
"es",
"it",
"br",
"mx",
"in",
"jp",
"kr",
"nl",
"be",
"at",
"ch",
"se",
"no",
"dk",
"fi",
"pl",
"cz",
"pt",
"ie",
"nz",
"za",
"sg",
"hk",
"tw",
"ph",
"th",
"id",
"my",
"vn",
"ar",
"cl",
"co",
"pe",
"tr",
"ru",
"ua",
"il",
"ae",
"sa",
"eg",
"ng",
"ke"
],
"enumTitles": [
"Any country (default)",
"United States",
"United Kingdom",
"Canada",
"Australia",
"Germany",
"France",
"Spain",
"Italy",
"Brazil",
"Mexico",
"India",
"Japan",
"South Korea",
"Netherlands",
"Belgium",
"Austria",
"Switzerland",
"Sweden",
"Norway",
"Denmark",
"Finland",
"Poland",
"Czech Republic",
"Portugal",
"Ireland",
"New Zealand",
"South Africa",
"Singapore",
"Hong Kong",
"Taiwan",
"Philippines",
"Thailand",
"Indonesia",
"Malaysia",
"Vietnam",
"Argentina",
"Chile",
"Colombia",
"Peru",
"Turkey",
"Russia",
"Ukraine",
"Israel",
"UAE",
"Saudi Arabia",
"Egypt",
"Nigeria",
"Kenya"
],
"prefill": "",
"title": "Restrict results to country (cr)",
"type": "string"
},
"restrictResultsLanguage": {
"default": "",
"description": "Only return pages written in this language, e.g. en or en,fr for either. Leave empty for no restriction.",
"editor": "textfield",
"prefill": "",
"title": "Restrict results language (lr)",
"type": "string"
},
"safeSearch": {
"default": "",
"description": "Filter explicit content (safe=). Leave empty for Google's default.",
"editor": "select",
"enum": [
"",
"active",
"off"
],
"enumTitles": [
"Default",
"Filter explicit results",
"Do not filter"
],
"prefill": "",
"title": "SafeSearch",
"type": "string"
},
"searchType": {
"default": "web",
"description": "Which Google surface to scrape: web organic results, news cards, images, or videos.",
"editor": "select",
"enum": [
"web",
"news",
"images",
"videos"
],
"enumTitles": [
"Web results",
"News",
"Images",
"Videos"
],
"prefill": "web",
"title": "Search type",
"type": "string"
},
"site": {
"description": "Restrict results to this domain, e.g. nike.com. Every organic result is checked against it; off-domain results Google slips in are dropped.",
"editor": "textfield",
"prefill": "",
"title": "Site (site: operator)",
"type": "string"
},
"timePeriod": {
"default": "",
"description": "Filter results by relative time. Leave empty for any time.",
"editor": "select",
"enum": [
"",
"hour",
"day",
"week",
"month",
"year"
],
"enumTitles": [
"Any time",
"Past hour",
"Past 24 hours",
"Past week",
"Past month",
"Past year"
],
"prefill": "",
"title": "Time period",
"type": "string"
},
"uule": {
"description": "Optional Google-encoded location for city-level targeting. Best-effort: country targeting is reliable, city precision is not guaranteed. Leave empty to use Country only.",
"editor": "textfield",
"prefill": "",
"title": "Precise location (uule)",
"type": "string"
}
},
"required": [
"queries"
],
"schemaVersion": 1,
"title": "Google Search Results (SERP) Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
results | string | optional | Dataset with scraped SERP data |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "One record per search query/page with web organic results, news cards, images, videos, AI Overview, People Also Ask, local pack, related queries and paid results.",
"properties": {
"results": {
"description": "Dataset with scraped SERP data",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"type": "string"
}
},
"title": "Google Search Results Scraper: Web, News, Images & Videos Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"title": "Google Search Results",
"views": {
"detailed": {
"display": {
"component": "table",
"properties": {
"aiOverview": {
"format": "object",
"label": "AI Overview"
},
"hasNextPage": {
"format": "boolean",
"label": "Has Next Page"
},
"imageResults": {
"format": "array",
"label": "Image Results"
},
"knowledgePanel": {
"format": "object",
"label": "Knowledge Panel"
},
"localPack": {
"format": "array",
"label": "Local Pack"
},
"newsResults": {
"format": "array",
"label": "News Results"
},
"organicResults": {
"format": "array",
"label": "Organic Results"
},
"paidResults": {
"format": "array",
"label": "Paid Results"
},
"peopleAlsoAsk": {
"format": "array",
"label": "People Also Ask"
},
"relatedQueries": {
"format": "array",
"label": "Related Queries"
},
"resultsTotal": {
"format": "number",
"label": "Total Results"
},
"searchQuery": {
"format": "object",
"label": "Search Query"
},
"sportsTable": {
"format": "object",
"label": "Sports Table"
},
"topStories": {
"format": "array",
"label": "Top Stories"
},
"videoResults": {
"format": "array",
"label": "Video Results"
}
}
},
"title": "Detailed View",
"transformation": {
"fields": [
"searchQuery",
"hasNextPage",
"resultsTotal",
"organicResults",
"aiOverview",
"knowledgePanel",
"peopleAlsoAsk",
"relatedQueries",
"localPack",
"topStories",
"sportsTable",
"paidResults",
"imageResults",
"newsResults",
"videoResults"
]
}
},
"overview": {
"display": {
"component": "table",
"properties": {
"hasNextPage": {
"format": "boolean",
"label": "Has Next Page"
},
"organicResults": {
"format": "array",
"label": "Organic Results"
},
"resultsTotal": {
"format": "number",
"label": "Total Results"
},
"searchQuery.countryCode": {
"format": "text",
"label": "Country"
},
"searchQuery.page": {
"format": "number",
"label": "Page"
},
"searchQuery.term": {
"format": "text",
"label": "Search Query"
}
}
},
"title": "Results Overview",
"transformation": {
"fields": [
"searchQuery",
"resultsTotal",
"hasNextPage",
"organicResults"
],
"flatten": [
"searchQuery"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
Google Search Results Scraper: Web, News, Images & Videos
Run any search term through Google and get back structured results for the surface you need: classic web results with ads and SERP features, the News tab, the Images tab, or the Videos tab. Point it at a list of queries, choose a country and language, and it returns one structured record per query/page.
What this actor does
- Searches web, news, images or videos with one
searchTypechoice - Web results: organic results, ads, People Also Ask, related searches, knowledge panel, local pack, top stories, sports tables and optional extra boxes
- Images: title, source, page URL, thumbnail, original image URL and dimensions
- News: headline, source, link, published time and snippet
- Videos: title, link, video ID, publisher/channel, duration and thumbnail
- Country/language targeting, time filters, custom date ranges, city-level
uulehints and Google search operators - Optional real destination URLs for web organic results, and an optional browser-rendered AI Overview
- No proxy setup or credentials required: the actor handles its own access
Output per search result page
Each run produces one record per query (per page, if maxPagesPerQuery > 1). Fields that Google does not render for a query are omitted, not filled with placeholders.
Web (searchType: "web"):
searchQuery— term, page, country, language, search type and results-per-page metadataorganicResults—{position, title, url, displayedUrl, destinationUrl, snippet, siteLinks}.urlis the working Google result link; setincludeDestinationUrlto add the real destination.paidResults— ad slots, when Google renders anypeopleAlsoAsk— related questionsrelatedQueries— suggested searchesknowledgePanel— entity panel for people, places and organizationslocalPack— local business results with rating, review count and addresstopStories— news carousel resultssportsTable— standings when Google renders a real table (best-effort; current grid layouts may not populate it)aiOverview— only whenincludeAiOverviewis enabled and Google renders oneresultsTotal— Google's own rough estimate, which fluctuates between pages and renders; treat it as volatile, not a stable volume metrichasNextPage— whether another page is availableweatherBox,stockBox,timeZoneBox,currencyConverterBox,unitConverterBox,jobsPack,videoPack,shoppingPack,dictionaryBox— opt-in viaincludeExtraBoxes
News (searchType: "news"): newsResults[] with position, title, url, source, publishedAt (ISO 8601 when Google exposes a timestamp), publishedTimeText and snippet.
Images (searchType: "images"): imageResults[] with position, title, source, pageUrl, thumbnailUrl, originalImageUrl, width and height. Original URLs come from the publisher as Google reports them; some hosts block hotlinks or let URLs expire, so validate before fetching. The thumbnail is returned independently.
Videos (searchType: "videos"): videoResults[] with position, title, url, videoId, publisher, channel, duration and thumbnailUrl.
Error rows: a query that fails outright, or is blocked on every attempt, produces {"type": "error", "query": ..., "reason": ...} instead of page records.
Input
| Field | Type | Default | Description |
|---|---|---|---|
queries |
array | – | Search terms; each is searched separately. |
searchType |
string | web |
web, news, images or videos. |
maxResults |
integer | 100 |
Maximum items per query (1–200). Web results stop at Google's own ~70–100 ceiling; images return 50–100; news/videos paginate in 10-result steps (news pages may render 10–22 cards). |
countryCode |
string | (empty = US) | Country for the Google domain and searcher-location signal. |
restrictResultsCountry |
string | (empty = any) | Only return pages targeting this country (Google's cr). |
languageCode |
string | (empty) | Google interface language (e.g. en, de). |
restrictResultsLanguage |
string | (empty) | Only return pages written in this language (e.g. en or en,fr). |
maxPagesPerQuery |
integer | 1 |
Pages to crawl per query for web/news/videos (1–10). Images are one page. |
timePeriod |
string | (empty = any) | hour, day, week, month or year. |
safeSearch |
string | (empty = default) | active or off. |
includeAiOverview |
boolean | false |
Opt-in browser-rendered AI Overview for web. Slower; not guaranteed. |
includeDestinationUrl |
boolean | false |
Resolve web organic links to their real destination. Adds one lookup per result. |
csvFriendlyOutput |
boolean | false |
Web only: one organic/paid result per row. |
includeExtraBoxes |
boolean | false |
Web only: weather, time zone, converter, stock, jobs, videos, shopping, dictionary boxes. |
uule |
string | (empty) | Google-encoded location for city-level targeting; best-effort. |
dateFrom / dateTo |
string | (empty) | Custom date range (YYYY-MM-DD), set together. Overrides timePeriod. |
exactPhrase |
boolean | false |
Wrap each query in quotes. |
site |
string | (empty) | site: operator; results are checked against the domain and off-domain ones are dropped. |
intitle / intext / inurl / fileType |
string | (empty) | Search operators sent to Google as-is. |
excludeTerms |
string | (empty) | Words to exclude, comma- or space-separated. |
Examples
Web rank check with a time filter:
{
"queries": ["best running shoes 2026"],
"searchType": "web",
"countryCode": "us",
"maxResults": 30,
"maxPagesPerQuery": 4,
"timePeriod": "month",
"includeDestinationUrl": true
}
News monitoring:
{
"queries": ["tesla"],
"searchType": "news",
"countryCode": "us",
"maxResults": 20,
"maxPagesPerQuery": 2
}
Image research:
{
"queries": ["tesla cybertruck"],
"searchType": "images",
"countryCode": "us",
"maxResults": 50
}
Use cases
- SEO monitoring — track web ranking positions across countries and languages
- News monitoring — collect headlines, sources and publication times
- Visual research — gather image thumbnails, sources and dimensions
- Video research — collect video titles, channels and durations
- SERP feature tracking — monitor ads, PAA, knowledge panels, local packs and AI Overviews
- Content research — mine related searches and questions
FAQ
Is this an official Google product? No. This is an independent actor that reads publicly available Google result pages. It is not affiliated with, endorsed by, or sponsored by Google.
Do I need a proxy or Google account? No. The actor handles its own access and needs no cookies, logins, API keys or proxy configuration.
How many results can I get per query? Web results stop at Google's own ceiling of roughly 70–100, even if you ask for 200. Images return 50–100 per query. News and videos paginate in 10-result steps and stop when Google stops returning results; a news page may render 10–22 cards.
Why is resultsTotal sometimes a small number?
It is Google's own estimate on that specific render. It fluctuates between pages and query types, so use it as a rough signal rather than a stable search-volume metric.
Why are paidResults, knowledgePanel, localPack or topStories often empty?
Google only renders those features for some queries. Ads are sparse even on commercial terms; local packs need local intent; knowledge panels need an entity. Their absence is normal, not an extraction failure.
Why is aiOverview empty?
AI Overview is opt-in because it requires a slower browser-rendered fetch, and Google still may not show one for a given query. The text is best-effort and headings/bullets may be flattened.
What is destinationUrl?
Google usually wraps organic links in a redirect. With includeDestinationUrl enabled, the actor follows that redirect and adds the real destination. If the lookup fails, destinationUrl is omitted and the working Google link remains in url.
Why did site: return fewer results than expected?
Google silently widens site: searches once the restricted corpus runs out. The actor checks each result against your domain and drops ones that do not belong, so a smaller but accurate set is expected. Social cards with follower counts are recognized as on-domain.
Does CSV mode include news, images or videos?
No. csvFriendlyOutput is a web-only reshape. Use the default JSON layout for the other search types.
Are image URLs permanent? Thumbnail URLs are served by Google and are reliable. Original image URLs come from the publisher and may expire or be hotlink-protected; the actor returns the URL Google provides and does not runtime-validate every original, so a few may return 403/404.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build NG6Y2OAdaEEnxj85d. Documentation is regenerated from the default published build; private drafts are not included.