Google Images Scraper
Search Google Images for thumbnail URLs and the source page each image sits on. Rows also carry domain, title and rank. No original file URLs.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
query,safeSearch,language(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0004 per image result = $0.4 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Image result | Charged once per image result returned. Sample rows and failure diagnostics are never charged. | $0.0004 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-22, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
query | Keywords to search in Google Images, for example "red running shoes". Leave empty to receive one representative uncharged sample row. | string |
safeSearch | Currently NOT applied. Google returns a mostly unrelated tile set for any value of the safe parameter on the Images surface, so the parameter is omitted and Google default filtering is used. Rows carry safeSearchApplied: false. | string |
language | Google interface language code such as en, fr, or de. | string |
countryCode | Two-letter Google country code used for localized results, such as US, CA, or GB. | string |
maxItems | Maximum successful image rows to return from the search, from 1 to 100. | integer |
maxPages | Maximum number of bounded Google Images result pages to request, from 1 to 3. More pages can increase latency and target throttling. | integer |
enableProxyFallback | After a direct request is blocked or returns no image rows, retry through the built-in connection, or your own proxy servers if you supply them. | boolean |
What you get
A structured dataset — each result includes fields like:
queryranktitleimageUrlsourcePageUrlwidthheightExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Google Images Scraper: image tiles and the page each one sits on, no key
Type a search and get one row per image tile: the Google thumbnail, the page hosting the image, that page's domain, the tile's title text and its rank in the results.
Read this before you buy, because it decides whether this is any use to you. Google stopped putting the original file address in the Images HTML, so there is no link to the full-size file here. Every row comes back with imageUrl: null and imageUrlAvailable: false rather than passing the thumbnail off as the original. What you get is thumbnailUrl and sourcePageUrl.
| Input | One Google Images search |
| Output | One row per image tile |
| Ceiling | 100 images per run, across up to 3 pages |
| Account needed | None, and no Google API key |
| Price | $0.40 per 1,000 images, flat on every plan |
🖼️ What Google Images Scraper does
It runs your search against Google Images, reads the tile grid, and writes a row per tile.
Each row carries thumbnailUrl (the encrypted-tbn*.gstatic.com address Google serves in the grid), the thumbnail's width and height, sourcePageUrl and sourceDomain for the page the image sits on, the tile's title text, Google's own docId, and the rank and page it came from.
Set maxPages up to 3 to ask for more tiles. Duplicate tiles are removed across pages, so an image appearing twice arrives once.
📥 What you give it
{
"query": "golden retriever puppy",
"language": "en",
"countryCode": "US",
"maxItems": 20,
"maxPages": 1
}
| Field | Default | What it is |
|---|---|---|
query | box starts at red running shoes | Your image search. Leave it empty and you get one uncharged sample row. |
language | en | Google interface language, like en, fr or de. |
countryCode | US | Two-letter country for localised results. |
maxItems | 20 | Image rows to return, 1 to 100. It is also the most a run can bill you. |
maxPages | 1 | Result pages to request, 1 to 3. More pages take longer. |
safeSearch | active | Not applied. See below. |
enableProxyFallback | on | Leave it on. Off means a refused first request has nowhere to go. |
proxyConfiguration | leave it alone | Optional. Your own servers are used exactly as given, in the order listed. |
safeSearch does nothing. It is still in the form, and every value behaves the same: Google returns a mostly unrelated tile set when the parameter is sent, so it is left off and you get Google's default filtering. Rows say so with safeSearchApplied: false. Do not build a content policy on that field.
📤 What you get back
A real row from a recent run:
{
"ok": true,
"rank": 1,
"query": "golden retriever puppy",
"page": 1,
"title": "How to Train a Golden Retriever Puppy: Growth & Training Timeline",
"imageUrl": null,
"imageUrlAvailable": false,
"thumbnailUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRUNLBzUGVp8D2IE6U-7oqMxVJ0xJaE1GFBpikkO40bOA&s=10",
"thumbnailWidth": 678,
"thumbnailHeight": 452,
"sourcePageUrl": "https://www.akc.org/expert-advice/dog-breeds/golden-retriever-puppy-training-timeline/",
"sourceDomain": "www.akc.org",
"width": null,
"height": null,
"docId": "jUS0xT_ulT-SUM",
"safeSearchApplied": false
}
| Field | What it is |
|---|---|
thumbnailUrl | The only image address you get. It is Google's cached thumbnail, not the original file. |
thumbnailWidth, thumbnailHeight | The served thumbnail's shape, read from the tile. |
imageUrl, imageUrlAvailable | null and false on the current layout. The field exists so a row never pretends otherwise. |
width, height | The original file's dimensions. Also null, for the same reason. |
sourcePageUrl, sourceDomain | The page carrying the image. This is what most people actually want. |
docId | Google's own tile identifier, handy as a dedupe key. |
rank, page | Position within its page, and which page it came from. |
🧾 Reading the output
| Row | How to spot it | Charged |
|---|---|---|
| An image tile | ok: true and no _sample | yes |
| The sample row | _sample: true | no |
| A diagnostic | ok: false and an errorCode | no |
The sample row is not representative of a real one. It shows imageUrl, width and height filled in, and real rows on the current layout never carry them. Run a one-image search to see the truth.
| Code | What it means |
|---|---|
NO_RESULTS | The page came back with no tiles on it. A very narrow search lands here. |
BLOCKED | Google would not serve that request. Re-run it or reword the search. |
RATE_LIMITED | Google answered with a rate limit. Wait and try again. |
JS_REQUIRED | Google served a page that builds itself in the browser rather than a tile grid. |
NETWORK | Google was unreachable or the response never finished. |
The Overview table shows imageUrl, width and height, which are always empty, and hides thumbnailUrl and sourceDomain, which are not. Read the dataset as JSON or export it, rather than judging a run by that table.
▶️ How to run it
1. Open Google Images Scraper and click Try for free. 2. Put your search into Image search query, replacing the example. 3. Set Maximum images. Twenty is a sensible first run. 4. Change Language and Country if you want another market's results, then click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$0.40 per 1,000 images, which is $0.0004 a row. The same rate on every Apify plan, no volume tiers.
maxItems caps the rows, so it also caps what a run can bill: set it to 20 and twenty rows is the most you can be charged for.
Not charged as images: the sample row, every diagnostic row, duplicate tiles removed across pages, and a search that comes back with nothing.
💡 What people use it for
- Finding which sites are using a product photo, by reading
sourceDomainacross the whole result
set.
- Building a shortlist of pages to visit for licensing, where the source page matters more than the
file.
- Comparing what one search returns in
USagainstDEorJP, tile for tile. - Checking how your own pages rank in image results for a keyword, using
rankandsourceDomain.
🚧 What it does not do
- No original file addresses.
imageUrl,widthandheightarenullon every row from the
current layout. If your project needs the full-size file, open sourcePageUrl and find it there.
safeSearchis not applied, whatever you set it to.safeSearchApplied: falseon every row.- 100 images and 3 pages per run. There is no way to ask for the thousandth result.
- A failure on page two or three throws away the earlier rows. With
maxPagesabove 1, a run
that trips on a later page writes a diagnostic and no image rows. Keep it at 1 when one page is better than nothing.
- One search per run. Use a schedule or several runs for a keyword list.
- It does not download images. You get addresses and metadata, and what you do with them is
yours to get right: licences, copyright and each site's terms are your responsibility.
- Rows are a snapshot. Image results reshuffle constantly.
🧭 Which Google scraper do you need?
| If you want | Use |
|---|---|
| Image tiles and their source pages | This one |
| The ordinary web results page for a keyword | Google Search Results Scraper |
| News articles with the publisher's real link | Google News Scraper |
| Job postings from the jobs box | Google Jobs Scraper |
| Businesses, places and their reviews | Google Maps Scraper |
❓ Questions people ask
Can I get the full-size image file? Not from Google. The address is not in the HTML any more. Open sourcePageUrl and take it from the page itself.
Why is width empty when thumbnailWidth is filled? thumbnailWidth is the tile Google served. width would be the original file, and Google no longer tells anyone what that is.
Does safeSearch filter anything? No. Every row carries safeSearchApplied: false.
How many images can one search return? Up to 100, across at most three pages. Google often runs out before that on a narrow search.
Can I schedule it? Yes. Runs are independent, and docId makes deduping across runs easy.
Is scraping Google Images legal? The rows are public search metadata and addresses. The images themselves belong to whoever made them, so check licences and each site's terms before reusing anything. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the search and the run ID. The errorCode on the diagnostic row usually names the problem on its own.