Rover Pet Care Scraper - Sitters, Rates & Reviews avatar

Rover Pet Care Scraper - Sitters, Rates & Reviews

Pricing

from $1.50 / 1,000 pet-care service records

Go to Apify Store
Rover Pet Care Scraper - Sitters, Rates & Reviews

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

Abot API

Maintained by Community

Actor 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.

FieldExample
kind"sitter"
recordId"SMPL0001"
shortName / headline"Jamie R." / "Loving care for your pets"
urlRover profile link
serviceType"overnight-boarding"
pricePerUnit / priceUnit / currencyCode56.0 / "night" / "USD"
city / state / zip / neighborhood"Example City" / "CA" / "94000" / "Example Heights"
latitude / longitude / distanceMi37.77 / -122.41 / 0.9
ratingsAverage / ratingsCount5.0 / 18
reviewsTotalRatings / reviewsDistribution20 / {"5star": 15, "4star": 3, ...}
yearsOfExperience / repeatClients5 / 9
isStarSitter / verificationBadgestrue / ["Verified Background Check"]
responseRatePercent / responseTimeText98 / "Usually responds in a few minutes"
memberSince"2019-03-10"
availabilityUpdatedText / availabilityUpdatedDaysAgo"Availability updated today" / 0
ownPetsCount / ownPetTypes / attributeHighlights1 / ["dog"] / ["Fenced yard"]
servicesrate table per service: standard rate plus priced add-ons, home attributes, policies
reviews / reviewsEmbeddedembedded review list (rating, date, text, reply, reviewer, pet names) / 3
changeType / changedFieldsincremental mode only: "NEW", "UPDATED", "UNCHANGED", "REAPPEARED" or "EXPIRED" / changed field names
firstSeenAt / lastSeenAtincremental mode only: ISO timestamps

How to Use

  1. Pick a mode: search (one or more locations) or url (paste sitter, search or city links).
  2. For search mode, fill in the service type and pet type; filters (minimum rating, price range, Star Sitters only) apply in both modes.
  3. Switch Fetch full profiles and Fetch reviews on or off, and cap Max reviews per sitter if you only need the newest ones.
  4. 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
}

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 shapeExampleWhat you get
City page, boardinghttps://www.rover.com/san-francisco--ca--dog-boarding/Sitters around the city, walked page by page
City page, dog walkinghttps://www.rover.com/austin--tx--dog-walking/Dog-walking sitters
City page, day carehttps://www.rover.com/new-york--ny--doggy-day-care/Day-care sitters
City page, cat sittinghttps://www.rover.com/seattle--wa--cat-sitting/Cat-sitting sitters (pet type is set to cat)
City page, ?page=Nhttps://www.rover.com/san-francisco--ca--dog-boarding/?page=2Starts at page N; counted as a partial view, so incremental runs never mark sitters on earlier pages as expired
City page, no trailing slashhttps://www.rover.com/san-francisco--ca--dog-boardingAccepted and treated as the slash form; not in the pre-filled list because it is the same target
City page, Canadahttps://www.rover.com/ca/toronto--on--dog-boarding/Sitters around the Canadian city
Sitter profilehttps://www.rover.com/members/sonia-v-dogz-vacay/One full record
Sitter profile, bare hosthttps://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 coordinateshttps://www.rover.com/search/?location=San%20Francisco%2C%20CA%2C%20USA&centerlat=37.7749295&centerlng=-122.4194155&service_type=overnight-boarding&pet_type=dogThe search walked forward
Search page, filters onlyhttps://www.rover.com/search/?location=Austin%2C%20TX%2C%20USA&service_type=doggy-day-care&min_rating=4&star_sitter=true&maxprice=60The 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 ApifyClient
client = 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 as NEW; later runs return only NEW, UPDATED (with changedFields) and REAPPEARED records. UNCHANGED and EXPIRED rows are opt-in (emitUnchanged, emitExpired) because they return, and bill, extra rows. stateKey names or shares a monitoring campaign; leave it empty to derive one automatically from the search and filter settings. A sitter is UPDATED when any returned field changes (profile text, ratings count and distribution, services and rate table, availability flags). Never compared: the embedded reviews list (a new review still shows through the ratings count), pricePerUnit, availabilityUpdatedText / availabilityUpdatedDaysAgo and distanceMi. ignoreFieldsForChanges excludes more fields, using a dotted path for fields inside a list (for example services.spacesAvailable); ignored fields stay in the output and are only left out of change detection and changedFields. Changing the ignore list never causes a one-time wave of UPDATED rows. EXPIRED is only produced after a complete scan: single-sitter links, a pasted link with page after the first, capped runs, or a different search/filter setup under a shared stateKey skip 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 sitter UPDATED; every emitted record still carries the current displayed rate. The trade-off: a real change to pricePerUnit alone is not detected either. With Fetch full profiles on, a real change in the sitter's rate table (services) still marks the sitter UPDATED; with it off, incremental mode does not track rate changes. EXPIRED rows are rebuilt from the stored baseline, so they carry pricePerUnit: null and no embedded reviews.
  • Tip, emitExpired and maxItems: EXPIRED rows 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 skips EXPIRED rather than guessing). When that condition is met, baseline sitters no longer found are pushed as EXPIRED in 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 as EXPIRED by a later complete run, so Max items bounds the run's cost. Turn emitExpired off 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 resumeFromRunId while incrementalMode is 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 as NEW and bills them a second time; from then on the baseline is complete. Rerunning the interrupted search without resumeFromRunId has the same one-time cost (those sitters come back as NEW in 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.

  1. Authorize a connector once under Apify, Settings, API & Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where item pages should be created, and optionally cap the export per connector with maxNotifyListings.

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

