
Website Content Crawler
scrape.ly/store/querystone/website-content-crawlerAIDeveloper tools
1 monthly user

Reverse image search with Google Lens: visual matches, pages that contain the image, and exact matches, with page title, URL, site, thumbnail and full image URL.
Reverse image search at scale. Give it image URLs or base64 images and get back every page Google Lens matches: page title, link, site, thumbnail and the full-size image URL. No Google account, no API key, no browser setup. Results land in a clean table you can export to JSON, CSV or Excel.
| Field | What it does |
|---|---|
| Image URLs | Public JPEG, PNG, GIF or WebP URLs, up to 8 MB each. Duplicates are skipped. You can also link a plain-text file with one image URL per line. |
| Base64 images | Raw base64 or data:image/... URIs for small images that are not hosted online (see Limits). |
| Max results per match type | How many matches to keep per image and match type. Default 20. |
| Match types | visual-match, all, exact-match. Default visual-match. |
| Results language | Interface language for the Lens page, such as en, de or fr. |
| Proxy | Used to download your image URLs and resolve exact-match links. Datacenter by default. |
{
"imageUrls": [
{ "url": "https://upload.wikimedia.org/wikipedia/commons/a/a3/Eq_it-na_pizza-margherita_sep2005_sml.jpg" }
],
"searchTypes": ["visual-match", "all"],
"maxResults": 20,
"language": "en"
}
One row per match. Images that give no matches get one status row with the error column filled.
| Field | Meaning |
|---|---|
| searchType | visual-match, all or exact-match |
| position | Rank within that match type |
| title | Title of the matching page |
| link | URL of the matching page |
| source | Site name as Lens shows it |
| domain | Hostname of the page |
| thumbnail | Lens preview image URL |
| imageUrl | Full-size image URL on the matching site (visual-match and all) |
| imageWidth, imageHeight | Size of the matched image in pixels |
| date | Publication date Lens shows (exact matches) |
| price | Price and stock text Lens shows for shop pages (exact matches) |
| inputUrl | Your image URL, or base64:N |
| error | Why an image produced no matches; empty on match rows |
Example rows from a real run:
[
{
"searchType": "visual-match",
"position": 8,
"title": "Marinara sauce - Mayo Clinic Press",
"link": "https://mcpress.mayoclinic.org/health-letter/marinara-sauce/",
"source": "Mayo Clinic",
"domain": "mcpress.mayoclinic.org",
"thumbnail": "https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcTEa3uwXXGIU5Koezl7eLEzuJh-D25Pkc-qBDiabeyVMKEBNxJT",
"imageUrl": "https://mcpress.mayoclinic.org/uploads/2026/03/MarinaraSaucexGettyImages-707588669-1120x640.jpg",
"imageWidth": 1120,
"imageHeight": 640,
"date": null,
"price": null,
"inputUrl": "https://upload.wikimedia.org/wikipedia/commons/a/a3/Eq_it-na_pizza-margherita_sep2005_sml.jpg"
},
{
"searchType": "exact-match",
"position": 1,
"title": "Learn How To Make A Perfect Margherita Pizza - Italy Villas",
"link": "https://www.italy-villas.com/to-italy/2015/food-and-wine/recipes/pizza-margherita-recipe",
"source": "Italy Villas",
"domain": "italy-villas.com",
"thumbnail": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTDFBtOB0m_ufgeBENxH08FiMUb3Xr8PDXWQbxbxANVQ2--LBTHXSj6l9Gd&s",
"imageUrl": null,
"imageWidth": 1024,
"imageHeight": 768,
"date": "Sep 23, 2015",
"price": null,
"inputUrl": "https://upload.wikimedia.org/wikipedia/commons/a/a3/Eq_it-na_pizza-margherita_sep2005_sml.jpg"
}
]
OUTPUT record (failedInputs). No start fee.Is it legal to scrape Google Lens? It reads public search results only, the same pages anyone can open without logging in. You are responsible for how you use the data, especially personal data and copyrighted images.
Do I need a Google account, cookies or my own proxy? No. The lookup runs in a hosted browser with its own network. The proxy setting only affects downloading your image URLs and resolving exact-match links.
How many results can I get per image? As many as Lens shows: usually 40 to 60 visual matches, a similar number of pages with the image, and up to about 150 exact matches. Set Max results per match type higher to keep all of them.
Why are some fields empty? Lens does not show every detail for every match. Full image URLs exist for visual matches and pages-with-this-image; dates, image sizes and prices appear mostly on exact matches.
What happens when Google blocks a lookup? The image is retried on fresh browser sessions. If Lens still refuses, the image gets a status row and the run moves on to the next image.
Can I schedule it or call it from code? Yes. Use the scheduler for recurring runs, or start runs and read the dataset through the API and client libraries.
position, title, link, source and thumbnail; web results use link instead of href, and every match is its own row instead of a nested list.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
imageUrlsarrayOptionalImage URLs
Public image URLs (JPEG, PNG, GIF or WebP, up to 8 MB). Duplicates are skipped.
imagesBase64arrayOptionalBase64 images
Images as raw base64 or a data URI, for images that are not hosted at a public URL.
maxResultsintegerOptionaldefault 20Max results per match type
How many matches to save for each selected match type, per image. Lens itself shows roughly 50 to 150 matches per type, and the run saves all it shows when the value is higher.
searchTypesarrayOptionaldefault ["visual-match"]Match types
Which Lens tabs to read. Visual matches: similar images and the pages that show them. All: pages that contain this image or a near copy. Exact matches: pages with the very same image, with date and size.
languagestringOptionaldefault "en"Results language
Interface language code for the Lens results page, such as en, de or fr.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Used to download your image URLs and to resolve exact-match links. The Lens lookup itself runs in the hosted browser with its own network.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| searchType | string | null | visual-match, all or exact-match. Empty on a status row. |
| position | integer | null | Rank within its match type. |
| title | string | null | Title of the matching page. |
| link | string | null | URL of the matching page. |
| source | string | null | Site name as Lens shows it. |
| domain | string | null | Hostname of the page, without www. |
| thumbnail | string | null | Lens preview image URL. |
| imageUrl | string | null | Full-size image URL on the matching site (visual-match and all). |
| imageWidth | integer | null | Width of the matched image in pixels. |
| imageHeight | integer | null | Height of the matched image in pixels. |
| date | string | null | Publication date Lens shows for exact matches. |
| price | string | null | Price and stock text Lens shows for product pages. |
| inputUrl | string | The image URL, or base64:N for the N-th base64 image. |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Result | One Google Lens match saved to the dataset. | $0.0008 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('querystone/google-lens-scraper').call({
"imageUrls": [
{
"url": "https://upload.wikimedia.org/wikipedia/commons/a/a3/Eq_it-na_pizza-margherita_sep2005_sml.jpg"
}
],
"maxResults": 20,
"searchTypes": [
"visual-match"
],
"language": "en",
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run querystone/google-lens-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=querystone/google-lens-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Pages that use the exact same image.
All Google Lens results for an image link.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.