# Google Image Downloader (`kawsar/google-image-downloader`) Actor

Google Image Downloader scrapes Google Images for any keyword and returns full-size image URLs, thumbnails, source pages, and dimensions, so you can build datasets, run SEO audits, or collect images without writing a single line of code.

- **URL**: https://apify.com/kawsar/google-image-downloader.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **Categories:** Developer tools, SEO tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Image Downloader
<p align="center">
  <img 
    src="https://i.imgur.com/0LFR5dO.png"
    alt="Image"
    width="680"
    style="max-width:100%; border-radius:14px;"
  />
</p>
Extract structured image data from Google Images for any search keyword. Returns direct image URLs, thumbnail URLs, source page URLs, image dimensions, and domain information. No browser or manual work required.

Commonly used for SEO audits, competitor research, content curation, AI dataset labeling, and visual trend analysis.

---

### Features

- Scrapes full-size image URLs and thumbnail URLs for any keyword
- Returns the source page URL and domain for each image
- Captures image width and height in pixels
- Supports Google SafeSearch filter
- Paginates automatically to collect up to 500 results
- No browser required and no proxy configuration needed
- Exports to JSON, CSV, Excel, or Google Sheets

---

### Output fields

| Field | Type | Description |
|---|---|---|
| `position` | Integer | Rank in search results (1 = first result) |
| `query` | String | The search keyword used |
| `imageUrl` | String | Direct URL to the full-size image |
| `thumbnailUrl` | String | Google-proxied thumbnail URL |
| `sourceUrl` | String | URL of the page hosting the image |
| `sourceDomain` | String | Domain of the source website |
| `width` | Integer | Image width in pixels |
| `height` | Integer | Image height in pixels |

---

### Input fields

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `queries` | Array of strings | Yes | — | One or more search keywords. Each keyword is scraped independently. |
| `maxImages` | Integer | No | 50 | Max images per keyword (1–500). Paginated automatically. |
| `safeSearch` | Boolean | No | false | Filter explicit content via Google SafeSearch |
| `requestTimeoutSecs` | Integer | No | 30 | Per-request timeout in seconds (10–120) |

---

### How to use

#### Step 1 — Enter one or more keywords

In the **Search keywords** field, add each keyword you want to search. Each keyword is scraped as a separate Google Images search and returns its own set of results.

Examples:
- `logo design minimalist`
- `landscape photography golden hour`
- `product packaging coffee`
- `interior design scandinavian`

You can add as many keywords as you need. The actor processes them one by one.

#### Step 2 — Set result limit per keyword

Use the **Max images per keyword** field to control how many results to collect for each keyword. Default is 50. Google Images typically returns up to 200 unique results per search, so setting `maxImages` above 200 may return fewer results than requested. The total dataset size will be approximately `number of keywords × maxImages`.

#### Step 3 — Configure optional settings

- **Safe search** — turn on to filter adult content from results
- **Request timeout** — increase this if you see timeout errors on slow connections

#### Step 4 — Start the run

Click **Start**. The actor fetches and parses results page by page, then saves everything to the **Dataset** tab. Runs typically complete in under a minute for 50–100 images.

---

### Example input

