SEO Service Area Visibility Checker avatar

SEO Service Area Visibility Checker

Pricing

from $5.00 / 1,000 results

Go to Apify Store
SEO Service Area Visibility Checker

SEO Service Area Visibility Checker

Check a target domain's Google SERP visibility across multiple cities and keywords. Returns per-(keyword,city) rank and top competitors, plus a summary visibility score.

Pricing

from $5.00 / 1,000 results

Rating

5.0

(10)

Developer

Crawler Bros

Crawler Bros

Maintained by Community

Actor stats

11

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Track a target domain's Google SERP rank across multiple keywords × cities. Emits one row per (keyword, city) pair plus a summary row with visibility score and top competitors.

What this actor extracts

Per (keyword, city) row (type="visibility_row"):

  • keyword, city, country, targetDomain
  • rank (1-based; 0 if not in top N)
  • inTopResults, resultCount
  • serpRows (list of {rank, domain, title, url})
  • scrapedAt

Summary row (type="visibility_summary", emitted once at end):

  • targetDomain, totalQueries, successfulQueries, failedQueries, rankedQueries
  • visibilityScore (% — higher is better; sum(1/rank) / successful * 100)
  • citiesCovered, citiesMissing (sorted lists)
  • topCompetitors (top 10 domains by appearance count)
  • scrapedAt

Input

FieldTypeDescription
targetDomainstringDomain to track (e.g. "example.com"). Required.
keywordsstring[]List of service keywords (e.g. "plumber"). Required.
citiesstring[]Service area cities. Required.
countryenumGoogle gl code (default us).
languageenumGoogle hl code (default en).
maxResultsintegerOrganic results per query (1-20, default 10).
includeCompetitorsbooleanInclude top competitors in summary row.

How it works

For each (keyword, city) pair the actor:

  1. Builds a UULE-encoded Google Search URL with the city as location context.
  2. Fetches the SERP via curl_cffi (Chrome TLS fingerprint) through a fresh Apify RESIDENTIAL proxy session.
  3. Parses organic results from div#rso > div.MjjYud / div.g with BeautifulSoup.
  4. Finds the target domain's rank (1-based) among organic results.
  5. Tracks competitors across all queries.

At the end it emits one summary row with the overall visibility score and city coverage.

  • Hardcoded RESIDENTIAL proxy pool; country follows the country input.
  • No cookies or login required.
  • 1024 MB memory.

Limitations

  • UULE coverage: Google respects UULE for most cities in supported countries. Small / ambiguous city names may fall back to the country-level SERP.
  • Rate limits: Google rate-limits aggressively. Each query rotates proxy session.
  • 20 results max: Google's num param caps at 20 results per page.
  • SERP shape drift: If Google changes its card CSS classes the parser may return zero results per query. Report a drift and we'll update.

FAQ

Do I need a Google API key? No — we scrape public HTML SERPs directly.

Does it respect robots.txt? Google's robots.txt disallows /search. This actor is for legitimate SEO tracking of your own domains.

How is visibilityScore calculated? sum(1/rank for each ranked query) / successfulQueries * 100. A domain ranked #1 on every query gets 100; #2 everywhere gets 50; not-ranked queries contribute 0.