TaskRabbit Scraper - Taskers, Rates, Ratings & Availability avatar

TaskRabbit Scraper - Taskers, Rates, Ratings & Availability

Pricing

from $1.60 / 1,000 tasker or review records

Go to Apify Store
TaskRabbit Scraper - Taskers, Rates, Ratings & Availability

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

Abot API

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

14 days ago

Last modified

Categories

Features

Limited permissions

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 ignoreFieldsForChanges to 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.

FieldExample
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"
averageRating4.9
reviewsCount / totalReviewCount120 / 340
tasksCount / taskCountProfile210 / 512
elitefalse
onDutytrue
positiveRating"98%"
hoursWorked812.5
rabbitSinceYear2019
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

  1. Pick a mode: search (cities and services) or url (tasker links or ids).
  2. In search mode, fill in Cities and Services; profile enrichment (rates and availability) is on by default.
  3. Turn on the review toggle when you also want review rows, and set Max items to control run size and cost.
  4. 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 ApifyClient
client = 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 classified NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED or EXPIRED (only after a run that scanned the whole scope without being resumed, and only with emitExpired). stateKey names or shares the stored state. Rotating image addresses, the rating breakdown and the live demand flag never make a row UPDATED (they are still returned); add more with ignoreFieldsForChanges. EXPIRED rows count toward maxItems (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 anything EXPIRED.

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.

  1. Authorize a connector once under Apify, Settings, API and Integrations (Notion, Linear, Airtable or Apify).
  2. Select it in the mcpConnectors field. If the picker is empty, you have not authorized a connector yet.
  3. For Notion, also set notionParentPageUrl to the URL or id of the page under which item pages are created.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (cities and services) or url (tasker links or ids).
locationsarray["Portland, OR"]US city names, one per entry (search mode). Matched to the source's own city pages automatically.
servicesarray["furniture assembly", "tv mounting"]Service categories (search mode); friendly names and source slugs both work.
profileInputsarrayone example per link shapeTasker links or numeric ids, city and city + service links, the locations index and the city sitemap (url mode).
urlsarrayone example per link shapeAlias 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.
maxItemsinteger20Stop after this many records (0 = no limit). Tasker and review records share this budget.
includeProfilesbooleantrueSearch mode: fetch each tasker's full profile for rates and availability. Off = card-only pull, no rates.
includeReviewsbooleanfalseAlso 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.
maxReviewsPerTaskerinteger20Maximum reviews returned per tasker (max 100); never more rows than this number are delivered for one tasker. Max items still caps the whole run.
includeCityReviewsbooleanfalseAlso emit the city pages' recent service testimonials, kind=city_review.
scrapeServiceInfobooleanfalseAlso 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.
maxTaskersPerPageinteger6Take 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.
resumeFromRunIdstring(none)Continue one interrupted run, skipping records already collected there.
incrementalModebooleanfalseTurn on for daily or recurring monitoring: only new, updated and reappeared records are returned by default.
stateKeystring(none)Name a monitoring campaign to keep its state stable, or deliberately share state across runs.
emitUnchangedbooleanfalseAlso return (and bill) records unchanged since the last run.
emitExpiredbooleanfalseAlso return (and bill) records no longer found, once a run has fully scanned its scope.
ignoreFieldsForChangesarraynoneField names (or dotted paths such as categories.hourlyRateDisplay) that must not make a tasker count as UPDATED. Incremental mode only.
mcpConnectorsarray(none)Optional: send results into apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which records are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Does not affect the dataset.
proxyConfigurationobjectApify ProxyConnection settings.

Filters apply to search mode; url mode reads the links you name directly, and city and service fields are ignored there.

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 shapeExampleWhat you get
Tasker API linkhttps://www.taskrabbit.com/api/v3/rabbits/1883135the tasker record
Tasker reviews linkhttps://www.taskrabbit.com/api/v3/rabbits/1883135/reviews?page=2review rows, starting at that page, up to maxReviewsPerTasker
Bare tasker id1883135the tasker record (accepted, but not one of the 7 links in the field default)
Profile link by idhttps://www.taskrabbit.com/profile/1883135the tasker record
Profile link by name slughttps://www.taskrabbit.com/profile/glenn-w--3the tasker record (the slug is resolved to the tasker id)
City pagehttps://www.taskrabbit.com/locations/portlandthe taskers featured for the city's popular services
City + service pagehttps://www.taskrabbit.com/locations/portland/lawn-mowingthe taskers featured for that service (the bare taskrabbit.com host works too)
Locations indexhttps://www.taskrabbit.com/locationsevery listed city, in page order, until maxItems
City sitemaphttps://www.taskrabbit.com/sitemaps/www.taskrabbit.com/geo_marketing_pages.xml.gzevery 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).

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.