```json
{
  "queries": [
    "minimalist logo design",
    "flat icon design",
    "brand identity inspiration"
  ],
  "maxImages": 50,
  "safeSearch": false,
  "requestTimeoutSecs": 30
}
````

This runs three separate Google Images searches and returns up to 50 images each, giving up to 150 results total in the dataset.

### Example output

```json
[
  {
    "position": 1,
    "query": "minimalist logo design",
    "imageUrl": "https://cdn.dribbble.com/users/2/screenshots/minimal-logo.jpg",
    "thumbnailUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ...",
    "sourceUrl": "https://dribbble.com/shots/12345-minimal-logo-concept",
    "sourceDomain": "dribbble.com",
    "width": 1600,
    "height": 1200
  },
  {
    "position": 2,
    "query": "minimalist logo design",
    "imageUrl": "https://images.behance.net/project/logos/minimal-brand.png",
    "thumbnailUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR...",
    "sourceUrl": "https://www.behance.net/gallery/98765/Minimal-Logo-Collection",
    "sourceDomain": "behance.net",
    "width": 1200,
    "height": 900
  }
]
```

***

### Use cases

**SEO and competitive research**
Search any keyword and see which domains rank in Google Images. Useful for understanding who owns the visual search results for your niche, spotting competitors, and identifying link-building opportunities from high-ranking image sources.

**Content and design research**
Collect reference images for mood boards, presentations, design briefs, or creative projects without manually saving each image.

**AI and machine learning datasets**
Gather labeled image URLs at scale for training image classifiers, object detection models, or visual search systems. The structured output includes dimensions and source metadata.

**Market and product research**
Search product categories and see which brands, styles, and designs appear most in image search. Useful for identifying visual trends before launching a product or campaign.

**Monitoring**
Run the actor on a schedule to track how image search results change over time for a given keyword. Compare runs to detect when new competitors enter the space or existing ones lose visibility.

***

### Scheduling

To monitor a keyword over time, use Apify's built-in **Schedule** feature:

1. Go to **Schedules** in the Apify console
2. Click **Add schedule**
3. Select this actor and set your input
4. Choose a frequency (daily, weekly, etc.)
5. Results from each run accumulate in the dataset automatically

***

### Integrations

| Integration | How to use |
|---|---|
| **Google Sheets** | Connect via the Apify Google Sheets integration to push results directly to a spreadsheet |
| **Zapier** | Trigger Zaps when new results are saved to the dataset |
| **Make (Integromat)** | Build automated workflows using new dataset items as triggers |
| **REST API** | Access results programmatically via the Apify API using your API token |
| **CSV / Excel** | Download from the Dataset tab using the Export button |

***

### Limits and notes

- Google Images returns up to approximately 200 unique results per search query. Setting `maxImages` above this will collect as many results as Google provides.
- Duplicate images (the same file hosted on multiple pages) are deduplicated automatically.
- Results reflect what Google returns at the time of the run. Image rankings change over time.
- The `sourceUrl` field is the page where the image is hosted, not a direct download link.
- Some images may not have a detectable source URL if Google does not expose one in its result data.

***

### Support

If you find a bug or want to request a feature, open an issue on the actor page in the Apify console.

# Actor input Schema

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

One or more keywords to search on Google Images. Each keyword is scraped separately and returns up to 'Max images per keyword' results.

## `maxImages` (type: `integer`):

Maximum number of images to return per keyword (1-500). Each keyword is paginated independently.

## `requestTimeoutSecs` (type: `integer`):

How many seconds to wait for each page request before timing out.

## Actor input object example

```json
{
  "queries": [
    "landscape photography"
  ],
  "maxImages": 500,
  "requestTimeoutSecs": 300
}
```

# 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": [
        "landscape photography"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/google-image-downloader").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": ["landscape photography"] }

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "landscape photography"
  ]
}' |
apify call kawsar/google-image-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=kawsar/google-image-downloader",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Image Downloader",
        "description": "Google Image Downloader scrapes Google Images for any keyword and returns full-size image URLs, thumbnails, source pages, and dimensions, so you can build datasets, run SEO audits, or collect images without writing a single line of code.",
        "version": "0.0",
        "x-build-id": "Vy0bgTQPk20avFEn8"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kawsar~google-image-downloader/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kawsar-google-image-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/kawsar~google-image-downloader/runs": {
            "post": {
                "operationId": "runs-sync-kawsar-google-image-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/kawsar~google-image-downloader/run-sync": {
            "post": {
                "operationId": "run-sync-kawsar-google-image-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "queries"
                ],
                "properties": {
                    "queries": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "One or more keywords to search on Google Images. Each keyword is scraped separately and returns up to 'Max images per keyword' results.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxImages": {
                        "title": "Max images per keyword",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of images to return per keyword (1-500). Each keyword is paginated independently.",
                        "default": 500
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout (seconds)",
                        "minimum": 100,
                        "maximum": 1200,
                        "type": "integer",
                        "description": "How many seconds to wait for each page request before timing out.",
                        "default": 300
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
