# Google Images Scraper — Image Search Results by Keyword (`steadyfetch/google-images-search`) Actor

Google Images results by keyword, per image: one flat row per image with the image link, the page it sits on, its title, the site, its alt text and its rank — up to 200 per keyword, for any country and language. Only new images on a re-run. No login, no API key.

- **URL**: https://apify.com/steadyfetch/google-images-search.md
- **Developed by:** [Steadyfetch Team](https://apify.com/steadyfetch) (community)
- **Categories:** SEO tools, Developer tools, AI
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.10 / 1,000 images

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Images Scraper — Image Search Results by Keyword

**Type search terms and get Google Images' results for each one as flat rows: the image link, the page it sits on, its title, the site, its alt text, its rank and Google's thumbnail — up to 200 images per keyword, for any country and language. Priced per image, from $0.10 per 1,000 images. No login, no API key.**

SEO teams use it to see which pages and sites own the image results for their keywords, e-commerce teams to see whose product photos show up for a product term, and AI and dataset builders to collect labelled image links (every image comes with its title and alt text) by topic. One run turns a list of keywords into one table you can filter, sort and export.

**Using an AI agent?** Pin this actor in Apify's MCP server with one link: `https://mcp.apify.com?tools=steadyfetch/google-images-search`

- **Actor id:** `steadyfetch/google-images-search`
- **Input:** `{ "keywords": ["sourdough bread"], "maxImages": 100, "country": "US", "language": "en" }`
- **Cap the bill:** set `maxTotalChargeUsd` on the run (a run option, not Actor input), e.g. `0.50` — the run searches only the keywords that can pay.
- **Price:** $0.0001 per image at Gold ($0.0004 on the Apify free plan), or one $0.005 keyword check for a keyword with few new images. No start fee. Full table below.
- **How often it changes:** Google Images results shift as pages are published and re-ranked. A weekly run of the same keywords delivers only the images you have not received yet.

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

### What you get

One flat row per image (`rowType: "image"`), in Google Images' order:

| Column | What it holds |
|---|---|
| `keyword` · `keywordIndex` | the search term you gave, and its place in your list |
| `rank` | the image's position in Google Images for that keyword (1 = first) |
| `imageUrl` | the image's own address |
| `pageUrl` | the page the image sits on |
| `title` · `altText` | the image's title and its alt text |
| `siteName` · `site` | the site's name as Google shows it, and its domain |
| `thumbnailUrl` | Google's small preview of the image |
| `country` · `language` | where and in which language the keyword was searched |
| `seenBefore` | `true` when this actor already delivered this image to your account for the same keyword (only when **Only images I have not received** is off) |

Then one **keyword row** per searched keyword (`rowType: "keyword"`) with its counts — images Google showed, image rows delivered, images you already had, pages read — its **related searches** and Google's **refinement chips** (`relatedSearches`, `refinements`), and how it billed (`billedAs`).

Google Images does not give an image's width or height on the results page, so there are no size columns.

Every row also carries `charged`, `chargedEvents`, `status` and `statusReason`, so you can reconcile your bill from the dataset itself.

### How to use it

1. Put your search terms in **Keywords** — one per line, typed the way you would type them into Google Images. Up to 100 per run.
2. Set **Max images per keyword** (default 100, up to 200), and the **Country** and **Language** if not the United States in English.
3. Press Start — or schedule it weekly.

Refused before any search, and never charged: an empty entry, a keyword over 200 characters, a keyword using search operators such as `site:`, `intitle:` or `filetype:`, and a country or language that names nothing. Each gets its own row saying why.

### Only the new images

This actor keeps a small record per keyword, country and language in a store named `google-images-account` in **your** Apify account: the ids of the images it delivered to you, nothing else. With **Only images I have not received** on (the default), images you already received are left out and never charged again, so a scheduled run delivers what is new. Turn it off to get every image again, marked `seenBefore: true` and charged as images.

### Pricing

Pay per image, all-inclusive (no platform usage on top), no start fee:

| Event | Apify Free plan | Bronze | Silver | Gold and up |
|---|---|---|---|---|
| Image (one image row) | $0.0004 | $0.0003 | $0.0002 | $0.0001 |
| Keyword check (per 100 images read, for a keyword with few new images) | $0.005 | $0.005 | $0.005 | $0.005 |

**A keyword bills its images, or its keyword check — whichever is more, never both.** Every keyword is read in pages of up to 100 images. When a keyword's new images are worth less than one keyword check per page read — a keyword with few images, one Google Images shows no images for, or one whose images you already had — it is charged the check instead, and its images are delivered without the per-image fee. A keyword Google Images shows no images for is still charged one keyword check, because it was searched. Never charged: a keyword refused before the search, one that got no answer in time, and the bare-Start sample.

Examples at Gold: 1 keyword with 100 images = $0.01. 10 keywords with 100 images each = $0.10. 1 keyword with 200 images = $0.02. A keyword with 20 images = one $0.005 check. A weekly re-run that finds nothing new = one $0.005 check per keyword.

### Good to know

- **Up to 200 images per keyword** — Google Images' first two pages, in its own order.
- **A time limit ends the searching, never the delivering**: keywords already searched are delivered, and the receipt says which limit stopped the run.
- **Free plan:** on the Apify free plan a run reads five pages per 24 hours (five keywords at 100 images); the row says when it resets. Paid plans have no daily allowance.
- **Standby endpoint:** one keyword per HTTP request (`GET /?keyword=sourdough%20bread`), up to 200 images, at the same prices. It keeps **no** account memory: every request is a fresh search of every image.
- **Bare Start:** with no keyword set, the run searches "sourdough bread" as a sample and charges nothing.
- **Honest rows:** `input_error` (the row names the field), `try_again` (no answer in time — a re-run fixes it), `skipped_budget` / `skipped_deadline`. None is charged.
- The receipt is the last row (`run_summary`) and the run's `OUTPUT` record.

### Support

Questions, a keyword that returns something odd, or a column you need: open an issue on the Issues tab and it will be looked at.

If it earned its keep, a rating helps other buyers find it, and saving the actor keeps it one click away.

# Changelog

This Actor's version history is a separate document: https://apify.com/steadyfetch/google-images-search/changelog.md

# Actor input Schema

## `keywords` (type: `array`):

One search term per entry, like sourdough bread — typed the way you would type it into Google Images. Up to 100 per run; a term listed twice is searched once. Refused before any search, and never charged: an empty entry, a term over 200 characters, and a term using search operators such as site:, intitle: or filetype:. A keyword Google Images shows no images for is still charged one keyword check, because it was searched.

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

The most images to deliver per keyword, in Google Images' order (up to 200). Each 100 images is one results page read: a keyword whose new images are worth less than one keyword check per page read is charged the check(s) instead of its images.

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

The country Google Images is searched from: a two-letter code (US, GB, DE …) or a country name. Any of the 213 countries Google searches from works. A value that names no country is refused on every keyword's row, never guessed.

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

The language Google Images is searched in: a code (en, de, pt-BR …) or a language name. A value that names no language Google searches in is refused on every keyword's row, never guessed.

## `onlyNewImages` (type: `boolean`):

On (the default): an image this actor already delivered to your account for the same keyword, country and language is left out and not charged again, so a scheduled run delivers only what is new. Off: every image is delivered and charged, and ones you already had are marked seenBefore: true. The record lives in a store in YOUR Apify account.

## `maxRunSeconds` (type: `integer`):

Optional. Stop searching new keywords after this many seconds; keywords already searched are always delivered. A keyword usually takes 5 to 30 seconds; up to 8 run at once.

## Actor input object example

```json
{
  "keywords": [
    "sourdough bread"
  ],
  "maxImages": 100,
  "country": "US",
  "language": "en",
  "onlyNewImages": true
}
```

# Actor output Schema

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

One flat row per image (rowType image), in Google Images' order: keyword, rank, imageUrl, pageUrl, title, siteName, site, altText, thumbnailUrl, seenBefore. A keyword whose new images are worth at least its keyword check bills each image row one `image` (charged: true on the row). A keyword with fewer new images — few images, none, or only images your account already had — bills ONE `check` per 100 images read on its keyword row instead, and its image rows say charged: false, covered by that check. Never both for one keyword. Every row carries `charged`, `chargedEvents` and `status`, so the invoice reconciles from the dataset itself.

## `keywords` (type: `string`):

One keyword row per searched keyword (rowType keyword): images Google Images showed, image rows delivered, images you already had, pages read, how it billed (billedAs images | check | none), and its related searches and refinement chips. A keyword Google Images shows no images for is charged one `check`, because it was searched.

## `misses` (type: `string`):

One uncharged row for each keyword that was not searched: `input_error` (an empty, over-long or operator-carrying keyword, or a country / language that names nothing — the row names the field), `try_again` (the answer did not arrive in time; a re-run is the fix), `skipped_budget` / `skipped_deadline` (your maximum charge or the run clock stopped it first) and `skipped.free_plan_allowance` (Apify free plan only: the plan's daily allowance on this actor; the row names the reset time).

## `summary` (type: `string`):

The run's receipt: keywords searched, what was asked for, keywords with no images, image rows, images you already had, the charged events and what stopped the run. Uncharged.

# 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 = {
    "keywords": [
        "sourdough bread"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyfetch/google-images-search").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 = { "keywords": ["sourdough bread"] }

# Run the Actor and wait for it to finish
run = client.actor("steadyfetch/google-images-search").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 '{
  "keywords": [
    "sourdough bread"
  ]
}' |
apify call steadyfetch/google-images-search --silent --output-dataset

```

## MCP server setup

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

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/92GtKEJZhJ7XGfnSI/builds/61F6vMd0Bs3vh4Xqi/openapi.json
