# Google Lens Search: Reverse Image Finder & OCR (`getascraper/google-lens-visual-search`) Actor

Reverse image search via Google Lens. Get visual matches, exact duplicates, AI descriptions, related links, and parallel OCR text with bounding boxes. Bypasses blocks natively using residential proxies.

- **URL**: https://apify.com/getascraper/google-lens-visual-search.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** SEO tools, AI, Automation
- **Stats:** 35 total users, 10 monthly users, 61.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.24 / 1,000 search executeds

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?

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 Visual Search: Reverse image search, OCR & web matches

<table width="100%" style="display:table;width:100%;border-collapse:collapse"><tr><td style="padding:24px 28px;background:#EFF6FF;border:1px solid #BFDBFE;border-top:4px solid #1E3A8A;border-radius:12px"><span style="font-size:23px;font-weight:800;color:#172554;line-height:1.3">Turn public image URLs into useful visual-search records.</span><br><span style="font-size:15px;color:#334155;line-height:1.6">Read visible text, discover source pages, or save a Lens result after a browser review.</span></td></tr></table>

<table width="100%" style="display:table;width:100%;border-collapse:collapse;table-layout:fixed"><tr><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #BFDBFE;border-radius:10px 0 0 10px;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#172554">🔤 OCR by default</span><br><span style="font-size:12px;color:#334155">Read text, lines, coordinates, and status.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #BFDBFE;border-left:none;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#172554">🌐 Web discovery</span><br><span style="font-size:12px;color:#334155">Find matching pages, images, labels, and entities.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #BFDBFE;border-left:none;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#172554">🧭 Review handoff</span><br><span style="font-size:12px;color:#334155">Keep a complete Lens result link after review.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #BFDBFE;border-left:none;border-radius:0 10px 10px 0;vertical-align:top"><span style="font-size:15px;font-weight:800;color:#172554">📦 Small batches</span><br><span style="font-size:12px;color:#334155">Process up to ten unique public images.</span></td></tr></table>

### 🎯 Who uses it?

Use reverse image search when you need to understand an image, not just download it.

- **Product teams** trace catalog photos and find pages that reuse an image.
- **Brand researchers** check where a logo, product, or campaign image appears.
- **Marketplaces** read labels and connect a picture with related listings.
- **Photographers and editors** locate source pages and other versions of an image.
- **Analysts** turn image evidence into a searchable, repeatable dataset.

### 🧭 Choose a search mode

| Mode | Best for | What you receive |
| --- | --- | --- |
| **OCR only** *(default)* | Fast, repeatable text extraction | Text, lines, paragraphs, coordinates, language, and `text_detected` or `no_text_detected` status |
| **Google Cloud Web Detection** | Finding pages and images connected to a picture | Matching pages, full and partial image matches, similar images, entities, and labels |
| **Manual Lens results URL** | A Lens result you completed in a browser | The source image, a validated results URL, and a clear review instruction |
| **Direct Lens** | Existing users with a suitable Residential Proxy | Visual or exact result tabs when the live Lens session can be verified |

The Actor keeps missing matches honest. A blocked or unverifiable visual search is reported as a failed image attempt, not as an empty match record. An image without readable text is a valid OCR result with `no_text_detected` status.

### 🪄 How it works

<table width="100%" style="display:table;width:100%;border-collapse:collapse;table-layout:fixed"><tr><td style="padding:16px 14px;width:33%;background:#EFF6FF;border:1px solid #BFDBFE;border-radius:10px 0 0 10px;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#1E3A8A;letter-spacing:1px">STEP 1</span><br><span style="font-size:14px;font-weight:700;color:#172554">Add an image</span><br><span style="font-size:12px;color:#334155">Paste one URL or a batch of up to ten.</span></td><td style="padding:16px 14px;width:33%;background:#EFF6FF;border:1px solid #BFDBFE;border-left:none;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#1E3A8A;letter-spacing:1px">STEP 2</span><br><span style="font-size:14px;font-weight:700;color:#172554">Choose the outcome</span><br><span style="font-size:12px;color:#334155">Start with OCR, web discovery, or a reviewed Lens URL.</span></td><td style="padding:16px 14px;width:33%;background:#EFF6FF;border:1px solid #BFDBFE;border-left:none;border-radius:0 10px 10px 0;vertical-align:top"><span style="font-size:12px;font-weight:800;color:#1E3A8A;letter-spacing:1px">STEP 3</span><br><span style="font-size:14px;font-weight:700;color:#172554">Use the records</span><br><span style="font-size:12px;color:#334155">Open focused views for text, matches, links, and status.</span></td></tr></table>

