Google Rank Tracking for SERP & Maps avatar

Google Rank Tracking for SERP & Maps

Pricing

from $7.20 / 1,000 organic positions

Go to Apify Store
Google Rank Tracking for SERP & Maps

Google Rank Tracking for SERP & Maps

Track a submitted website domain in Google organic results for each keyword, or check a business across a Google Maps grid. Get positions, result details, local competitors, visibility summaries, and coverage status for a chosen country and language.

Pricing

from $7.20 / 1,000 organic positions

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

SEO teams, agencies, and site owners can check a website's Google organic position or a business's Google Maps visibility for a list of keywords. The Actor returns positions, search result details, coverage status, visibility summaries, local competitors, market findings, and repeat-check history when available. It reads public Google Search and Google Maps results, so it does not read private Google Search Console data.

📊 Google positions, result evidence, and local visibility

Each dataset row has a result type, Google country, and Google language. Organic rows include the tracked domain position, organic Google results, history, movement alerts, related queries, People Also Ask questions, answer features, paid results, and a visibility summary. Local rows include business details, a scan grid, positions at grid points, competitors, coverage, market density, opportunity areas, review synthesis, a market report, history, and change alerts. A null position means the tracked domain or business was not found within the checked depth or at that grid point. Access status and coverage show when a check is partial.

▶️ Run a Google ranking check

  1. Choose Organic rank tracking or Local rank tracking.
  2. Add your keywords, Google country, and Google language. For an organic check, add the website domain, depth, and movement threshold. For a local check, add the business, scan center, radius, grid resolution, and priority lens.
  3. Run the Actor and open the dataset. Each row keeps the country and language used for its Google check.

Repeat a check with the same settings when you want available history or movement alerts. Google can return partial coverage, so read the status fields before using a position in a report.

⚙️ Input

Choose one result family. Complete the fields for that choice; fields in the other choice are ignored. Keywords, country, and language apply to both choices.

Input fields

FieldTypeWhat it does
resultTypestringChoose organic to check a website in Google Search or local to check a business across a Google Maps grid.
websiteDomainstringDomain to track without https:// or a path. Required for Organic rank tracking and ignored for local checks.
organicDepthintegerNumber of organic result positions to check for each keyword. A not-found position means the domain was not seen within this depth. Default: 100.
organicMovementThresholdintegerNumber of positions a repeat organic check must move to create an alert. Use 1 to flag any position change. Default: 3.
localBusinessNamestringPublic business name to find in Google Maps. Required for Local rank tracking.
localBusinessAddressstringAddress that helps match the right Google Maps listing. Leave it blank when the name is enough.
localScanCenterobjectCenter of the local grid, with latitude and longitude in decimal degrees.
localScanCenter.latitudenumberLatitude from -90 to 90.
localScanCenter.longitudenumberLongitude from -180 to 180.
localScanRadiusKmnumberDistance from the scan center covered by the local grid, in kilometers. Default: 5.
localGridResolutionstringNumber of points on each grid side: 3x3, 5x5, or 7x7. Default: 5x5.
localPrioritizationstringLens used to put local market findings first: opportunity, visibility, or competition. Default: opportunity.
keywordsarray of stringsOne or more search terms. Organic checks the domain for each keyword. Local checks the business at each grid point for each keyword.
countryCodestringUppercase two-letter ISO 3166-1 country code, such as US, used for every Google check. Default: US.
languageCodestringLanguage code such as en or fr. Use a language-region code such as en-US when needed. Default: en.

Example input

The following payload is copied from the successful hosted default-input run. For an organic check of your own site, also provide websiteDomain.

{
"resultType": "organic",
"organicDepth": 100,
"organicMovementThreshold": 3,
"localScanRadiusKm": 5,
"localGridResolution": "5x5",
"localPrioritization": "opportunity",
"keywords": [
"seo tools"
],
"countryCode": "US",
"languageCode": "en"
}

🧾 Output

Each dataset item is one of two mutually exclusive shapes. The tables below include the shared fields and every nested field in each shape. Types such as integer or null show when the schema uses null to mean that Google did not return a position or value.

Organic output shape

