# Google Lens Scraper (`gio21/google-lens-scraper`) Actor

Reverse image search via Google Lens. Submit any image URL, get visual matches, exact matches, OCR text, and AI descriptions in a single run. Multi-tab support. $0.005 per image — half the price of alternatives.

- **URL**: https://apify.com/gio21/google-lens-scraper.md
- **Developed by:** [Gio](https://apify.com/gio21) (community)
- **Categories:** AI, SEO tools, E-commerce
- **Stats:** 45 total users, 16 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 image searcheds

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/platform/actors/running/actors-in-store#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 Lens Scraper

Reverse image search via **Google Lens**, multi-tab, in one run.

Submit any public image URL and get back:

- **Visual matches** (similar images across the web)
- **Exact matches** (the same image on other sites — useful for stolen-photo detection / SEO audit)
- **AI Mode** matches + a generated description (when enabled)

> Cheaper and simpler than the alternatives. Single $0.005 / image price covers all tabs.

### Why this scraper

| Feature | This scraper | borderline/google-lens | zen-studio/google-lens-ocr |
|---|---|---|---|
| Pricing model | **1 flat event** | 8 separate events | 2 events |
| Per-image cost | **$0.005** | $0.001-$0.0065 + $0.01 actor start | $0.002 actor start + $0.00001/result |
| Visual + Exact + AI in one run | ✅ | needs separate runs per mode | OCR only |
| Image batch (many URLs per run) | ✅ | ✅ | ✅ |
| Reliability (paid users) | ✅ | TIMED-OUT 3.5% of last 30d | clean |
| Output structure | Flat per image | mode-by-mode | OCR-only |

### What it extracts

Per image, one record with:

| Field | Description |
|---|---|
| `imageUrl` | The input image URL |
| `vsrid` | Google's visual-search request ID (use to reconstruct tab URLs manually) |
| `visualMatches[]` | Array of `{link, thumbnail, title, source}` |
| `exactMatches[]` | Array of `{link, thumbnail, title, source}` |
| `aiMatches[]` | Array of `{link, thumbnail, title, source}` (when `includeAI` is true) |
| `aiSummary` | Free-text AI description / paragraph generated by Google AI Mode |
| `scrapedAt` | ISO timestamp |
| `error` | Only when Google blocked the image (rare; usually means the URL doesn't allow hotlinking) |

### How to use

#### Input

| Field | Required | Description |
|---|---|---|
| `imageUrls` | yes | Array of public image URLs (must allow hotlinking — Wikipedia and CDNs with referer checks won't work). |
| `country` | no | Two-letter country code (default `US`). Drives the residential proxy region. |
| `language` | no | Two-letter UI language (default `en`). |
| `includeAI` | no | Also collect AI Mode tab. Default `true`. |
| `maxItems` | no | Cap on number of images processed (defaults to all). |

#### Example

```json
{
  "imageUrls": [
    "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png",
    "https://cdn.shopify.com/s/files/1/0001/0001/products/example.jpg"
  ],
  "country": "US",
  "language": "en"
}
```

### Pricing

**$0.005 per image** (pay-per-event). No actor-start fee. No per-result micro charges.

| Volume | Cost |
|---|---|
| 100 images | $0.50 |
| 1,000 images | $5.00 |
| 10,000 images | $50.00 |

Free Apify plan: limited to 5 images per run.

### How it works

- Submits the image URL to `lens.google.com/uploadbyurl?url=...` to obtain the Google `vsrid` token.
- Navigates each Lens tab (`udm=26` visual, `udm=48` exact, `udm=50` AI mode) in the same Playwright session.
- Parses match cards directly from the rendered DOM — Google's HTML is unstable so we look for any anchor that hosts a thumbnail, then collect `{link, thumbnail, title, source}`.
- Uses Apify RESIDENTIAL proxy in the target country to avoid Google's per-IP rate limit on Lens uploads.
- Charges `image-searched` once per processed image, regardless of how many tabs returned data.

# Actor input Schema

## `imageUrls` (type: `array`):

Public URLs of images to reverse-search on Google Lens. Each URL must be hot-link-able (no Wikipedia/CDN with referer checks).

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

Two-letter country code (e.g. US, GB, DE, BR). Drives the residential proxy region and the Google Lens locale.

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

Two-letter language code (e.g. en, pt, es, de). Drives the Google UI language and OCR/AI text language.

## `includeAI` (type: `boolean`):

Also collect the AI Mode tab (generated description + AI-curated matches). Doubles tab fetches per image but no extra charge.

## `useProxy` (type: `boolean`):

By default the actor runs from the Apify Cloud IP which Google Lens accepts. Only enable this if you start seeing IP blocks.

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

Cap on number of images processed (default = all in imageUrls).

## Actor input object example

```json
{
  "imageUrls": [
    "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"
  ],
  "country": "US",
  "language": "en",
  "includeAI": true,
  "useProxy": false,
  "maxItems": 5
}
```

# Actor output Schema

## `overview` (type: `string`):

One record per image, including visual / exact / AI matches and the AI summary text.

# 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 = {
    "imageUrls": [
        "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"
    ],
    "country": "US",
    "language": "en",
    "maxItems": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("gio21/google-lens-scraper").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 = {
    "imageUrls": ["https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"],
    "country": "US",
    "language": "en",
    "maxItems": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("gio21/google-lens-scraper").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 '{
  "imageUrls": [
    "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"
  ],
  "country": "US",
  "language": "en",
  "maxItems": 5
}' |
apify call gio21/google-lens-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/scJEIrBFPOS3CzCZK/builds/CPna94sbrTxsJULzw/openapi.json
