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

Reverse image search via Google Lens. Get visual matches, exact matches, AI image descriptions, related links, and OCR text with bounding boxes for up to 10 images per run. OCR-only mode is fast and needs no proxy; visual modes run on a residential proxy and retry automatically.

- **URL**: https://apify.com/getascraper/google-lens-visual-search.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** SEO tools, AI, Automation
- **Features:** Limited permissions
- **Stats:** 94 total users, 21 monthly users, 84.8% 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?

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 Lens Search: Reverse Image Finder & OCR

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed;margin-bottom:0">
<tr>
<td colspan="3" style="padding:14px 18px;background:#EEF2FF;border:none;border-top:3px solid #0F172A;border-left:1px solid #C7D2FE;border-right:1px solid #C7D2FE;color:#1C1917;border-radius:10px 10px 0 0">
<span style="font-size:16px;font-weight:700;color:#1C1917">Part of the Reverse Image Search &amp; Brand-Protection Monitoring suite.</span> <span style="font-size:15px;color:#57534E">Three ways to trace an image: search Google Lens, search Yandex, or watch for new copies over time.</span>
</td>
</tr>
<tr>
<td colspan="3" style="padding:10px 14px;background:#0F172A;border:none;border-left:1px solid #C7D2FE;border-right:1px solid #C7D2FE;color:#FFFFFF">
<span style="color:#FFFFFF;font-size:14px;font-weight:700;letter-spacing:0.5px">REVERSE IMAGE SEARCH &amp; BRAND-PROTECTION MONITORING</span>
<span style="color:#FFFFFF;font-size:13px">&nbsp;&nbsp;&bull;&nbsp;&nbsp;Find matches, verify duplicates, and get alerted the moment a new one appears</span>
</td>
</tr>
<tr>
<td style="padding:10px 12px;border:none;border-left:1px solid #C7D2FE;border-bottom:1px solid #C7D2FE;vertical-align:top;width:33.333%;background:#EEF2FF;color:#1C1917">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-IQNVK9GGbkkLndLKu-9wOM9ttWwN-CompressJPEG.Online_img%28512x512%29_%2823%29.jpg" width="20" height="20" style="vertical-align:middle;border-radius:4px">&nbsp;<a href="https://apify.com/getascraper/google-lens-visual-search" style="color:#0F172A;text-decoration:none;font-weight:700;font-size:13px">Google Lens Visual Search</a></span><br>
<span style="color:#0F172A;font-size:11px;font-weight:700">&#10148; You are here</span>
</td>
<td style="padding:10px 12px;border:none;border-left:1px solid #C7D2FE;border-bottom:1px solid #C7D2FE;vertical-align:top;width:33.333%;background:#FFFFFF;color:#1C1917">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-zJPIMSqAhq2XyxfT2-PK0RBHGsbd-NWYsOG96fMDy8ycdf-actor-fRSgBvgbsRB4o7t30-UkaIbH1Yhq-yandex-maps" width="20" height="20" style="vertical-align:middle;border-radius:4px">&nbsp;<a href="https://apify.com/getascraper/yandex-reverse-image-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Yandex Reverse Image Scraper</a></span><br>
<span style="color:#57534E;font-size:11px">Batch reverse image search across Yandex Images</span>
</td>
<td style="padding:10px 12px;border:none;border-left:1px solid #C7D2FE;border-right:1px solid #C7D2FE;border-bottom:1px solid #C7D2FE;vertical-align:top;width:33.333%;background:#FFFFFF;color:#1C1917">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-5RMQSYLeJDninvuBb-a0tsy9XOpR-search-research-find-blue-dotted-line-line-icon-free-vector.jpg" width="20" height="20" style="vertical-align:middle;border-radius:4px">&nbsp;<a href="https://apify.com/getascraper/reverse-image-search-monitor" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Reverse Image Search Monitor</a></span><br>
<span style="color:#57534E;font-size:11px">Discovers matches and alerts on new copies over time</span>
</td>
</tr>
</table>
<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;margin-top:0;margin-bottom:0"><tr><td style="padding:24px 28px;background:#EEF2FF;border:1px solid #C7D2FE;border-top:none;color:#1C1917"><span style="font-size:23px;font-weight:800;color:#1E293B;line-height:1.3">Turn public image URLs into useful visual-search records.</span><br><span style="font-size:15px;color:#475569;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:separate;border-spacing:0;table-layout:fixed;margin-top:0"><tr><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C7D2FE;vertical-align:top;border-top:none;color:#1C1917;border-radius:0 0 0 10px"><span style="font-size:15px;font-weight:800;color:#1E293B">🔤 OCR by default</span><br><span style="font-size:12px;color:#475569">Read text, lines, coordinates, and status.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C7D2FE;border-left:none;vertical-align:top;border-top:none;color:#1C1917"><span style="font-size:15px;font-weight:800;color:#1E293B">🌐 Web discovery</span><br><span style="font-size:12px;color:#475569">Find matching pages, images, labels, and entities.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C7D2FE;border-left:none;vertical-align:top;border-top:none;color:#1C1917"><span style="font-size:15px;font-weight:800;color:#1E293B">🧭 Review handoff</span><br><span style="font-size:12px;color:#475569">Keep a complete Lens result link after review.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #C7D2FE;border-left:none;vertical-align:top;border-top:none;color:#1C1917;border-radius:0 0 10px 0"><span style="font-size:15px;font-weight:800;color:#1E293B">📦 Small batches</span><br><span style="font-size:12px;color:#475569">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** | Reverse image search with Google Lens results | Visual matches, exact matches, an AI description of the image, and related links. Runs through the default Apify proxy, which is preselected. |

