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
| PARAMETER | TYPE | REQ | DEFAULT | DESCRIPTION |
|---|---|---|---|---|
| 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
{
"image_url": "https://example.com/photo.jpg",
"max_results": 20
}
{
"image_url": "https://example.com/my-photo.jpg",
"search_type": "exact_matches",
"max_results": 100
}
{
"image_url": "https://example.com/sneaker.jpg",
"search_type": "products",
"query": "leather"
}
{
"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.
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
- Finding unlicensed reuse of your photography
- Image attribution and licensing audits
- Visual product matching for ecommerce catalogues
- Dropship and counterfeit listing discovery
- Feeding an AI agent visual lookup as a tool