Google Images Scraper - up to 100K per Keyword
Pricing
from $1.50 / 1,000 unique image scrapeds
Google Images Scraper - up to 100K per Keyword
Google Images scraper tool and Google Image Search API alternative: up to 100,000 full-size image URLs per keyword with pixel dimensions and source pages. No API key.
Pricing
from $1.50 / 1,000 unique image scrapeds
Rating
0.0
(0)
Developer
Thodor
Maintained by CommunityActor stats
1
Bookmarked
27
Total users
3
Monthly active users
13 hours ago
Last modified
Categories
Share
A Google Images scraper tool that pulls up to 100,000 full-size image URLs per keyword, where a normal Google Images scraper stops at the first hundred thumbnails. Type a keyword and get every image's original URL with true pixel dimensions, source page, and caption, then load them into a spreadsheet as CSV, Excel, or JSON. No API key, no browser, no Google Cloud project.
There is no official Google Image Search API to call, and the SERP APIs that stand in for it return roughly the first 100 results per query. This actor is the Google Image Search API alternative for volume work: AI training image datasets, computer vision sourcing, e-commerce image research, and brand monitoring across countries. Scraping Bing instead? The Bing Image Search API Scraper does the same job on Bing.
π How to scrape Google Images
- Type a keyword in Search Query.
- Set Max Results to the number of images you want. It caps the run and the bill.
- Click Start.
- Open the Output tab and click Export for CSV, Excel, JSON, or HTML.
A 250-image sample finishes in seconds.
π So what do you get?
| πΌοΈ Full-resolution image URL | π Width and height of the original | π Source page URL |
|---|---|---|
| π·οΈ Caption, the source page's title | π Which Google market surfaced it | π§ Found by search or via related images |
| β‘ Google's thumbnail URL | π Link to the visually similar images | π Deduplicated across paths |
βοΈ Compared to SerpApi and other Google Images scrapers
| SerpApi, Zenserp, typical scrapers | This actor | |
|---|---|---|
| πΌοΈ Images per keyword | β ~100, first page only | β up to ~100,000 |
| π Related images | β Never opened | β Opened for every result |
| π Markets | β One | β 15 |
| π Image URL | β gstatic thumbnail, ~250px | β Full-resolution original |
| π Width and height | β The thumbnail's | β The original's |
| π Access | β API key, per-request plans | β Register on Apify, $5 free monthly credit |
| π΅ Billing | Per request | β Per unique result |
Why they stop early. Google's pagination dies around 250 images. Getting past it means opening the "visually similar" page behind each result, which normally needs a browser. Its address turns out to be computable, so this actor fetches it over plain HTTP instead.
Why the URLs are full-resolution. The original is never in the <img> tag, only in a JSON blob behind it, one array after the thumbnail. Anything reading rendered HTML sees the thumbnail and stops.
["https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9β¦", 259, 194] <- what others return["https://upload.wikimedia.org/β¦/2025_Bart_De_Wever.jpg", 333, 250] <- what you get
π― Three things people run this for
| How | |
|---|---|
| π§ AI training image datasets | One keyword per class label, then the resolution filter below keeps only images big enough to train on, before you download a single file. |
| ποΈ E-commerce image research | Batch product keywords and export one spreadsheet of full-size images with the page each one came from. |
| π Brand monitoring across countries | Run the same keyword with a fixed country to see what really ranks there, so an image that only ranks in Brazil stays out of your German report. |
π₯ Input
{"search_query": "golden retriever", "max_results": 5000}
search_query: the keyword. Required.max_results: default200. Hard cap on images and on billing.get_related_images: defaulttrue. Also collects the visually similar images behind every result.country: defaultUS. The Google market to rank for, 50 supported. Always searched first.expand_markets: defaulttrue. Sweeps the other 14 markets oncecountryis exhausted. Setfalseto keep every result ranked forcountry.language: defaulten. Interface language.
There is no fixed cap. Both switches are on by default, so the one number that decides your run is max_results:
| What you want | Images | Switch on |
|---|---|---|
| π As many as possible, anywhere | ~100,000 | Related images + Expand markets β |
| π Everything for one country | ~20,000 | Related images β , Expand markets β |
| β‘ A quick sample | ~250 | Leave max_results at 250 |
Measured on cat: 19,874 from one market, 28,986 once a second market is added. The 100,000 is the theoretical maximum across all fifteen markets. Your own country is always searched first and supplies ~250 on its own, the same set you'd see typing the query into Google Images, so a low cap gives you a quick look at the output shape before a large run.
π As many as possible, don't care where from
Sweeps all fifteen markets and stops at max_results. Every row records its market, so you can still filter later. The output no longer represents any single market, which is right for datasets and wrong when local ranking is the point.
{"search_query": "golden retriever", "max_results": 100000,"get_related_images": true, "expand_markets": true}
π Everything for one country
Results stay ranked for one market, for SEO checks and brand monitoring.
{"search_query": "wanderschuhe", "max_results": 20000,"country": "DE", "language": "de", "get_related_images": true}
π€ Output
One flat row per image, deduplicated.