FieldTypeWhat it does
resultTypestringorganic for this row.
countryCodestringTwo-letter Google country context.
languageCodestringGoogle language context.
organicobjectOrganic tracking branch.
organic.websiteDomainstringDomain checked in Google Search.
organic.checkedDepthintegerNumber of organic positions checked for each keyword.
organic.movementThresholdintegerPosition change needed to create a movement alert.
organic.coverageobjectCoverage of the submitted organic keyword checks.
organic.coverage.statusstringWhether the requested organic checks reached the requested depth: complete or partial.
organic.coverage.requestedKeywordsintegerNumber of keywords submitted for the run.
organic.coverage.completedKeywordsintegerNumber of submitted keywords with a successful result.
organic.keywordResultsarray of objectsOrganic result and available Google evidence for each keyword.
organic.keywordResults[].keywordstringKeyword checked in Google Search.
organic.keywordResults[].positioninteger or nullTracked domain position. Null means the domain was not seen within the checked depth.
organic.keywordResults[].accessStatusstringWhether Google returned the requested depth for the keyword: complete or partial.
organic.keywordResults[].organicResultsarray of objectsOrganic Google results seen for the keyword.
organic.keywordResults[].organicResults[].positionintegerOrganic result position.
organic.keywordResults[].organicResults[].titlestringResult title shown by Google.
organic.keywordResults[].organicResults[].urlstringResult page URL.
organic.keywordResults[].organicResults[].domainstringResult domain used to compare competing domains.
organic.keywordResults[].organicResults[].displayedUrlstring, when availableURL text shown by Google.
organic.keywordResults[].organicResults[].snippetstring, when availableResult snippet shown by Google.
organic.keywordResults[].organicResults[].sourceNamestring, when availableSource name shown by Google.
organic.keywordResults[].historyarray of objectsPrior checks for the keyword when history is available.
organic.keywordResults[].history[].checkedAtstringTime of the prior check.
organic.keywordResults[].history[].positioninteger or nullPrior position. Null means the domain was not found within that check depth.
organic.keywordResults[].movementAlertsarray of objectsMaterial position changes for the keyword.
organic.keywordResults[].movementAlerts[].kindstringMovement type: gain, loss, entry, or dropout.
organic.keywordResults[].movementAlerts[].previousPositioninteger or nullEarlier position, or null when the domain was not found then.
organic.keywordResults[].movementAlerts[].currentPositioninteger or nullCurrent position, or null when the domain is not found within the current depth.
organic.keywordResults[].movementAlerts[].thresholdintegerThreshold that triggered the alert.
organic.keywordResults[].movementAlerts[].checkedAtstringTime of the current check.
organic.keywordResults[].relatedQueriesarray of stringsRelated Google query suggestions when available.
organic.keywordResults[].peopleAlsoAskarray of objectsPeople Also Ask questions shown by Google.
organic.keywordResults[].peopleAlsoAsk[].questionstringPeople Also Ask question.
organic.keywordResults[].featuredAnswerobject or nullFeatured answer content when Google shows it.
organic.keywordResults[].featuredAnswer.contentstringFeatured answer content.
organic.keywordResults[].featuredAnswer.sourceNamestring, when availableFeatured answer source name.
organic.keywordResults[].featuredAnswer.sourceUrlstring, when availableFeatured answer source URL.
organic.keywordResults[].aiOverviewobject or nullAI Overview content when Google shows it.
organic.keywordResults[].aiOverview.contentstringAI Overview content.
organic.keywordResults[].aiOverview.sourcesarray of objectsSources cited by the AI Overview.
organic.keywordResults[].aiOverview.sources[].titlestringCited source title.
organic.keywordResults[].aiOverview.sources[].urlstringCited source URL.
organic.keywordResults[].paidResultsarray of objectsPaid search ads and shopping results when Google provides them.
organic.keywordResults[].paidResults[].kindstringPaid result kind: searchAd or shopping.
organic.keywordResults[].paidResults[].positioninteger, when availablePaid result position.
organic.keywordResults[].paidResults[].titlestring, when availablePaid result title.
organic.keywordResults[].paidResults[].urlstring, when availablePaid result URL.
organic.keywordResults[].paidResults[].displayedUrlstring, when availablePaid result URL text.
organic.keywordResults[].paidResults[].snippetstring, when availablePaid result snippet.
organic.keywordResults[].paidResults[].sourceNamestring, when availablePaid result source name.
organic.keywordResults[].paidResults[].pricestring, when availableDisplayed shopping price.
organic.visibilitySummaryobjectAggregate organic visibility across the submitted keywords.
organic.visibilitySummary.averagePositionnumber or nullAverage tracked domain position across found keywords.
organic.visibilitySummary.bestPositioninteger or nullBest tracked domain position across found keywords.
organic.visibilitySummary.top3CountintegerNumber of submitted keywords where the domain reached the top three.
organic.visibilitySummary.top10CountintegerNumber of submitted keywords where the domain reached the top ten.

