Google Lens API

Give it any image and get ranked matches back as JSON. Three lookup types cover the distinct jobs: visual matches for similar images, products for shoppable listings with price and stock, and exact matches for every page using that same image, which is how you check attribution or find unlicensed reuse. Images can be a public URL, an upload from your computer, or raw base64.

RECORDS3
MEDIAN LAGon demand
PARAMETERS8
TOTAL USERS2
MONTHLY ACTIVE2
TOTAL RUNS791
SUCCESS (30D)100.0%
RATINGno ratings yet
LAST MODIFIED2026-08-08
PUBLISHED2026-08

Input parameters

PARAMETERTYPEREQDEFAULTDESCRIPTION
image_url string no A public http or https link to the image. Also accepts a data URI.
image_upload string[] no Upload up to 10 images from your computer, or point at files already stored on Apify. Takes priority over image_url.
image_base64 string[] no Raw image bytes as base64, one entry per image, with or without the data URI prefix. Built for API and automation callers holding a local file.
search_type enum no visual_matches visual_matches for similar images, products for shoppable listings with price and stock, exact_matches for pages using the identical image.
query string no Optional words to narrow the results, such as 'blue' or 'leather'. Applies to visual matches and products only.
max_results integer no 50 How many matches to return. One lookup yields roughly 59 visual matches, 19 products, or up to 400 exact matches. — drives your bill
country string no Two letter country code, which shifts regional results and shopping listings.
language string no Two letter language code. Match coverage genuinely varies by language.

Worked examples

Basic — reverse image search from a URL
{
  "image_url": "https://example.com/photo.jpg",
  "max_results": 20
}
Attribution check — every page using this exact image
{
  "image_url": "https://example.com/my-photo.jpg",
  "search_type": "exact_matches",
  "max_results": 100
}
Shoppable matches — product rows carry price, currency and stock
{
  "image_url": "https://example.com/sneaker.jpg",
  "search_type": "products",
  "query": "leather"
}
Upload a batch — up to 10 local images, no public link needed
{
  "image_base64": ["", ""],
  "search_type": "exact_matches"
}
POWER-USER TIP
Uploads are staged behind a signed private link — An uploaded or base64 image is written to your run's own key-value store and handed upstream as a signed URL. It is never published anywhere else, and the link stops working when the store expires. Note that very large base64 payloads exceed the MCP request limit, so agent callers should prefer image_url or the console upload.
POWER-USER TIP
Coverage varies by subject — Product photos and recognisable objects return dense match sets. Landmarks and artworks sometimes return nothing at all for visual matches, which is an upstream coverage gap rather than a failure. Exact matches are the more reliable mode for attribution work.

Coverage

3
lookup types — visual matches · products · exact matches
10
images per run — batch upload or base64
400
matches per lookup — up to 400 exact · ~59 visual · ~19 product

Tasks

Saved runs with the inputs already filled in — each one a standalone page and a working configuration example.

Request a task →

Code

curl

curl -X POST "https://api.apify.com/v2/acts/johnvc~google-lens-api/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"image_url":"https://example.com/photo.jpg","search_type":"exact_matches","max_results":25}'

Python

from apify_client import ApifyClient

client = ApifyClient("APIFY_TOKEN")
run = client.actor("johnvc/google-lens-api").call(
    run_input={"image_url": "https://example.com/photo.jpg", "search_type": "exact_matches", "max_results": 25}
)
for match in client.dataset(run.default_dataset_id).iterate_items():
    print(match.get("title"), "-", match.get("source"), match.get("url"))

What people use it for

Alternatives