{"image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/43/2025_Bart_De_Wever.jpg","thumbnail_url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR0OZnTrRQLi8&s","width": 250,"height": 333,"page_url": "https://es.wikipedia.org/wiki/Bart_De_Wever","title": "Bart De Wever - Wikipedia, la enciclopedia libre","search_query": "bart de wever","market": "US","depth_level": 0// HIDDEN: related_link}
β οΈ
titleis the source page's title, not alt text. Google doesn't ship thealtattribute in this payload; fetchpage_urlif you need it. Present on 100% of direct results and 87% of related-image results.
Fields
| Field | Description |
|---|---|
image_url | Full-resolution original on the origin server |
thumbnail_url | Google's gstatic thumbnail |
width, height | Pixel dimensions of the original |
page_url | Page hosting the image |
title | That page's title, the caption Google prints under the result |
related_link | Link to visually similar images |
search_query | Keyword used |
market | Google market that surfaced this image |
depth_level | 0 = found by the search, 1 = found via related images |
π§ Build an AI training image dataset
Training a model needs volume plus enough metadata to filter and attribute, and a standard SERP API gives you ~100 results and a thumbnail URL, which is neither. Here the width and height are the original's, so you can keep only images big enough to train on before downloading any of them:
usable = [r for r in items if (r["width"] or 0) >= 768 and (r["height"] or 0) >= 768]
An image reached through many paths is emitted once, so the set doesn't over-weight popular images. depth_level and market let you balance or stratify it, and page_url plus title are what dataset documentation and licence review need.
βοΈ Use it as a Google Image Search API
Every run is an HTTP endpoint: POST the same JSON as the form and the image rows come back in the response body.
Python
import requestsresp = requests.post("https://api.apify.com/v2/acts/thodor~google-image-scraper/run-sync-get-dataset-items",params={"token": "YOUR_APIFY_TOKEN"},json={"search_query": "golden retriever", "max_results": 5000},)items = resp.json()
Node.js
import axios from "axios";const { data } = await axios.post("https://api.apify.com/v2/acts/thodor~google-image-scraper/run-sync-get-dataset-items",{ search_query: "golden retriever", max_results: 5000 },{ params: { token: process.env.APIFY_TOKEN } });console.log(data.length, data[0].image_url);
curl
curl -X POST "https://api.apify.com/v2/acts/thodor~google-image-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"search_query":"golden retriever","max_results":5000}'
Swap run-sync-get-dataset-items for runs to fire async with a webhook when a large run outlives the 5-minute sync window. The apify-client SDK works too, in Python and JavaScript, and the n8n, Make, and Zapier integrations take the same input.
π‘ Tip: no need to write the JSON by hand. Fill in the form on the Input tab, switch the editor from Form to JSON, and copy the result into your code.
π° How much does it cost to scrape Google Images?
Billing is per unique result, at the rate on the price card on this page. Duplicates and rows without a resolved full-size URL are free. max_results is both the cap and the brake: a run capped at 5,000 bills at most 5,000 images, so set it to the dataset size you actually want.
β FAQ
Is there an official Google Image Search API? No. Google discontinued it in 2011. The nearest option, the Custom Search JSON API, returns at most 10 images per request on a 100-query daily free tier.
Can I use this Google Images scraper for free? Yes. Registering on Apify comes with $5 of free platform credit every month, no credit card needed, enough for real test runs.
Does it download the image files?
No. It returns full-resolution URLs and metadata; downloading is a loop over image_url in your own script.
Why doesn't it go deeper than one level of related images? It reaches more, but relevance drops off by the third or fourth level and you start collecting things that aren't your query. That trade shouldn't be made for you. If you need it, open a ticket on the Issues tab and I'll enable it.
Can I use the images commercially?
The actor returns URLs and metadata, not licences. Check terms per source via page_url. Nothing here grants rights to the underlying files.
What if Google rate-limits a run? Everything collected is saved and you're only billed for unique results. For very large jobs, several smaller runs beat one enormous one.
π Support
Something not working, or a field missing? Message me in the Issues tab and I'll look into it quickly. I'm a solo dev, so don't hesitate.
Need to know where one image appears online, rather than every image for a keyword? That's the Reverse Image Search API.
- Thodor
