Store Locator Scraper with Change Detection avatar

Store Locator Scraper with Change Detection

Pricing

from $4.00 / 1,000 location scrapeds

Go to Apify Store
Store Locator Scraper with Change Detection

Store Locator Scraper with Change Detection

Store locator scraper: every store location of a brand with address, coordinates and hours, plus store openings, closures, moves and hours changes on repeat runs.

Pricing

from $4.00 / 1,000 location scrapeds

Rating

0.0

(0)

Developer

Final Dynamics

Final Dynamics

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 hours ago

Last modified

Share

Turn a brand's "find a store" page into a clean list of store locations data, and then watch it: run again later and get only the stores that opened, closed, moved or changed hours.

It reads locators that publish their locations in the page itself: Yext, including the statically generated locations.brand.com sites that chains use, Stockist, Storemapper, Uberall, common Shopify store-locator apps, and any store page carrying its data as JSON-LD or microdata. Where a chain publishes a store directory or a sitemap, the actor walks it and reads each store page.

Checked against 22 well-known chains on 2026-09-17. Working: Chipotle, Wendy's, Family Dollar, Trader Joe's, Taco Bell, Subway, Best Buy, Petco and Dagne Dover. Not working: brands that refuse automated visitors (Kohl's, Home Depot, Sephora and Panera answer 403), brands whose sitemap is broken (Walgreens returns 500, CVS returns 503) and brands that draw their locations only in the browser (Starbucks, Ace Hardware). A run that finds nothing says which of these it hit.

Built for retail analysts and site-selection teams, dealer and stockist research, competitive tracking, and anyone who has been asked for "every location of brand X" or "tell me when they open a new one".

What you get

One row per location. Every field is flat, so the dataset drops straight into Google Sheets, Airtable or a map.

FieldExample
branddagnedover.com
storeNameBabylist Showroom
addressFull, street, city, state, postalCode, country211 S Beverly Dr, Beverly Hills, CA, 90212
latitude, longitude34.0644, -118.3994
phone, email, storeUrlWhen the locator publishes them
hours{ "mon": "09:00-17:00", ... } or null
servicesTags or filters the locator attaches
locationIdThe locator's own stable ID
locatorPlatformstockist, yext, storemapper, uberall, shopify, custom
changeType, changedFieldsnew, closed, moved, hours_changed, unchanged
firstSeenAt, lastSeenAt, scrapedAtUTC timestamps
sourceUrlThe locator page the row came from

Anything the locator does not publish is null.

How to use it

Paste the locator page URL and run.

{
"locatorUrls": ["https://www.dagnedover.com/pages/store-locator"]
}

Add "country": "US" to keep one country, or "maxLocations": 100 for a capped sample.

Get changes since last time (one-off): run once without a cap to build the full list, then run again with the first run's dataset ID:

{
"locatorUrls": ["https://www.dagnedover.com/pages/store-locator"],
"diffAgainstDatasetId": "DATASET_ID_FROM_THE_FIRST_RUN"
}

Each row now says whether the store is new, closed, moved, hours_changed or unchanged, and which fields changed. The output is a complete list again, so you can use it as the next baseline. Set emitUnchanged: false if you only want the changed rows in the dataset.

Watch a brand on a schedule: create a key-value store in Apify Console, select it as monitorStateStoreId, and schedule the task. The actor keeps its own complete baseline in that store, so every scheduled run delivers just the changes. Give each monitor its own store, and let the schedule run one job at a time.

Several brands at once: list up to 100 locator URLs in locatorUrls. Rows carry sourceUrl so you can tell them apart.

Quick start

No code needed; about two minutes from input to spreadsheet. For a longer walkthrough with example output, read the guide Build a store location spreadsheet and track changes.

  1. Open the example "All store locations for one brand (Dagne Dover)" on this actor's page, or paste one of the inputs above into the input form.
  2. Click Start and wait until the run shows Succeeded.
  3. Open the Output tab to see the locations as a table.
  4. Click Export, choose CSV or Excel, and download the file.
  5. In Google Sheets, choose File > Import > Upload and select the file.

Automate it

A weekly location check: save the brand's locator URL in a task. Click Save as a new task, then add a schedule for that task under Schedules in Apify Console (for example every Monday at 07:00). Select a key-value store as monitorStateStoreId (see above) and each scheduled run delivers only openings, closures, moves and hours changes.

Into Google Sheets with n8n: add the Apify node with the On new Apify Event trigger, choose your task and the succeeded event, then add an Apify node with Get Dataset Items using the run's defaultDatasetId, and finish with a Google Sheets node that appends the rows. Every scheduled run then adds its locations to the same sheet. Make and Zapier have Apify integrations that work the same way.

Pricing

Pay per event. There are no platform usage charges on top.

EventPriceWhen
actor-start$0.01Once per run
location-scraped$0.004Per location fetched this run
change-detected$0.02Per opening, closure, move or hours change found against a baseline

Examples: a brand with 900 stores costs $3.61 to enumerate. A weekly check of those 900 stores that finds 12 openings, 3 moves, 2 hours changes and 4 closures costs $4.03. The first run of a brand never charges for changes; everything is simply new.

Set a maximum charge on the run if you want a hard ceiling; the actor stops cleanly at the cap.

Good to know

  • A closed row means the store disappeared from a complete result from the brand's own locator service. It is a strong signal, not a confirmed closure; check before acting on it.
  • Closures are only reported when the actor is sure it saw the whole list. If the locator errors, blocks the request, or the run was capped, closures are held back rather than guessed.
  • Yext, Stockist, Storemapper and Uberall locators give complete lists and support monitoring. Pages where the actor has to read location data out of the HTML still return rows, but cannot be used for closure detection.
  • The actor reads public pages and public locator APIs, honours robots rules, and never logs in, solves CAPTCHAs or uses proxies. A page that only draws its map with JavaScript and exposes no data returns no rows.
  • Locations are matched by the locator's own ID, or by address when there is none. Suites and units at one street address count as separate locations.
  • HTTP redirects are followed for up to five hops. Redirect targets are checked for public DNS addresses before their robots.txt or page is fetched. The primary page's final URL becomes sourceUrl and the fixed scope for directory discovery; later page redirects do not expand that scope. A change of registrable domain appears alongside crawl notices. Domain comparison is a heuristic using the last two labels, or three for co.uk, org.uk, gov.uk, ac.uk, co.nz, co.jp, com.au and co.za.
  • The worker's network permissions cover the locator hosts you pass, their own site (locations.brand.com also reaches brand.com and www.brand.com, so the usual redirect works) and the fixed provider hosts. A redirect to a different site is refused and named in the status message; pass that URL directly if you want it read.
  • Transport errors retain nested causes. TLS, SSL and certificate failures are identified in the terminal status instead of being reduced to a bare fetch failed message.

FAQ

How do I get a list of all stores of a brand?

Paste the brand's store locator page URL into locatorUrls and run. You get one row per location with address, coordinates and, if you want them, opening hours.

Can it track store closures and new store openings?

Yes. Select a key-value store as monitorStateStoreId and schedule the task; every run after the first delivers only openings, closures, moves and hours changes.

Does it work on any website?

It works on the locator platforms most brands use (Yext, Stockist, Storemapper, Uberall and common Shopify apps) and on pages that embed location data. If a page returns nothing, open an issue with the URL.

Questions or a locator that returns nothing? Open an issue on the actor page with the page URL.