Organic example row

This is a complete row from a successful current-beta organic run.

{
"resultType": "organic",
"countryCode": "US",
"languageCode": "en",
"organic": {
"websiteDomain": "example.com",
"checkedDepth": 100,
"movementThreshold": 3,
"coverage": {
"status": "complete",
"requestedKeywords": 1,
"completedKeywords": 1
},
"keywordResults": [
{
"keyword": "example.com",
"position": 1,
"accessStatus": "partial",
"organicResults": [
{
"position": 1,
"title": "What is @example.com?",
"url": "https://www.example.com/",
"domain": "www.example.com",
"displayedUrl": "30+ answers · 9 years ago",
"snippet": "What is @example.com?",
"sourceName": "Quora"
},
{
"position": 2,
"title": "example.com",
"url": "https://en.wikipedia.org/wiki/Example.com",
"domain": "en.wikipedia.org",
"displayedUrl": "https://en.wikipedia.org › wiki › Example",
"snippet": "The domain names example.com, example.net, example.org, and example.edu are second-level domain names in the Domain Name System of the Internet.Read more",
"sourceName": "Wikipedia"
},
{
"position": 3,
"title": "WWW.example.com or HTTP://example.com – which one is ...",
"url": "https://webmasters.stackexchange.com/",
"domain": "webmasters.stackexchange.com",
"displayedUrl": "https://webmasters.stackexchange.com › questions › ww...",
"snippet": "Nov 30, 2010 — http://example.com www.example.com http://www.example.com example.com Which of these would you choose as your favourite to work with from 2016 onward? ...",
"sourceName": "Webmasters Stack Exchange"
},
{
"position": 4,
"title": "Example Domains",
"url": "https://www.iana.org/help/example-domains",
"domain": "www.iana.org",
"displayedUrl": "https://www.iana.org › help › example-domains",
"snippet": "4 days ago — A number of domains such as example.com and example.org are maintained for documentation purposes. These domains may be used as illustrative ...Read more",
"sourceName": "Internet Assigned Numbers Authority (IANA)"
},
{
"position": 5,
"title": "Example.com - valid and useful site",
"url": "https://packetpushers.net/",
"domain": "packetpushers.net",
"displayedUrl": "https://packetpushers.net › blog › example-com-valid-a...",
"snippet": "Nov 25, 2019 — These domains may be used as illustrative examples in documents without prior coordination with us. They are not available for registration or ...",
"sourceName": "Packet Pushers"
},
{
"position": 6,
"title": "What's the example.com domain?",
"url": "https://www.plothost.com/",
"domain": "www.plothost.com",
"displayedUrl": "https://www.plothost.com › KB › Internet",
"snippet": "Aug 24, 2017 — Example.com (example.org, example.net) are domains that can be used as examples in documents/papers/websites etc. They were specifically created ...Read more",
"sourceName": "PlotHost"
},
{
"position": 7,
"title": "Typo traps: analyzing traffic to exmaple.com (or is it ...",
"url": "https://blog.cloudflare.com/typo-traps-analyzing-traffic-to-exmaple-com-or-is-it-example-com/",
"domain": "blog.cloudflare.com",
"displayedUrl": "https://blog.cloudflare.com › typo-traps-analyzing-traffic...",
"snippet": "Sep 22, 2023 — Cloudflare has owned exmaple.com for a few years now, but don't confuse it with example.com! example.com is a reserved domain name set by the ...Read more",
"sourceName": "Cloudflare Blog"
},
{
"position": 8,
"title": "example.com is a better choice for an example domain",
"url": "https://github.com/",
"domain": "github.com",
"displayedUrl": "https://github.com › mdn › content › issues",
"snippet": "Jun 9, 2025 — What information was incorrect, unhelpful, or incomplete? foo.com is a real domain, so I think it's better to use example.com when writing ...Read more",
"sourceName": "GitHub"
}
],
"history": [
{
"checkedAt": "2026-10-01T00:18:39.415Z",
"position": 1
}
],
"movementAlerts": [],
"relatedQueries": [],
"peopleAlsoAsk": [
{
"question": "What is example.com used for?"
},
{
"question": "Is example.com a real email address?"
},
{
"question": "Who owns the example.com domain name?"
},
{
"question": "What does someone example.com mean?"
}
],
"paidResults": []
}
],
"visibilitySummary": {
"averagePosition": 1,
"bestPosition": 1,
"top3Count": 1,
"top10Count": 1
}
}
}

