Rover Pet Care Scraper - Sitters, Rates & Reviews
Pricing
from $1.50 / 1,000 pet-care service records
Rover Pet Care Scraper - Sitters, Rates & Reviews
Scrape Rover.com pet-care providers: sitter search by city, rates per stay type, ratings and review history, verification badges, repeat clients, response times, service policies and availability signals.
Pricing
from $1.50 / 1,000 pet-care service records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
1
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Rover Scraper: Pet Sitter Profiles, Rates & Reviews
Rover Scraper turns Rover.com pet-care listings into structured records: sitter search by city, neighborhood or ZIP, full sitter profiles with rate tables, quality signals, verification badges and the complete review history. Search by location, paste sitter or search links, or walk a whole city landing page, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.
Why This Scraper?
- Two ways to find sitters. Search around one or more locations, or paste sitter profile links, sitter-search links, or city landing pages. No need to build search URLs by hand.
- One full record per sitter, 40+ fields. Rates and the complete add-on rate table, quality signals, profile details, service policies, location and the embedded review history.
- Filters that narrow every walk. Minimum rating, price range and Star Sitters only apply in both search and URL mode, not just search mode (a pasted sitter profile link always returns that sitter's full record).
- Enrichment on demand. Read each sitter's full profile and review history, or skip both for fast search-card fields only, and cap the embedded review list per sitter.
- Built for monitoring. Resume one interrupted run without re-collecting, or turn on incremental mode so scheduled runs return only new, updated and reappeared sitters.
- Fails loudly, not silently empty. A run that could not read anything stops with a clear message instead of returning zero rows that look like an empty search.
Use Cases
- Pet-care marketplace research: compare sitter coverage, rates and service mix across cities and neighborhoods.
- Pricing and rate benchmarking: track standard and add-on rates (holiday, additional pet, pick-up and drop-off) per service type over time.
- Trust and reputation analytics: monitor verification badges, Star Sitter status, rating distribution and response times across a market.
- Business intelligence for pet-care brands: measure repeat-client counts, review growth and availability signals as leading indicators.
- Local services directories: build or refresh a sitter directory for a city or region on a recurring schedule.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
kind | "sitter" |
recordId | "SMPL0001" |
shortName / headline | "Jamie R." / "Loving care for your pets" |
url | Rover profile link |
serviceType | "overnight-boarding" |
pricePerUnit / priceUnit / currencyCode | 56.0 / "night" / "USD" |
city / state / zip / neighborhood | "Example City" / "CA" / "94000" / "Example Heights" |
latitude / longitude / distanceMi | 37.77 / -122.41 / 0.9 |
ratingsAverage / ratingsCount | 5.0 / 18 |
reviewsTotalRatings / reviewsDistribution | 20 / {"5star": 15, "4star": 3, ...} |
yearsOfExperience / repeatClients | 5 / 9 |
isStarSitter / verificationBadges | true / ["Verified Background Check"] |
responseRatePercent / responseTimeText | 98 / "Usually responds in a few minutes" |
memberSince | "2019-03-10" |
availabilityUpdatedText / availabilityUpdatedDaysAgo | "Availability updated today" / 0 |
ownPetsCount / ownPetTypes / attributeHighlights | 1 / ["dog"] / ["Fenced yard"] |
services | rate table per service: standard rate plus priced add-ons, home attributes, policies |
reviews / reviewsEmbedded | embedded review list (rating, date, text, reply, reviewer, pet names) / 3 |
changeType / changedFields | incremental mode only: "NEW", "UPDATED", "UNCHANGED", "REAPPEARED" or "EXPIRED" / changed field names |
firstSeenAt / lastSeenAt | incremental mode only: ISO timestamps |
How to Use
- Pick a mode:
search(one or more locations) orurl(paste sitter, search or city links). - For search mode, fill in the service type and pet type; filters (minimum rating, price range, Star Sitters only) apply in both modes.
- Switch Fetch full profiles and Fetch reviews on or off, and cap Max reviews per sitter if you only need the newest ones.
- Set Max items to control run size and cost, then click Start.
Search a city for boarding sitters:
{"mode": "search","locations": ["San Francisco, CA, USA"],"serviceType": "overnight-boarding","petType": "dog","maxItems": 20}
Filtered search, Star Sitters only:
{"mode": "search","locations": ["Austin, TX, USA"],"serviceType": "dog-walking","minRating": 4,"starSitter": true,"maxItems": 50}
Paste sitter and city page links:
{"mode": "url","urls": ["https://www.rover.com/members/example-sitter-profile/","https://www.rover.com/san-francisco--ca--dog-boarding/"]}
Recurring monitoring of the same search:
{"mode": "search","locations": ["Denver, CO, USA"],"serviceType": "overnight-boarding","incrementalMode": true,"maxItems": 0}
URL mode: supported links
Behaviour change: in URL mode, leaving the URLs field untouched now uses the 9 example links below, in order, instead of nothing. Max items applies to the whole run, so with the default of 20 usually only the first link is read; raise Max items to cover more.
| Link shape | Example | What you get |
|---|---|---|
| City page, boarding | https://www.rover.com/san-francisco--ca--dog-boarding/ | Sitters around the city, walked page by page |
| City page, dog walking | https://www.rover.com/austin--tx--dog-walking/ | Dog-walking sitters |
| City page, day care | https://www.rover.com/new-york--ny--doggy-day-care/ | Day-care sitters |
| City page, cat sitting | https://www.rover.com/seattle--wa--cat-sitting/ | Cat-sitting sitters (pet type is set to cat) |
City page, ?page=N | https://www.rover.com/san-francisco--ca--dog-boarding/?page=2 | Starts at page N; counted as a partial view, so incremental runs never mark sitters on earlier pages as expired |
| City page, no trailing slash | https://www.rover.com/san-francisco--ca--dog-boarding | Accepted and treated as the slash form; not in the pre-filled list because it is the same target |
| City page, Canada | https://www.rover.com/ca/toronto--on--dog-boarding/ | Sitters around the Canadian city |
| Sitter profile | https://www.rover.com/members/sonia-v-dogz-vacay/ | One full record |
| Sitter profile, bare host | https://rover.com/members/sonia-v-dogz-vacay/ | Accepted and treated as the www profile; not in the pre-filled list because it is the same target |
| Search page, with coordinates | https://www.rover.com/search/?location=San%20Francisco%2C%20CA%2C%20USA¢erlat=37.7749295¢erlng=-122.4194155&service_type=overnight-boarding&pet_type=dog | The search walked forward |
| Search page, filters only | https://www.rover.com/search/?location=Austin%2C%20TX%2C%20USA&service_type=doggy-day-care&min_rating=4&star_sitter=true&maxprice=60 | The location is looked up for you; filters in the link are applied |
Links that fit none of these shapes (for example /members/<id>/ with a bare id, or an unknown city service) are skipped with a warning in the run log, never silently.
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/rover-pet-care-scraper").call(run_input={"mode": "search","locations": ["San Francisco, CA, USA"],"maxItems": 20,})for sitter in client.dataset(run["defaultDatasetId"]).iterate_items():print(sitter["shortName"], sitter["pricePerUnit"], sitter["ratingsAverage"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/rover-pet-care-scraper').call({mode: 'search',locations: ['San Francisco, CA, USA'],maxItems: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Caps and limits
Max items defaults to 20 and is the only cap that stops a run early by default; the maximum is 100000 and 0 means that 100000 ceiling. It counts rows actually returned: sitters skipped by Resume, or unchanged sitters suppressed by incremental mode, do not use it up. Max pages per search (0 = the built-in ceiling of 1000 pages) additionally bounds each individual search at 20 sitters per page, and searches also stop at their natural end. Max reviews per sitter defaults to 20 (previously all reviews; set up to 1000 for a full history, and 0 means that 1000 ceiling) and bounds only the embedded review list per record; it does not affect which sitters are collected.
Resume and recurring updates
- Resume from a previous run (
resumeFromRunId) continues one interrupted run: paste its run or dataset ID and already-collected sitters are skipped so you don't pay twice. - Incremental mode (
incrementalMode) is for scheduled runs over the same search. The first run returns everything asNEW; later runs return onlyNEW,UPDATED(withchangedFields) andREAPPEAREDrecords.UNCHANGEDandEXPIREDrows are opt-in (emitUnchanged,emitExpired) because they return, and bill, extra rows.stateKeynames or shares a monitoring campaign; leave it empty to derive one automatically from the search and filter settings. A sitter isUPDATEDwhen any returned field changes (profile text, ratings count and distribution, services and rate table, availability flags). Never compared: the embeddedreviewslist (a new review still shows through the ratings count),pricePerUnit,availabilityUpdatedText/availabilityUpdatedDaysAgoanddistanceMi.ignoreFieldsForChangesexcludes more fields, using a dotted path for fields inside a list (for exampleservices.spacesAvailable); ignored fields stay in the output and are only left out of change detection andchangedFields. Changing the ignore list never causes a one-time wave ofUPDATEDrows.EXPIREDis only produced after a complete scan: single-sitter links, a pasted link withpageafter the first, capped runs, or a different search/filter setup under a sharedstateKeyskip it. - Displayed-rate volatility: the source flips the displayed rate (
pricePerUnit) between two display states around 12.5% apart (for example 48 to 54) between runs with no underlying change. Incremental mode excludes it from change detection and from the stored baseline, so a display flip alone never marks a sitterUPDATED; every emitted record still carries the current displayed rate. The trade-off: a real change topricePerUnitalone is not detected either. With Fetch full profiles on, a real change in the sitter's rate table (services) still marks the sitterUPDATED; with it off, incremental mode does not track rate changes.EXPIREDrows are rebuilt from the stored baseline, so they carrypricePerUnit: nulland no embedded reviews. - Tip,
emitExpiredandmaxItems:EXPIREDrows are only computed once a run fully scans the tracked search: not resumed, not stopped by Max items or Max pages, every location or link reached its natural end, and the source served every sitter it reported (after heavy use it can serve a reduced result window, and the run then skipsEXPIREDrather than guessing). When that condition is met, baseline sitters no longer found are pushed asEXPIREDin that same run, and they count against the remaining Max items budget after the new and changed rows. Absentees beyond that budget stay tracked and are emitted asEXPIREDby a later complete run, so Max items bounds the run's cost. TurnemitExpiredoff if you do not want these rows. - Tip, combining Resume with Incremental mode: if an incremental run is interrupted before it finishes (so it never saves its incremental state) and you continue it with
resumeFromRunIdwhileincrementalModeis also on, the sitters the interrupted run already returned are correctly skipped in the resumed run (no duplicate rows, no double billing in that run), but they are not added to the incremental baseline the resumed run saves. The next ordinary (non-resumed) run over the same search then returns those sitters once more asNEWand bills them a second time; from then on the baseline is complete. Rerunning the interrupted search withoutresumeFromRunIdhas the same one-time cost (those sitters come back asNEWin that rerun instead), so plan for that one duplicate batch after any interrupted incremental run.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each sitter, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify, Settings, API & Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where item pages should be created, and optionally cap the export per connector withmaxNotifyListings.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (locations and filters) or url (paste links). |
locations | array | ["San Francisco, CA, USA"] | Cities, neighborhoods or ZIP codes to search around (search mode). |
serviceType | string | overnight-boarding | overnight-boarding, doggy-day-care, dog-walking, or drop-in (search mode). |
petType | string | dog | dog or cat (search mode). |
urls | array | sample | Sitter profiles, sitter-search pages, or city pages (url mode). |
minRating | integer | 0 | Minimum star rating, 1 to 5; 0 = no floor. Applies in both modes. |
minPrice | integer | 0 | Minimum rate per service unit; 0 = no floor. Applies in both modes. |
maxPrice | integer | 0 | Maximum rate per service unit; 0 = no ceiling. Applies in both modes. |
starSitter | boolean | false | Star Sitters only. Applies in both modes. |
fetchDetails | boolean | true | Read each sitter's full profile: services, rate tables, policies, verification badges, response stats, repeat clients, own pets. |
fetchReviews | boolean | true | Read each sitter's review history and rating distribution, embedded in the record. |
maxReviewsPerSitter | integer | 20 | Cap the embedded review list per sitter, newest first. 0 or anything above 1000 means the 1000 ceiling. |
maxItems | integer | 20 | Stop after this many sitter records in total. The only cap that stops a run early by default. 0 = the 100000 ceiling (maximum 100000). |
maxPages | integer | 0 | Stop each search after this many sitter pages, 20 sitters per page (0 = the built-in ceiling of 1000 pages; searches also stop at their natural end). |
resumeFromRunId | string | (none) | Continue one interrupted run without re-collecting its sitters. |
incrementalMode | boolean | false | Return only new, updated and reappeared records on scheduled runs. |
stateKey | string | (none) | Name or share an incremental-mode monitoring campaign; auto-derived when empty. |
emitUnchanged | boolean | false | Incremental mode only: also return (and bill for) unchanged sitters. |
emitExpired | boolean | false | Incremental mode only: also return (and bill for) sitters no longer found, once a run fully scans the tracked search. Counts against Max items. |
ignoreFieldsForChanges | string list | [] | Incremental mode only: field names (dotted path for list members) that never mark a sitter UPDATED; they stay in the output. |
mcpConnectors | array | (none) | Optional: send a summary of each sitter to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
proxyConfiguration | object | Standard pool | Connection settings. Requires a plan with proxy access. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"kind": "sitter","recordId": "SMPL0001","shortName": "Jamie R.","headline": "Loving care for your pets","url": "https://www.rover.com/members/example-sitter-profile/","imageUrl": "https://example.com/images/sample-medium.jpg","serviceType": "overnight-boarding","currencyCode": "USD","pricePerUnit": 56.0,"priceUnit": "night","neighborhood": "Example Heights","city": "Example City","state": "CA","zip": "94000","latitude": 37.77,"longitude": -122.41,"distanceMi": 0.9,"ratingsAverage": 5.0,"ratingsCount": 18,"yearsOfExperience": 5,"isStarSitter": true,"verificationBadges": ["Verified Background Check"],"responseRatePercent": 98,"responseRateText": "Sitter responds to most requests within 24 hours","responseTimeText": "Usually responds in a few minutes","memberSince": "2019-03-10","repeatClients": 9,"reviewsTotalRatings": 20,"reviewsDistribution": {"5star": 15, "4star": 3, "3star": 1, "2star": 1, "1star": 0},"ownPetsCount": 1,"ownPetTypes": ["dog"],"attributeHighlights": ["Fenced yard"],"reviews": [{"rating": 5, "date": "2026-08-10", "serviceType": "overnight-boarding","serviceName": "Boarding", "text": "Example review text.", "sitterReply": null,"reviewerName": "Example R.", "petNames": ["Buddy"]}],"reviewsEmbedded": 1,"services": [{"name": "Boarding", "slug": "overnight-boarding", "active": true,"standardRate": {"name": "Standard Rate", "price": 56.0, "unit": "night"},"rates": {"standardRate": {"name": "Standard Rate", "price": 56.0, "unit": "night"}},"spacesAvailable": 2, "acceptsSmallDogs": true, "acceptsMediumDogs": true,"isAcceptingNewCustomers": true}]}
Plan Requirement
The default proxy configuration (Apify Proxy, standard shared pool) works without any extra setup: it was measured to load Rover pages through Apify datacenter connections, so you do not need residential proxies. You do need an Apify plan that includes proxy access. If the preferred connection is unavailable to your run (for example Apify free plans do not include residential proxies), the run logs a warning that "the selected connection is unavailable to this run", continues on a backup connection, and some pages may still be unavailable. If no page could be read at all, the run stops with a clear message instead of an empty dataset: proxy access refused for the account ("Your Apify plan does not include proxy access; a paid plan is required"), no results on a free plan after the backup connection also failed, or "Could not load any results page ... This is a connection problem, not an empty search". You can also supply your own proxy URLs under Connection and proxy.
Output views
The dataset has four views: Sitters (search-card and rate fields), Full profiles (profile, policies, services and rate table), Reviews (one row per review) (one row per embedded review, unwound from the sitter record) and Changes since the last run (incremental status and changedFields).
FAQ
How much does it cost?
You pay per sitter record returned, with the profile-and-review enrichment surcharge billed only when it actually reads a sitter's detail pages. The Pricing tab shows the current rates. Use Max items to cap the cost of a run.
Is it legal to scrape Rover?
This actor collects only publicly available sitter listing data. You are responsible for how you use it: follow Rover's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Treat sitter names, photos and review text as personal data if your use case involves identifiable individuals.
Can I get only new or changed sitters on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Later runs then return only new, updated and reappeared records, and unchanged ones are not billed unless you turn on Emit unchanged.
Why does the embedded rate sometimes look like it flipped between runs with nothing else changing?
The source itself displays two rate states for the same sitter (for example 48 and then 54) minutes apart with no real price change. Incremental mode treats this as a display quirk, not a change, so it never marks the sitter UPDATED on its own. The trade-off is that a real change to that displayed rate alone is not flagged either; with Fetch full profiles on, a real change in the sitter's services rate table still marks the sitter UPDATED.
Why did my run fail instead of returning an empty dataset?
If the source refuses every request, the run stops with a clear message so "no sitters found" is never confused with "nothing could be read". Run it again in a few minutes. If only some locations or links could not be read, you still get what was found.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
๐ Want more travel data?
Pair this actor with these related scrapers from the same team:
| ๐จ Wego Scraper Scrape Wego hotels by city or search URL. Get rates, providers, booking links... | ๐จ Yanolja Scraper Scrape Yanolja (NOL), Korea's largest accommodations marketplace, by region or URL. Every... |
| ๐จ Airbnb Scraper Scrape Airbnb stays by destination or link: nightly and total price, rating breakdown... | ๐จ Rakuten Travel Scraper Scrape Rakuten Travel, Japan's largest domestic hotel-booking site, by prefecture... |
| ๐จ Vrbo Scraper Extract vacation rental data from Vrbo.com by location, region, coordinates, property... | ๐จ LoopNet Scraper Scrape LoopNet commercial listings across the US, including office, retail, industrial... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
- โญ Enjoying it? A quick review on the actor page helps other users find it.