# Google Images Scraper – Image Search Results (`simple.actor/google-images`) Actor

Scrape Google Images results as data: full-size image URL with width and height, thumbnail, source page, title, site and dominant colour for any search. Filter by size, colour, type, file type, time and usage rights. Uses Apify's Google SERP proxy. No API key, no browser. Unofficial.

- **URL**: https://apify.com/simple.actor/google-images.md
- **Developed by:** [Simple Actor](https://apify.com/simple.actor) (community)
- **Categories:** SEO tools, AI, Marketing
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 image returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Google Images Scraper – Image Search Results

Scrape Google Images results as structured data. Type what you would type into
Google's Images tab and every image comes back as a row: the **full-size image
address on the site that hosts it**, its width and height, Google's thumbnail,
the page the image appears on with its title and site name, the file size and
the image's dominant colour — in Google's own order.

Built for dataset building, visual research, image SEO, product and brand
monitoring, and finding the original source of a picture. Every filter from
the Images tab's **Tools** menu is here: size, colour, type, file type, time
and usage rights.

**No API key, no login, no browser, no account of yours involved.** About a
hundred images arrive in one request, so a typical search finishes in seconds.

**$0.50 per 1,000 images** — $0.05 for a typical 100-image search. Apify
platform usage included, nothing else to pay. A search that cannot be read
is never charged.

*Unofficial. Not affiliated with, endorsed by, or sponsored by Google.*

### Features

- **The original, not the thumbnail** — `imageUrl` is the full-size file on
  the site that hosts it, with its real pixel dimensions. Google's thumbnail is
  there too, in its own field.
- **The page behind every image** — `pageUrl`, its `title`, the site's name
  and domain, so you can check a licence or credit the source.
- **Every Tools-menu filter** — size, colour (including one specific colour or
  transparent backgrounds), type (photo, clip art, line drawing, animated GIF,
  face), file type, time, usage rights, and SafeSearch.
- **An exact size floor** — `minWidth` and `minHeight` keep only images at
  least that big, measured on Google's stated dimensions. Google's own size
  filter is coarser.
- **Dominant colour and file size on every row** — whatever filters you use.
- **Many searches in one run** — one per line, each with its own rows.
- **Paste a Google Images link** — a link copied from your browser is read with
  its own search terms and filters.
- **Country and language** — search as Google does from another country.
- **Stable IDs** — `imageId` is Google's own ID for the image, for
  deduplicating across searches and scheduled runs.
- **Runs stay green.** A search that cannot be read becomes an error row, so
  one bad line never costs the rest of the job.

### Input

```json
{
  "queries": ["golden gate bridge"],   // one search per line
  "maxItems": 100,                     // images per search (Google has ~300–400)
  "imageSize": "large",                // any | large | medium | icon
  "imageColor": "any",                 // any | color | grayscale | transparent | red | blue | …
  "imageType": "photo",                // any | photo | clipart | lineart | animated | face
  "fileType": "any",                   // any | jpg | png | gif | bmp | svg | webp | ico
  "timeRange": "any",                  // any | day | week | month | year
  "usageRights": "any",                // any | creativeCommons | commercial
  "safeSearch": false,
  "minWidth": 1200,                    // optional: drop anything narrower
  "country": "US",
  "language": "en"
}
```

Google's operators work in the search terms:

```json
{
  "queries": [
    "site:nasa.gov mars rover",
    "\"red panda\" -cartoon",
    "https://www.google.com/search?q=eiffel+tower&udm=2&tbs=itp:animated"
  ]
}
```

| Field | Type | Default | What it does |
|---|---|---|---|
| `queries` | array | — | Search terms, one per line, or links copied from Google's Images tab. |
| `maxItems` | integer | `100` | Images per search, up to 500. Google runs out at roughly 300–400 for most searches. |
| `imageSize` | string | `any` | `large`, `medium` or `icon`. |
| `imageColor` | string | `any` | `color`, `grayscale`, `transparent`, or one colour: `red`, `orange`, `yellow`, `green`, `teal`, `blue`, `purple`, `pink`, `white`, `gray`, `black`, `brown`. |
| `imageType` | string | `any` | `photo`, `clipart`, `lineart`, `animated` (GIFs) or `face`. |
| `fileType` | string | `any` | `jpg`, `png`, `gif`, `bmp`, `svg`, `webp` or `ico`. |
| `timeRange` | string | `any` | `day`, `week`, `month` or `year`. |
| `usageRights` | string | `any` | `creativeCommons` or `commercial` — Google's licence labels. |
| `safeSearch` | boolean | `false` | Have Google filter explicit images out. |
| `minWidth`, `minHeight` | integer | — | Drop images below this size in pixels. Exact, applied after the search. |
| `country` | string | `US` | Two-letter code: `US`, `GB`, `DE`, `IN`… |
| `language` | string | `en` | `en`, `de`, `fr`, `es`, `pt-BR`, `ja`… |

A pasted Google link keeps its own filters; the filter fields apply to links
that carry none, and to every plain search.

#### How many images

Google sends up to about a hundred images per request, so the default of 100
is usually a single request. Ask for more and further requests are made until
you have them or Google runs out — for most searches that is somewhere around
300 to 400 images, the same point where the Images tab stops scrolling in a
browser. Reading stops there on its own.

### Output

One item per image, in the run's dataset:

```json
{
  "type": "image",
  "position": 1,
  "title": "Red panda - Wikipedia",
  "imageUrl": "https://thumb.wikimedia.org/wikipedia/commons/thumb/f/fd/Red_Panda%2C_Gentle_Tree-Dweller_of_the_Himalayas.jpg/1280px-Red_Panda%2C_Gentle_Tree-Dweller_of_the_Himalayas.jpg?utm_source=en.wikipedia.org&utm_campaign=index&utm_content=thumbnail",
  "imageWidth": 1280,
  "imageHeight": 853,
  "thumbnailUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR4uYYm5fvNPU0Tzqjy66KfWvYLqXLkgsykJ5BNbGCntQ&s=10",
  "thumbnailWidth": 547,
  "thumbnailHeight": 365,
  "pageUrl": "https://en.wikipedia.org/wiki/Red_panda",
  "sourceName": "Wikipedia",
  "domain": "en.wikipedia.org",
  "fileSize": "269KB",
  "dominantColor": "#784e32",
  "imageId": "OqyF9koU4LIU_M",
  "query": "red panda",
  "searchUrl": "https://www.google.com/search?q=red+panda&udm=2&hl=en&gl=US",
  "page": 1,
  "retrievedAt": "2026-09-11T02:32:53.289Z"
}
```

| Field | What it is |
|---|---|
| `imageUrl` | The full-size image on the site that hosts it — not Google's copy. |
| `imageWidth`, `imageHeight` | Full-size dimensions in pixels, as Google states them. |
| `thumbnailUrl`, `thumbnailWidth`, `thumbnailHeight` | Google's thumbnail, which stays up even if the original moves. |
| `title` | The title Google shows under the image — the title of the page it appears on. |
| `pageUrl` | The page the image appears on: where to check its licence or credit it. |
| `sourceName`, `domain` | The site's name as Google shows it, and its host. |
| `fileSize` | The full-size file's size, as Google states it. |
| `dominantColor` | The image's dominant colour, as a hex code. |
| `imageId` | Google's ID for the image, stable across runs — for deduplicating. |
| `position`, `page` | Google's rank, 1 first, and which request of the search it came from. |
| `query`, `searchUrl` | The search, and the Google Images address it was read from. |

A search that could not be read is its own row with `type: "error"`, an
`error` code and an `errorDescription`. The run itself stays green either way,
and its status message says how many searches could not be read — so if you
run on a schedule, check for `type: "error"` rows rather than trusting the run
status.

An empty dataset means the searches were read and Google showed no images for
them. It never means a search could not be made; that arrives as an error row
instead.

### How to use

#### From Apify Console

1. Open the Actor and click **Try for free** / **Start**.
2. Put one search per line into **Search terms** — or paste a link from your
   browser's Google Images tab.
3. Set **Images per search**. 100 is one request; Google has roughly 300–400
   for most searches.
4. Pick any **Filters** you want, exactly as in the Images tab's Tools menu.
   For images at least a certain size, set **Minimum width** or **Minimum
   height**.
5. Click **Start**, then open the **Dataset** tab — the Images view shows a
   thumbnail of each — and export as JSON, CSV or Excel.

#### From the API

```bash
curl -s "https://api.apify.com/v2/acts/simple.actor~google-images/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"queries": ["golden gate bridge"], "imageSize": "large", "maxItems": 100}'
```

With the JavaScript client:

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('simple.actor/google-images').call({
    queries: ['red panda', 'snow leopard'],
    usageRights: 'creativeCommons',
    minWidth: 1600,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
// items[].imageUrl is the full-size file; items[].pageUrl is where to check its licence.
```

### Use cases

- **Training and evaluation datasets** — collect hundreds of labelled images
  per term, with dimensions to filter on and a stable `imageId` to deduplicate.
- **Image SEO** — see which pages and sites rank in Google Images for your
  keywords, and where your own images sit.
- **Brand and product monitoring** — find where a logo or product photo
  appears, with the page that uses it.
- **Source finding and licensing** — go from a picture to the page that hosts
  it, and narrow to Creative Commons images before checking the licence.
- **Content and design research** — mood boards by colour, transparent PNGs,
  line drawings or GIFs for a topic.
- **Local visual research** — how a place or product looks in another
  country's results, with `country` and `language`.

### Pricing

Simple pay-per-result pricing — no subscription and no start fee.

| Event | Price |
|---|---|
| Image returned | $0.0005 |

What that comes to:

- A search at the default depth, 100 images: **$0.05**.
- Everything Google has for a search, roughly 350 images: **about $0.18**.
- 1,000 images, however many searches they come from: **$0.50**.

Error rows are never charged, and a search Google has no images for costs
nothing.

### Limits worth knowing

- **Google stops at roughly 300–400 images a search.** That is where the
  Images tab stops scrolling in a browser too; asking for more returns what
  Google has.
- **Filters are Google's.** Size, type, colour and licence are how Google has
  labelled the image. A licence label in particular is not a legal guarantee —
  check the licence on `pageUrl` before reusing an image.
- **No aspect-ratio filter.** Google currently ignores it, so it is not
  offered. Use `imageWidth` and `imageHeight` on the rows instead.
- **A very specific or misspelled search is not flagged.** Google loosens a
  search it has little for and shows related images without saying so.

### FAQ

**Is scraping Google Images legal?**
Results come from Google and are subject to Google's terms, and the images
themselves belong to their owners. This Actor returns addresses and
descriptions, not copies of the images; check the licence on each image's page
before reusing it. Searches go through Apify's Google SERP proxy, which is the
sanctioned route to Google's results pages.

**Do I need a Google API key or a search API account?**
No. There is no key, no login, no browser and no quota of your own to manage.

**Does it download the images?**
No. Each row carries the full-size address and Google's thumbnail; fetch them
yourself, or feed `imageUrl` into a downloader.

**How do I know a search failed if the run stays green?**
Check for rows with `type: "error"` — that is the failure channel by design, so
one bad search never costs the rest of the job. The run's status message also
counts how many searches could not be read.

Results come from Google and are subject to Google's terms. Searches use
Apify's Google SERP proxy. Unofficial, and not affiliated with Google.

# Actor input Schema

## `queries` (type: `array`):

What to search Google Images for, one search per line. Google's operators work: "exact phrase" in quotes, site:example.com to take images from one site, a minus sign to exclude a word. You can also paste a link copied from Google's Images tab — its search terms and filters are used as they are, and the filters below apply only to links that carry none.

## `maxItems` (type: `integer`):

How many images to return per search. Google sends up to about 100 images per request, so the default of 100 is usually one request. Google's Images tab runs out at roughly 300–400 images for most searches, and reading stops there on its own — asking for more returns everything Google has.

## `imageSize` (type: `string`):

Google's size filter. "Large" is the one to pick for images you mean to print or crop — it cut out everything under 800 pixels wide in testing. For an exact floor, use "Minimum width" below as well.

## `imageColor` (type: `string`):

Google's colour filter: full colour, black and white, transparent background, or images dominated by one colour. Every row also carries the image's dominant colour, whatever you choose here.

## `imageType` (type: `string`):

Google's type filter. "Animated" returns GIFs; "Clip art" and "Line drawing" suit icons and illustrations; "Face" keeps portraits.

## `fileType` (type: `string`):

Only images in this format, as Google identifies it.

## `timeRange` (type: `string`):

Only images Google found within this period — useful for recent photos of an event or a place that has changed.

## `usageRights` (type: `string`):

Google's licence filter. "Creative Commons licences" keeps images Google found published under one. This is Google's label, not a legal guarantee: check the licence on the image's page before reusing it.

## `safeSearch` (type: `boolean`):

Turn on to have Google filter explicit images out, as its SafeSearch setting does.

## `minWidth` (type: `integer`):

Drop images narrower than this. Applied to Google's own stated dimensions after the search, so it is exact — unlike the Size filter — but a high floor means more of each page is dropped, and a search may return fewer images than "Images per search". Leave empty for no floor.

## `minHeight` (type: `integer`):

Drop images shorter than this. Works like the minimum width.

## `country` (type: `string`):

The country Google searches from, as a two-letter code: US, GB, DE, IN… Images from local sites rank higher. Defaults to US.

## `language` (type: `string`):

The language of Google's interface and of the titles it prefers: en, de, fr, es, pt-BR, ja… Defaults to en. Set it together with the country for a local search.

## Actor input object example

```json
{
  "queries": [
    "golden gate bridge",
    "site:nasa.gov mars rover"
  ],
  "maxItems": 100,
  "imageSize": "any",
  "imageColor": "any",
  "imageType": "any",
  "fileType": "any",
  "timeRange": "any",
  "usageRights": "any",
  "safeSearch": false,
  "country": "DE",
  "language": "de"
}
```

# Actor output Schema

## `images` (type: `string`):

One row per image: thumbnail, title, full-size dimensions, site and the search it answered.

## `links` (type: `string`):

The full-size image address and the page it appears on, for downloading or crawling.

## `raw` (type: `string`):

Every field of every item, exactly as pushed.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "golden gate bridge"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("simple.actor/google-images").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "queries": ["golden gate bridge"] }

# Run the Actor and wait for it to finish
run = client.actor("simple.actor/google-images").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "golden gate bridge"
  ]
}' |
apify call simple.actor/google-images --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,simple.actor/google-images"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7dhB4eKTCwAIKC53R/builds/NNRLWBuUerkBN44fE/openapi.json