### 🧾 Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `imageUrl` | URL | At least one source | One public JPEG, PNG, or WebP image URL. |
| `imageUrls` | array of URLs | No | Up to ten unique public image URLs for a batch. |
| `searchType` | enum | No | `ocr_only` by default, or `all`, `visual_matches`, or `exact_matches`. |
| `visualBackend` | enum | No | `direct_lens`, `google_cloud_web_detection`, or `manual_lens_url`. |
| `googleCloudVisionApiKey` | secret | Web Detection only | Your Google Cloud key for Web Detection. You manage the account and allowance. |
| `manualLensUrl` | URL | Manual mode only | The complete HTTPS Lens results URL copied after a browser review. |
| `includeAllTabs` | boolean | No | In `all` mode, include both Visual matches and Exact matches tabs. |
| `includeOcr` | boolean | No | Add OCR text to visual or Web Detection records. |
| `language` | text | No | ISO 639-1 language code for localized results. |
| `countryCode` | text | No | Country used for the visual search locale. |
| `maxResults` | integer | No | Limit returned match records from 1 to 100. |
| `proxyConfiguration` | object | Direct visual mode only | Use Apify Residential Proxy for the live Direct Lens path. |

### 📊 Dataset views

#### 📋 Matches overview

See the image, selected mode, result source, summaries, match groups, review link, and processing time in one view.

#### 🔎 Visual and exact matches

Focus on Web Detection details, visual matches, exact matches, and any OCR attached to the result.

### 🧱 Data table

| Field | Type | Description |
| --- | --- | --- |
| `imageUrl` | string | The public image URL submitted for this record. |
| `searchType` | string | The result mode, such as `ocr_only`, `web_detection`, `manual_lens`, or a Lens match mode. |
| `visualBackend` | string | The source used for visual results, when applicable. |
| `ocr` | object | Detected text, language, lines, paragraphs, coordinates, and status. |
| `webDetection` | object | Source-derived entities, matching pages, matching images, similar images, and labels. |
| `visualMatches` | array | Pages and products that Google Lens identifies as visually related. |
| `exactMatches` | array | Pages and images that closely match the submitted image. |
| `relatedLinks` | array | Additional source links returned with a verified visual result. |
| `relatedSearches` | array | Related search phrases returned with a verified visual result. |
| `tabs` | array | Visual matches and Exact matches result-tab links. |
| `aiDescription` | string | A source-derived description when the selected Lens result provides one. |
| `searchUrl` | URL | A verified result URL or a manual browser handoff URL. |
| `manualInstructions` | string | A short instruction for reviewing a manually supplied Lens URL. |
| `scrapedAt` | timestamp | Time when the record was created. |

#### Example record

```json
{
  "imageUrl": "https://dummyimage.com/640x360/000/fff.png&text=Google+Lens+Test",
  "searchType": "ocr_only",
  "ocr": {
    "status": "text_detected",
    "language": "en",
    "fullText": "Google Lens Test",
    "lines": [
      { "text": "Google Lens Test", "x": 73, "y": 163, "width": 471, "height": 61 }
    ],
    "paragraphs": []
  },
  "scrapedAt": "2026-08-09T09:51:38.833Z"
}
```

### 💰 Pricing

Pay per valid dataset record. Failed image attempts are not added to the chargeable dataset. Empty OCR is still a valid record because it clearly reports `no_text_detected`. There is no subscription, and an empty run is not charged.

### ⭐ Enjoying Google Lens Visual Search?

<table width="100%" style="display:table;width:100%;border-collapse:collapse"><tr><td style="padding:20px 24px 14px;background:#EFF6FF;border:1px solid #BFDBFE;border-left:5px solid #1E3A8A;border-radius:10px 10px 0 0"><span style="font-size:20px;letter-spacing:4px;color:#B45309">⭐ ⭐ ⭐ ⭐ ⭐</span><br><span style="font-size:17px;font-weight:800;color:#172554">A clear image result can save your team from repetitive visual checks.</span><br><span style="font-size:14px;color:#334155">A 5-star rating helps other research, catalog, and image teams find this Actor. Your feedback guides future improvements.</span></td></tr><tr><td style="padding:0;background:#1E3A8A;border:1px solid #BFDBFE;border-top:none;border-radius:0 0 10px 10px;text-align:center"><a href="https://apify.com/getascraper/google-lens-visual-search/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a></td></tr></table>