Local output shape

FieldTypeWhat it does
resultTypestringlocal for this row.
countryCodestringTwo-letter Google country context.
languageCodestringGoogle language context.
localobjectGoogle Maps local tracking branch.
local.businessobjectPublic data for the tracked business.
local.business.namestringPublic business name.
local.business.addressstring, when availablePublic street address.
local.business.websitestring, when availablePublic business website.
local.business.phonestring, when availablePublic business phone number.
local.business.locationobject, when availablePublic business location.
local.business.location.latitudenumberBusiness latitude.
local.business.location.longitudenumberBusiness longitude.
local.business.ratingnumber, when availableGoogle rating from zero to five.
local.business.reviewCountinteger, when availableNumber of Google reviews.
local.gridobjectLocal scan center, radius, and resolution.
local.grid.centerobjectCenter of the local scan grid.
local.grid.center.latitudenumberGrid center latitude.
local.grid.center.longitudenumberGrid center longitude.
local.grid.radiusKmnumberDistance from the center covered by the grid.
local.grid.resolutionstringNumber of grid points on each side.
local.priorityLensstringLens used to order local market findings: opportunity, visibility, or competition.
local.coverageobjectCoverage of submitted local keywords and grid points.
local.coverage.statusstringWhether all local checks were completed: complete or partial.
local.coverage.requestedKeywordsintegerNumber of local keywords submitted.
local.coverage.completedKeywordsintegerNumber of local keywords with a successful result.
local.coverage.requestedPointsintegerTotal grid points requested across the keywords.
local.coverage.checkedPointsintegerTotal grid points with a successful local result.
local.keywordResultsarray of objectsLocal grid results for the submitted keywords.
local.keywordResults[].keywordstringKeyword checked in Google Maps.
local.keywordResults[].coverageobjectCoverage for this keyword's grid checks.
local.keywordResults[].coverage.statusstringWhether all points for this keyword were checked: complete or partial.
local.keywordResults[].coverage.requestedPointsintegerGrid points requested for the keyword.
local.keywordResults[].coverage.checkedPointsintegerGrid points with a successful result.
local.keywordResults[].visibilitySummaryobjectAverage, best, worst, and Share of Local Voice measures.
local.keywordResults[].visibilitySummary.averagePositionnumber or nullAverage tracked business position across found grid points.
local.keywordResults[].visibilitySummary.bestPositioninteger or nullBest tracked business position across grid points.
local.keywordResults[].visibilitySummary.worstPositioninteger or nullWorst tracked business position across grid points.
local.keywordResults[].visibilitySummary.shareOfLocalVoicenumberTracked business share of observed local result positions, from zero to one.
local.keywordResults[].gridPointsarray of objectsSuccessful local results at the requested grid points.
local.keywordResults[].gridPoints[].locationobjectGrid point location.
local.keywordResults[].gridPoints[].location.latitudenumberGrid point latitude.
local.keywordResults[].gridPoints[].location.longitudenumberGrid point longitude.
local.keywordResults[].gridPoints[].positioninteger or nullTracked business position at the point. Null means it was not seen in the local results.
local.keywordResults[].gridPoints[].accessStatusstringWhether Google returned the requested local results: complete or partial.
local.keywordResults[].gridPoints[].competitorsarray of objectsLeading competing businesses at the grid point.
local.keywordResults[].gridPoints[].competitors[].positionintegerCompetitor position at the grid point.
local.keywordResults[].gridPoints[].competitors[].businessobjectPublic data for a grid-point competitor. It uses the Business fields listed below.
local.keywordResults[].gridPoints[].competitors[].business.namestringCompeting business name.
local.keywordResults[].gridPoints[].competitors[].business.addressstring, when availableCompeting business address.
local.keywordResults[].gridPoints[].competitors[].business.websitestring, when availableCompeting business website.
local.keywordResults[].gridPoints[].competitors[].business.phonestring, when availableCompeting business phone.
local.keywordResults[].gridPoints[].competitors[].business.locationobject, when availableCompeting business location.
local.keywordResults[].gridPoints[].competitors[].business.location.latitudenumberCompeting business latitude.
local.keywordResults[].gridPoints[].competitors[].business.location.longitudenumberCompeting business longitude.
local.keywordResults[].gridPoints[].competitors[].business.ratingnumber, when availableCompeting business Google rating.
local.keywordResults[].gridPoints[].competitors[].business.reviewCountinteger, when availableCompeting business review count.
local.keywordResults[].competitorsarray of objectsLeading competitors across the local grid.
local.keywordResults[].competitors[].businessobjectPublic data for a local competitor.
local.keywordResults[].competitors[].business.namestringCompetitor business name.
local.keywordResults[].competitors[].business.addressstring, when availableCompetitor business address.
local.keywordResults[].competitors[].business.websitestring, when availableCompetitor business website.
local.keywordResults[].competitors[].business.phonestring, when availableCompetitor business phone.
local.keywordResults[].competitors[].business.locationobject, when availableCompetitor business location.
local.keywordResults[].competitors[].business.location.latitudenumberCompetitor business latitude.
local.keywordResults[].competitors[].business.location.longitudenumberCompetitor business longitude.
local.keywordResults[].competitors[].business.ratingnumber, when availableCompetitor business Google rating.
local.keywordResults[].competitors[].business.reviewCountinteger, when availableCompetitor business review count.
local.keywordResults[].competitors[].averagePositionnumber or nullCompetitor average position across observed grid points.
local.keywordResults[].competitors[].bestPositionintegerCompetitor best observed position.
local.keywordResults[].competitors[].worstPositionintegerCompetitor worst observed position.
local.marketobjectLocal market density, saturation, opportunities, and review findings.
local.market.competitorDensitynumberAverage number of observed competing businesses per checked grid point.
local.market.saturationstringDescriptive saturation level: low, medium, or high.
local.market.marketStatestringDescriptive market state: underserved, balanced, or competitive.
local.market.opportunityAreasarray of objectsUnderserved local areas and their assessments.
local.market.opportunityAreas[].locationobjectOpportunity area location.
local.market.opportunityAreas[].location.latitudenumberOpportunity area latitude.
local.market.opportunityAreas[].location.longitudenumberOpportunity area longitude.
local.market.opportunityAreas[].assessmentstringPlain language assessment of the local opportunity.
local.market.opportunityAreas[].prioritystringOpportunity priority: high, medium, or low.
local.market.reviewSynthesisobject, when availableAggregate review sentiment and themes.
local.market.reviewSynthesis.sentimentstringAggregate review sentiment: positive, mixed, or negative.
local.market.reviewSynthesis.themesarray of stringsCommon themes in the available reviews.
local.market.reviewSynthesis.reviewCountinteger, when availableNumber of reviews included in the synthesis.
local.marketReportstringReadable summary of the market snapshot, opportunities, and competitor findings.
local.historyarray of objectsPrior local scans when history is available.
local.history[].checkedAtstringTime of the prior local scan.
local.history[].keywordstringLocal keyword covered by the prior scan.
local.history[].averagePositionnumber or nullTracked business average position in the prior scan.
local.history[].ratingnumber or nullTracked business rating in the prior scan.
local.history[].reviewCountinteger or nullTracked business review count in the prior scan.
local.changeAlertsarray of objectsNew competitor, closure, rating, review, and rank changes found by comparing scans.
local.changeAlerts[].keywordstringLocal keyword linked to the change.
local.changeAlerts[].kindstringChange type: newCompetitor, closure, ratingChange, rankChange, reviewChange, or mover.
local.changeAlerts[].businessNamestringBusiness linked to the change.
local.changeAlerts[].previousPositioninteger or nullEarlier local position when available.
local.changeAlerts[].currentPositioninteger or nullCurrent local position when available.
local.changeAlerts[].previousRatingnumber or nullEarlier Google rating when available.
local.changeAlerts[].currentRatingnumber or nullCurrent Google rating when available.
local.changeAlerts[].previousReviewCountinteger or nullEarlier Google review count when available.
local.changeAlerts[].currentReviewCountinteger or nullCurrent Google review count when available.

