TaskRabbit Scraper - Taskers, Rates, Ratings & Availability
Pricing
from $1.60 / 1,000 tasker or review records
TaskRabbit Scraper - Taskers, Rates, Ratings & Availability
Scrape TaskRabbit taskers by US city and service. Extract hourly rates, ratings, reviews, completed tasks, elite status, and availability. Track NEW, UPDATED, REAPPEARED, and EXPIRED taskers with incremental runs, resume, and MCP export.
Pricing
from $1.60 / 1,000 tasker or review records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
14 days ago
Last modified
Categories
Features
Share
TaskRabbit Scraper: Tasker Rates, Ratings & Reviews
TaskRabbit Scraper turns TaskRabbit tasker listings into a clean data feed. Pick one or more US cities and service categories, and get the taskers TaskRabbit features there, with hourly rates, ratings, review counts, completed tasks and on-duty status pulled from each public profile. Paste a tasker profile link or numeric id for a direct read instead, add each tasker's public reviews when you need them, and monitor a city or service over time with change tracking. Export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- Real rate data. Per-category hourly rates, the client-facing rate and the service fee, alongside ratings, review counts and completed tasks.
- Availability signal. Each enriched profile carries the tasker's on-duty status, hours worked and years on the platform.
- City and service search. Paste city names and service categories; cities are matched against the source's own city pages automatically.
- Nine link shapes in URL mode. Paste tasker ids, profile links (by id or name slug), tasker API and review-page links, city or city + service pages, the locations index or the city sitemap, and skip the search entirely.
- Optional review records. One row per public review (default cap of 20 per tasker), plus each city page's recent service testimonials.
- Recurring monitoring. Scheduled runs classify every record as NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED, with per-campaign state you can name or share and
ignoreFieldsForChangesto silence noisy fields. - Structured failures. A blocked or broken run fails loudly with a clear message instead of silently returning an empty dataset.
Use Cases
- Gig marketplace researchers: compare tasker hourly rates and service demand across cities and categories.
- Local services directories: feed live tasker cards (rates, ratings, availability) into your own site or app.
- Marketplace analysts: track rating distributions, review volume and elite status over time.
- Pricing teams: pull the going hourly rate for a service category across several cities at once.
- Quality and sentiment analysts: collect a tasker's public reviews for service quality or sentiment analysis.
Data You Get
Sample shape: values are illustrative placeholders, not from a live tasker.
| Field | Example |
|---|---|
kind | "tasker" (also "review", "city_review") |
recordId / taskId | "3000042" / 3000042 |
url | "https://www.taskrabbit.com/profile/sample-t--9" |
displayName | "Sample T." |
cityName / citySlug | "Portland, OR" / "portland" |
serviceName / serviceSlug | "Furniture Assembly" / "assemble-furniture" |
averageRating | 4.9 |
reviewsCount / totalReviewCount | 120 / 340 |
tasksCount / taskCountProfile | 210 / 512 |
elite | false |
onDuty | true |
positiveRating | "98%" |
hoursWorked | 812.5 |
rabbitSinceYear | 2019 |
vehicleType | "none" |
categories | [{"categoryName": "Furniture Assembly", "hourlyRate": 42.0, "hourlyRateDisplay": "$42.00/hr", ...}] |
ratingDistribution | {"5": 280, "4": 45, ...} |
source | "profile" (or "card" when profile enrichment is off) |
changeType | "NEW" (incremental mode only) |
firstSeenAt / lastSeenAt | "2026-01-01T00:00:00+00:00" |
Review records (kind=review, optional) add reviewId, taskerName, taskerUrl, posterName, rating, positive, message, categoryName, categoryId, canceled, createdAt, reviewType and the full upstream review object (raw). City testimonial records (kind=city_review, optional) carry the recent service reviews shown on each city page: reviewId, citySlug, serviceSlug, authorName, rating, message, createdAt and raw. Tasker records do not carry a raw field; every rate, availability and category value is already exposed under its own name.
How to Use
- Pick a mode:
search(cities and services) orurl(tasker links or ids). - In search mode, fill in Cities and Services; profile enrichment (rates and availability) is on by default.
- Turn on the review toggle when you also want review rows, and set Max items to control run size and cost.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
City and service search:
{"mode": "search","locations": ["Portland, OR", "Austin, Texas"],"services": ["furniture assembly", "tv mounting"],"maxItems": 40}
Read specific taskers by link or id:
{"mode": "url","profileInputs": ["3000042", "https://www.taskrabbit.com/profile/sample-t--9"]}
Also collect each tasker's reviews:
{"mode": "search","locations": ["Chicago"],"services": ["house cleaning"],"includeReviews": true,"maxReviewsPerTasker": 20,"maxItems": 60}
Recurring monitoring for one city and service:
{"mode": "search","locations": ["Denver"],"services": ["handyman"],"incrementalMode": true,"emitExpired": true,"stateKey": "denver-handyman-weekly"}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/taskrabbit-tasker-scraper").call(run_input={"mode": "search","locations": ["Portland, OR"],"services": ["furniture assembly"],})for tasker in client.dataset(run["defaultDatasetId"]).iterate_items():print(tasker["displayName"], tasker.get("averageRating"))
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/taskrabbit-tasker-scraper').call({mode: 'search',locations: ['Portland, OR'],services: ['furniture assembly'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Source coverage per scope
Each city and service pair carries the featured taskers module the source itself shows there, up to 6 taskers. There is no deeper public listing behind that module (the interactive "all taskers" flow sits behind the booking funnel), so wider coverage comes from adding more cities or services, not from paging one scope. Per-tasker depth (rates, hours, availability, categories, paginated reviews) is unlimited once a tasker is found.
If the same tasker is featured in more than one of the cities or services you search in a single run, only the first scope reached produces a row for that tasker; the later scope's occurrence of the same tasker is treated as already seen and does not produce a second row. That one row's city and service fields (and its listing-card fields such as bio, reviewsCount and tasksCount) describe only the first scope, so per-scope tasker counts come out lower than what the source features there. Run overlapping city or service combinations in separate runs if you need one row per city and service pairing even for a tasker who is featured in several of them.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset id and the actor skips every tasker or review already collected there, so you don't pay twice. - Incremental mode (
incrementalMode) is for scheduled runs over the same cities and services. Each record is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on),REAPPEAREDorEXPIRED(only after a run that scanned the whole scope without being resumed, and only withemitExpired).stateKeynames or shares the stored state. Rotating image addresses, the rating breakdown and the live demand flag never make a rowUPDATED(they are still returned); add more withignoreFieldsForChanges.EXPIREDrows count towardmaxItems(one budget per run, shared by every city and service in it) and are never produced by a capped or partial run. With incremental mode off, output is exactly as before. - Resume and incremental mode combine safely: a resumed run skips the records the interrupted run already returned (tasker, review, city review and service info rows) and also saves them to the monitoring state, so the next scheduled run does not return (or bill) them again as
NEW. A resumed run never marks anythingEXPIRED.
Send results into your apps (MCP connectors)
Optionally pipe results into the apps you already use through Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape, and it never changes the dataset.
- Authorize a connector once under Apify, Settings, API and Integrations (Notion, Linear, Airtable or Apify).
- Select it in the mcpConnectors field. If the picker is empty, you have not authorized a connector yet.
- For Notion, also set notionParentPageUrl to the URL or id of the page under which item pages are created.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (cities and services) or url (tasker links or ids). |
locations | array | ["Portland, OR"] | US city names, one per entry (search mode). Matched to the source's own city pages automatically. |
services | array | ["furniture assembly", "tv mounting"] | Service categories (search mode); friendly names and source slugs both work. |
profileInputs | array | one example per link shape | Tasker links or numeric ids, city and city + service links, the locations index and the city sitemap (url mode). |
urls | array | one example per link shape | Alias for profileInputs, accepted under the name other Apify actors use for url mode. A customised alias or profileInputs wins over the untouched default of the other. |
maxItems | integer | 20 | Stop after this many records (0 = no limit). Tasker and review records share this budget. |
includeProfiles | boolean | true | Search mode: fetch each tasker's full profile for rates and availability. Off = card-only pull, no rates. |
includeReviews | boolean | false | Also emit one record per public review, kind=review. In search mode it needs profile enrichment on: a tasker whose profile was not read gets no review rows. |
maxReviewsPerTasker | integer | 20 | Maximum reviews returned per tasker (max 100); never more rows than this number are delivered for one tasker. Max items still caps the whole run. |
includeCityReviews | boolean | false | Also emit the city pages' recent service testimonials, kind=city_review. |
scrapeServiceInfo | boolean | false | Also emit one kind=service_info record per city and service page with its FAQ questions and answers. Each such record is a normal result record and counts toward Max items. |
maxTaskersPerPage | integer | 6 | Take at most this many featured taskers per city and service page (1-20). The source features 6 per page, so higher values return the same 6. |
resumeFromRunId | string | (none) | Continue one interrupted run, skipping records already collected there. |
incrementalMode | boolean | false | Turn on for daily or recurring monitoring: only new, updated and reappeared records are returned by default. |
stateKey | string | (none) | Name a monitoring campaign to keep its state stable, or deliberately share state across runs. |
emitUnchanged | boolean | false | Also return (and bill) records unchanged since the last run. |
emitExpired | boolean | false | Also return (and bill) records no longer found, once a run has fully scanned its scope. |
ignoreFieldsForChanges | array | none | Field names (or dotted paths such as categories.hourlyRateDisplay) that must not make a tasker count as UPDATED. Incremental mode only. |
mcpConnectors | array | (none) | Optional: send results into apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which records are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
proxyConfiguration | object | Apify Proxy | Connection settings. |
Filters apply to search mode; url mode reads the links you name directly, and city and service fields are ignored there.
URL mode link shapes
Behaviour change: url mode with the link field left untouched now scrapes one example per link shape (the 7 links in the field default), instead of a single tasker. Clear the field and add your own links to read only those.
| Link shape | Example | What you get |
|---|---|---|
| Tasker API link | https://www.taskrabbit.com/api/v3/rabbits/1883135 | the tasker record |
| Tasker reviews link | https://www.taskrabbit.com/api/v3/rabbits/1883135/reviews?page=2 | review rows, starting at that page, up to maxReviewsPerTasker |
| Bare tasker id | 1883135 | the tasker record (accepted, but not one of the 7 links in the field default) |
| Profile link by id | https://www.taskrabbit.com/profile/1883135 | the tasker record |
| Profile link by name slug | https://www.taskrabbit.com/profile/glenn-w--3 | the tasker record (the slug is resolved to the tasker id) |
| City page | https://www.taskrabbit.com/locations/portland | the taskers featured for the city's popular services |
| City + service page | https://www.taskrabbit.com/locations/portland/lawn-mowing | the taskers featured for that service (the bare taskrabbit.com host works too) |
| Locations index | https://www.taskrabbit.com/locations | every listed city, in page order, until maxItems |
| City sitemap | https://www.taskrabbit.com/sitemaps/www.taskrabbit.com/geo_marketing_pages.xml.gz | every sitemap city, in order, until maxItems |
Trailing slashes are ignored. A link that matches none of these shapes is skipped with a warning in the run log, never a silent empty result. In search mode, plain city and service names are resolved the same way; a name that matches nothing stops the run with a clear message.
Field aliases and input mapping
Every tasker record also carries dataType, taskerId, name, isElite, profileUrl, location and service, duplicates of kind, recordId, displayName, elite, url, cityName and serviceName, so exports written for other TaskRabbit actors keep working. Other actors' scrapeReviews option corresponds to includeReviews here (off by default), and scrapeServiceInfo is the same name here (off by default).
Output tabs and run summary
The Output tab has one table per record kind: Results (taskers), Tasker reviews, City and service reviews, Service FAQs and Changes since last run (incremental rows). Each run also saves an OUTPUT record in the key-value store with row counts per kind and per change type, whether maxItems was reached, and how many scopes failed or matched no page.
Output Example
Sample shape: values are illustrative placeholders, not from a live tasker.
{"kind": "tasker","recordId": "3000042","taskId": 3000042,"displayName": "Sample T.","citySlug": "portland","serviceSlug": "assemble-furniture","cityName": "Portland, OR","metroId": 1058,"serviceName": "Furniture Assembly","v3CategoryId": 33,"v3TaskTemplateId": 7,"averageRating": 4.9,"reviewsCount": 120,"tasksCount": 210,"elite": false,"bio": "Sample bio text describing experience with assembly and mounting work.","imageUrl": "https://www.taskrabbit.com/img/sample-card.jpg","source": "profile","slug": "sample-t--9","url": "https://www.taskrabbit.com/profile/sample-t--9","metroName": "Portland","hoursWorked": 812.5,"positiveRating": "98%","onDuty": true,"taskCountProfile": 512,"rabbitSinceYear": 2019,"vehicleType": "none","phoneNumberMasked": "XXXXXXXXXX99","description": "Sample profile description text.","avatarUrl": "https://www.taskrabbit.com/img/sample-avatar.jpg","categories": [{"categoryId": 33,"categoryName": "Furniture Assembly","focused": true,"hourlyRate": 42.0,"hourlyRateDisplay": "$42.00/hr","hourlyRateCurrency": "usd","posterRateDisplay": "$49.50/hr","serviceFeePercent": 15.0,"inDemand": true}],"totalReviewCount": 340,"ratingDistribution": { "1": 2, "2": 3, "3": 10, "4": 45, "5": 280 }}
Plan Requirement
Every route this actor reads answers openly, so the default Apify datacenter connection is enough and no residential proxy is required. A plan with Apify proxy access is still needed: if the proxy refuses the connection for your account, the run stops with "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required". If a backup connection answers instead of the default one, the log says "Served over the backup connection (the default connection was unavailable)." If residential access is unavailable and the backup also fails, the run stops with "No results: residential proxies are unavailable on this run". For any other all-requests-failed run the message is "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search." You can also supply your own proxy URLs in the proxy field.
Pricing events
Two events are registered: one per record returned (taskers, reviews, city reviews and FAQ rows alike) and the standard Actor start event. Current rates are on the Pricing tab.
FAQ
How much does it cost?
You pay per record returned, with tasker and review rows sharing the same rate. The Pricing tab shows the current rates. Use Max items to cap the cost of a run: it limits every row the run returns, including EXPIRED rows when Emit expired records is on (one budget per run, shared by every city and service).
Is it legal to scrape TaskRabbit?
This actor collects only publicly available tasker listing and profile data. You are responsible for how you use it: follow TaskRabbit's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Tasker photos, bios and reviews may carry personal or third-party rights beyond plain facts like a rate or a rating.
Can I get only new or changed taskers on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared records by default, and unchanged ones are not billed unless you turn on Emit unchanged records.
Why does a city only return a handful of taskers?
Each city and service pair carries up to 6 featured taskers, the same number the source itself shows there; there is no deeper public listing behind that page. Add more cities or services to widen coverage.
Why did my run fail instead of returning an empty dataset?
If the site refuses every request, or none of the given cities and services matched a real page, the run stops with a clear message so "no taskers found" is never confused with "nothing could be read". Check the city and service names, or try again in a few minutes for a connection problem.
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.
๐ More scrapers you might like
Pair this actor with these related scrapers from the same team:
| ๐จ Rover Pet Care Scraper Scrape Rover.com pet-care providers: sitter search by city, rates per stay type, ratings... | ๐ฑ Clutch Scraper Scrape Clutch company directories and profiles. Get names, ratings, review counts, hourly... |
| ๐ผ Superprof Scraper Scrape Superprof tutors by subject and location, or paste tutor URLs. One rich record per... | ๐งฉ Padmapper Scraper Scrape Padmapper apartment rentals across US/CA cities: rent, beds, baths, sqft... |
| ๐งฉ Viagogo Scraper Scrape Viagogo events by artist, production, venue, city, category, or URL. Extract event... | ๐งฉ Too Good To Go Scraper Scrape Too Good To Go (TGTG) stores and surprise bags by location or item: price, value... |
๐ 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.