### ❓ FAQ

#### Can I run it without a key?

Yes. OCR only is the default and needs no key. Web Detection uses your Google Cloud key, while Direct Lens may need an Apify Residential Proxy.

#### What happens when an image has no text?

The Actor returns a successful OCR record with `status: "no_text_detected"`, an empty `fullText`, and empty text arrays. That is a valid result, not fabricated text.

#### How do I get web matches?

Choose Google Cloud Web Detection and provide your own Google Cloud key. For a browser-completed Lens search, choose Manual Lens results URL and paste the complete results link.

#### Can I process multiple images?

Yes. Add up to ten unique public image URLs. Each successful image receives its own correlated dataset record.

#### What if Direct Lens cannot be verified?

The Actor keeps the failed image attempt out of the successful result dataset. Use Web Detection or a Manual Lens results URL when you need a browser-reviewed fallback.

### 🔗 Other actors

- [Google Lens OCR API: Batch Image to Text with Bounding Boxes](https://apify.com/getascraper/google-lens-ocr) ↗ - Extract searchable text and coordinates from image batches.
- [Yandex Reverse Image Scraper: Яндекс Картинки](https://apify.com/getascraper/yandex-reverse-image-scraper) ↗ - Find visually similar images, source pages, and other image sizes.
- [Bulk Image Downloader: Website Crawl, ZIP and Image Dataset](https://apify.com/getascraper/bulk-image-downloader) ↗ - Build an image dataset from public pages and direct URLs.
- [Lenskart Scraper: Eyewear Prices, Specs & Variants](https://apify.com/getascraper/lenskart-scraper) ↗ - Compare product images, variants, prices, and availability in eyewear catalogs.

# Actor input Schema

## `imageUrl` (type: `string`):

The public URL of a single image to reverse search (JPEG, PNG, WebP).

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

Paste up to 10 public HTTP(S) image URLs to search in a single batch.

## `searchType` (type: `string`):

Results type to extract (Visual matching pages vs exact duplicates vs ultra-fast OCR text).

## `visualBackend` (type: `string`):

Choose a free text/web result, a browser handoff, or the direct Lens browser path. OCR-only runs do not need a proxy or key.

## `googleCloudVisionApiKey` (type: `string`):

Optional secret key used only with Google Cloud Web Detection. Google Cloud includes a monthly free allowance; you manage the key and billing account.

## `manualLensUrl` (type: `string`):

Paste the complete HTTPS Lens results URL from a browser after you solve any interactive challenge. The Actor returns the handoff URL without claiming it contains machine-fetched matches.

## `includeAllTabs` (type: `boolean`):

In All results mode, also fetches Visual matches and Exact matches. Extra tabs add browser time and proxy traffic.

## `includeOcr` (type: `boolean`):

Extract text from the already downloaded image with the direct OCR endpoint.

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

ISO 639-1 language code for localized search and OCR results.

## `countryCode` (type: `string`):

Residential proxy country and Google result locale for visual browser modes.

## `maxResults` (type: `integer`):

Maximum number of visual links and related matches to save.

## `proxyConfiguration` (type: `object`):

Required for visual browser modes. Apify Residential Proxy is enforced; OCR-only does not use a proxy.

## Actor input object example

```json
{
  "imageUrl": "https://dummyimage.com/640x360/000/fff.png&text=Google+Lens+Test",
  "imageUrls": [],
  "searchType": "ocr_only",
  "visualBackend": "direct_lens",
  "includeAllTabs": false,
  "includeOcr": false,
  "language": "en",
  "countryCode": "US",
  "maxResults": 25,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "imageUrl": "https://dummyimage.com/640x360/000/fff.png&text=Google+Lens+Test",
    "imageUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/google-lens-visual-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 = {
    "imageUrl": "https://dummyimage.com/640x360/000/fff.png&text=Google+Lens+Test",
    "imageUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/google-lens-visual-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 '{
  "imageUrl": "https://dummyimage.com/640x360/000/fff.png&text=Google+Lens+Test",
  "imageUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call getascraper/google-lens-visual-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/google-lens-visual-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/IQNVK9GGbkkLndLKu/builds/BI3jgUFpLZqHNR1pL/openapi.json