Switch Search Mode to a visual option (All results, Visual matches, or Exact matches) to use Direct Lens. When Google briefly refuses a search, the Actor retries automatically with a fresh connection. If it still cannot get verified results, the image is reported as a failed 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:separate;border-spacing:0;table-layout:fixed"><tr><td style="padding:16px 14px;width:33%;background:#EEF2FF;border:1px solid #C7D2FE;border-radius:10px 0 0 10px;vertical-align:top;color:#1C1917"><span style="font-size:12px;font-weight:800;color:#0F172A;letter-spacing:1px">STEP 1</span><br><span style="font-size:14px;font-weight:700;color:#1E293B">Add an image</span><br><span style="font-size:12px;color:#475569">Paste one URL or a batch of up to ten.</span></td><td style="padding:16px 14px;width:33%;background:#EEF2FF;border:1px solid #C7D2FE;border-left:none;vertical-align:top;color:#1C1917"><span style="font-size:12px;font-weight:800;color:#0F172A;letter-spacing:1px">STEP 2</span><br><span style="font-size:14px;font-weight:700;color:#1E293B">Choose the outcome</span><br><span style="font-size:12px;color:#475569">Start with OCR, web discovery, or a reviewed Lens URL.</span></td><td style="padding:16px 14px;width:33%;background:#EEF2FF;border:1px solid #C7D2FE;border-left:none;border-radius:0 10px 10px 0;vertical-align:top;color:#1C1917"><span style="font-size:12px;font-weight:800;color:#0F172A;letter-spacing:1px">STEP 3</span><br><span style="font-size:14px;font-weight:700;color:#1E293B">Use the records</span><br><span style="font-size:12px;color:#475569">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 | Connection for the live Direct Lens path. The default Apify proxy is preselected. |

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

Each entry in `visualMatches`, `exactMatches`, and `relatedLinks` carries these fields. The optional ones appear only when Google shows them on the result card.

| Match field | Type | Description |
| --- | --- | --- |
| `position` | integer | Rank of the match in its list, starting at 1. |
| `title` | string | The result title. |
| `link` | URL | The real page or product page, not a Google redirect. |
| `source` | string | The website the match comes from. |
| `thumbnail` | URL | The matched image preview, when available. |
| `price` | string | The price exactly as Google displays it, for example `$26.99`. |
| `inStock` | boolean | `true` or `false` when the card states the stock status. |
| `imageWidth`, `imageHeight` | integer | Size of the matched image in pixels, when Google states it. |

#### 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, plus a small fee when a run starts. Failed image attempts are not added to the chargeable dataset, and a run in which no image link works is not charged for results. Empty OCR is still a valid record because it clearly reports `no_text_detected`. There is no subscription, and an empty run pays only the start fee.

### ⭐ Enjoying Google Lens Visual Search?

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0"><tr><td style="padding:20px 24px 14px;background:#EEF2FF;border:1px solid #C7D2FE;border-left:5px solid #0F172A;border-radius:10px 10px 0 0;color:#1C1917"><span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br><span style="font-size:17px;font-weight:800;color:#1E293B">A clear image result can save your team from repetitive visual checks.</span><br><span style="font-size:14px;color:#475569">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:#0F172A;border:1px solid #0F172A;border-left:5px solid #0F172A;border-top:none;border-radius:0 0 10px 10px;text-align:center;color:#FFFFFF"><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 or proxy. Direct Lens needs no key and runs through the default Apify proxy. Web Detection is optional and uses your own Google Cloud key.

#### 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 visual matches?

Set Search Mode to All results or Visual matches and keep Direct Lens as the source. For Web Detection pages and entities, 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 an image link does not work?

Visual searches need a direct, public link to an image. If a site blocks automated downloads, or the image is in a format such as GIF or AVIF, Google Lens searches it straight from the link. If the link is broken for everyone, for example a missing page or a web page instead of an image, the run finishes with a short message naming the link and the reason, and the `RUN_SUMMARY` record lists every image that could not be used. You are not charged for those images.

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

The Actor keeps the failed image attempt out of the successful result dataset, so you are not charged for it. Try the run again, or use Web Detection or a Manual Lens results URL when you need a fallback.

### 🔗 Other actors

- [Google Lens OCR API: Batch Image to Text with Bounding Boxes](https://apify.com/getascraper/google-lens-ocr) ↗ - Its OCR-only sibling, built for batch text extraction rather than visual search.
- [Yandex Reverse Image Scraper: Яндекс Картинки](https://apify.com/getascraper/yandex-reverse-image-scraper) ↗ - Find visually similar images, source pages, and other image sizes.
- [Reverse Image Search Monitor: Discover, Verify & Track Matches](https://apify.com/getascraper/reverse-image-search-monitor) ↗ - Discover candidate matches automatically and get alerted when a new one appears.
- [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.

# Changelog

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

# 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`):

Country used for the connection and the Google result locale in visual browser modes.

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

Maximum number of visual links and related matches to save.

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

Connection used by the visual browser modes. The default Apify proxy is set up for you and works for most runs; 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
  }
}
```

# 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
    }
};

// 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 },
}

# 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
  }
}' |
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/sQX4bA6IMOWbQxdSC/openapi.json
