Skip to main content
Thirdwatchthirdwatch
Business & local data

Audit Image SEO Presence for Product Keywords

Check which of your product keywords surface your images in Google Images — export ranked results with domains and positions as JSON.

Sep 21, 2026 · 2 min read · 416 words
See the scraper →

TL;DR — The Google Images Scraper exports ranked image results per keyword — domain, position, source page. Filter to your domain to measure whether your product photography actually surfaces where customers look.

Why image SEO is invisible until you measure it

Teams spend on product photography, then never check whether the photos rank. Image results occupy prime SERP real estate for product queries — a grid of thumbnails is the first thing a searcher sees — yet most SEO dashboards ignore it.

The measurement is simple: for your keyword list, which domains own the top positions, and is yours among them?

How does this compare to the alternatives?

Manual checks SEO suite add-ons Thirdwatch actor
Cost Free, unscalable Bundled tiers Pay per result
Reliability Spotty Good Scriptable
Setup time Zero Tool onboarding Minutes
Maintenance Repeat manually Vendor Scheduled runs

How to audit image rankings in 4 steps

How do I pull the keyword set?

import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("thirdwatch/google-images-scraper").call(
    run_input={
        "queries": ["ergonomic laptop stand", "walnut monitor riser"],
        "maxResults": 50, "country": "us", "language": "en",
    }
)
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())

How do I measure presence?

import pandas as pd
df = pd.DataFrame(rows)
mine = df[df.domain.str.contains("yourstore.com")]
print(mine[["query", "position", "imageUrl"]])

No rows = no presence. That gap is the audit finding.

How do I see who beats me?

print(df[df.position <= 10].groupby("domain").size())

The top-10 domain counts are the competitive set — the pages (sourcePageUrl) you need to out-optimize.

How do I track it monthly?

Store each run keyed by date; position deltas per imageUrl show movement. Keep country/language fixed or trends conflate market changes with rank changes.

Sample output

{"imageUrl": "https://yourstore.com/img/stand-hero.jpg",
 "width": 1600, "height": 1200,
 "sourcePageUrl": "https://yourstore.com/products/stand",
 "domain": "yourstore.com",
 "query": "ergonomic laptop stand", "position": 6}

Common pitfalls

Image rank is personalized — treat positions as directional, pin market settings, and aggregate across runs. CDN domains can mask your host; check sourcePageUrl for the real page. New images take weeks to enter the index — absence today isn't absence forever. The actor measures; the optimization work is page-side.

Related use cases

Frequently asked questions

How do I check if my images rank for a keyword?

Run the keyword as a query, then filter returned records to your domain. The position field is the rank — your presence (or absence) in the first page of image results.

Can I track rankings over time?

Yes. Scheduled runs with fixed country and language produce comparable snapshots; join on imageUrl and domain to watch positions move.

What decides image ranking?

Google weighs the host page's authority and the image's context. The records give you sourcePageUrl — audit the winning pages' context to see what you're competing against.

Does it work for local markets?

Set country to your market — image results localize, so a US presence doesn't guarantee a DE presence.

Related

Try it yourself

100 free credits, no credit card.

About 30 real searches. Add the MCP to Claude or Cursor in two minutes.