Local example row

The row below is shortened from a successful current-beta local run to keep the grid and repeated competitor data readable. All shown values are genuine. Omitted arrays or nested data are marked with the JSON string "...".

{
"resultType": "local",
"countryCode": "US",
"languageCode": "en",
"local": {
"business": {
"name": "Starbucks Coffee Company",
"address": "Starbucks Coffee Company, 1912 Pike Pl, Seattle, WA 98101",
"website": "https://www.starbucks.com/store-locator/store/11676/",
"phone": "+12064488762",
"location": {
"latitude": 47.61004,
"longitude": -122.34259
},
"rating": 4.5,
"reviewCount": 7171
},
"grid": {
"center": {
"latitude": 47.6097,
"longitude": -122.3421
},
"radiusKm": 1,
"resolution": "3x3"
},
"priorityLens": "opportunity",
"coverage": {
"status": "complete",
"requestedKeywords": 1,
"completedKeywords": 1,
"requestedPoints": 9,
"checkedPoints": 9
},
"keywordResults": [
{
"keyword": "Starbucks",
"coverage": {
"status": "complete",
"requestedPoints": 9,
"checkedPoints": 9
},
"visibilitySummary": {
"averagePosition": 2,
"bestPosition": 2,
"worstPosition": 2,
"shareOfLocalVoice": 0.3333333333333333
},
"gridPoints": [
{
"location": {
"latitude": 47.60069099099099,
"longitude": -122.3554629658123
},
"position": null,
"accessStatus": "complete",
"competitors": []
},
"..."
],
"competitors": [
{
"business": {
"name": "Starbucks Coffee Company",
"address": "1101 Alaskan Wy, Seattle, WA 98101",
"website": "https://www.starbucks.com/store-locator/store/16417/",
"location": {
"latitude": 47.604859999999995,
"longitude": -122.33971
},
"rating": 3.8,
"reviewCount": 678
},
"averagePosition": 1,
"bestPosition": 1,
"worstPosition": 1
},
"..."
]
}
],
"market": {
"competitorDensity": 4,
"saturation": "medium",
"marketState": "balanced",
"opportunityAreas": [
{
"location": {
"latitude": 47.60069099099099,
"longitude": -122.3554629658123
},
"assessment": "The tracked business was not seen at this point among 0 nearby businesses.",
"priority": "high"
},
"..."
],
"reviewSynthesis": {
"sentiment": "positive",
"themes": [
"store",
"coffee",
"starbucks"
],
"reviewCount": 7171
}
},
"marketReport": "The scan checked 9 of 9 grid points across 1 of 1 keywords. The market has medium saturation with 4.0 competing businesses per checked point. The opportunity findings are listed first.",
"history": [
{
"checkedAt": "2026-09-30T23:22:32.967Z",
"keyword": "Starbucks",
"averagePosition": 2.4285714285714284,
"rating": 3.8,
"reviewCount": 448
}
],
"changeAlerts": "..."
}
}