ParameterTypeDefaultDescription
modestringsearchsearch (locations and filters) or url (paste links).
locationsarray["San Francisco, CA, USA"]Cities, neighborhoods or ZIP codes to search around (search mode).
serviceTypestringovernight-boardingovernight-boarding, doggy-day-care, dog-walking, or drop-in (search mode).
petTypestringdogdog or cat (search mode).
urlsarraysampleSitter profiles, sitter-search pages, or city pages (url mode).
minRatinginteger0Minimum star rating, 1 to 5; 0 = no floor. Applies in both modes.
minPriceinteger0Minimum rate per service unit; 0 = no floor. Applies in both modes.
maxPriceinteger0Maximum rate per service unit; 0 = no ceiling. Applies in both modes.
starSitterbooleanfalseStar Sitters only. Applies in both modes.
fetchDetailsbooleantrueRead each sitter's full profile: services, rate tables, policies, verification badges, response stats, repeat clients, own pets.
fetchReviewsbooleantrueRead each sitter's review history and rating distribution, embedded in the record.
maxReviewsPerSitterinteger20Cap the embedded review list per sitter, newest first. 0 or anything above 1000 means the 1000 ceiling.
maxItemsinteger20Stop after this many sitter records in total. The only cap that stops a run early by default. 0 = the 100000 ceiling (maximum 100000).
maxPagesinteger0Stop 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).
resumeFromRunIdstring(none)Continue one interrupted run without re-collecting its sitters.
incrementalModebooleanfalseReturn only new, updated and reappeared records on scheduled runs.
stateKeystring(none)Name or share an incremental-mode monitoring campaign; auto-derived when empty.
emitUnchangedbooleanfalseIncremental mode only: also return (and bill for) unchanged sitters.
emitExpiredbooleanfalseIncremental mode only: also return (and bill for) sitters no longer found, once a run fully scans the tracked search. Counts against Max items.
ignoreFieldsForChangesstring list[]Incremental mode only: field names (dotted path for list members) that never mark a sitter UPDATED; they stay in the output.
mcpConnectorsarray(none)Optional: send a summary of each sitter to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Does not affect the dataset.
proxyConfigurationobjectStandard poolConnection 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.

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.