💳 Pricing

This Actor uses pay-per-event pricing. The two events below are the charged result events for this Actor, and the current price is shown on the Store card and before a run.

Buyer-facing eventCharged for
Organic positionOne organic position for a submitted domain and keyword, including a not-found outcome within the checked depth.
Local positionOne local-pack position for a submitted business, keyword, and grid point.

🔌 Integrations

Run the Actor from Apify Console, the API, a Task, or a Schedule. Read the dataset through the API, export it for reports, or use a webhook after a run to pass results to another workflow. Repeat runs can provide history and change alerts when prior data is available.

❓ FAQ

What does a not-found position mean?

It means the tracked domain was not seen within the organic depth, or the tracked business was not seen at that local grid point. It is different from a successful position and is represented by null where the schema allows it.

What happens when Google returns incomplete results?

Read accessStatus for each keyword or grid point and the run-level coverage fields. A partial status tells you that the requested depth or grid coverage was not fully returned.

Can I check several keywords in one run?

Yes. Add several values to keywords. They share the same country, language, and result-family settings, so one run cannot give each keyword its own separate configuration.

Can I track local rankings?

Yes. Choose Local rank tracking, add a business name, and set a scan center, radius, and grid resolution. The output includes the business position at each point, local visibility measures, and observed competitors.

Does this use Google Search Console?

No. It reads public Google Search and Google Maps results. It does not access private Search Console, private analytics, or other logged-in ranking data.

Can repeat runs show movement?

When prior checks are available, organic rows can include history and movement alerts, and local rows can include history and change alerts. Set the organic movement threshold to choose how much movement creates an organic alert.

How do country and language affect a run?

They set the Google context for every check in the run, and both values are saved on each dataset row. Use them when the market or language you want to check differs from the defaults.

How does this compare with Google Search Console, Semrush, or Ahrefs?

This Actor checks public Google results at run time and keeps source result context. It does not replace private campaign history, private Search Console data, or private SEO dashboards.

How is billing counted?

Billing uses one event for each organic domain position result and one event for each local business position at a grid point. See the Pricing section for the two buyer-facing events.

📝 Changelog

v0.0 (01-10-2026)

  • Initial release.

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré