moxlade/guides/vs crw

moxlade/upwork-freelancers vs crw/upwork-talent-scraper: the fastest run-time scraper in the lane, measured against ours

Of the eleven Upwork talent scrapers we ran on 2026-09-11, crw/upwork-talent-scraper was the one we would have picked before ours existed: it calls Upwork's search API rather than the page, so it answered in 3 to 5 s, honoured its badge and country filters, charged exactly list and returned the exact earnings figure. This page puts it next to ours. Written by the maker of ours.

published 2026-09-13 · updated 2026-09-13

Disclosure: Moxlade makes one of the two actors on this page. The crw figures are from our own runs of it on 2026-09-11 (and 2026-08-20), read from the settled run objects; ours are from our release runs on 2026-09-12 and our table on 2026-09-13.

Side by side

crw/upwork-talent-scrapermoxlade/upwork-freelancers
how it workscalls Upwork's search API at run time ("API total: 10000" in its log)answers from a census of 30,042 profiles; the same live call on request
list price$0.00005 per start + $0.005 per row$0.004 per stored row, $0.005 live, $0.02 per full profile; no start fee
paid, per 1,000$5.02, exactly list$4.00 stored; $5.00 live
time3–5 s per run; 0.2 s per row at 2525 stored rows in 0.4–1.9 s; 25 live rows in under 30 s
filters that heldtalentBadges 3 of 3, countries 3 of 3, hourlyRateRange: "60+" (65, 100, 100)badge, country, region, numeric rate band, JSS, hours, jobs, earnings, hire-again, tenure, recency, skills — 25 of 25
numeric rate filterhourlyRateMin/hourlyRateMax returned 0 rows every time, alone or combined ("No more profiles returned")rateMin/rateMax, 25 of 25
exact earnings96–100% of rows; 0 when hiddenwith earnings_precision: exact / band / hidden
Job Success Scoreno JSS fieldthe percentage, on 90.3% of stored rows; a filter and a sort
idsciphertext and numeric id, 100%the same, 100%
contracts, feedback, education, employment, languagesnoyes — 395,022 contract rows, 156,836 with feedback both ways
historynofetched_at, versions, changedSince with diffs; private profiles answered
freshnessread at run timestored rows up to 30 days old, stated per row; liveSearch reads now
record22 keys65 typed fields

Where crw wins

  • Every row is current. It asks Upwork on every run; a stored row of ours can be up to 30 days old and says so. Our liveSearch makes the same call, at $5 per 1,000 — the same price as crw.
  • Nothing to learn. Six inputs, one result set, done in five seconds.

Where ours wins

  • The rate band that works as numbers, not an enum — crw's number boxes return nothing.
  • JSS, which crw does not return at all, as a column, a filter (jssMin) and a sort.
  • Hours, jobs, earnings, hire-again, tenure and recency as filters; crw has badge, country and a rate enum.
  • The contract history with feedback both ways, and the sections a visitor never sees.
  • Change since a date, with the diff; private profiles as an answer.
  • $4 against $5 for a stored row, and the same $5 for a live one.

How this was measured

Query python developer on 2026-09-11: crw with talentBadges (3 rows), countries (3), hourlyRateRange: "60+" (3), hourlyRateMin: 50 / hourlyRateMax: 100 (0 of 3, three attempts), and a plain 25-row run started in the same second as three other actors; plus a 5-row plain run from 2026-08-20. Ours on the same query and filters in the release suite of 2026-09-12. The full lane is on Best Upwork freelancer scrapers, measured; the harness and the per-run numbers are on GitHub.

use it

Cheaper still, the numeric rate band that works, JSS as a filter, and the contract history crw has nowhere to read.

moxlade/upwork-freelancers on Apify
$4.00 per 1,000 stored rows · $5.00 per 1,000 live search rows · $20.00 per 1,000 full profiles · no start fee, a zero-row run is free

Questions

Is crw's numeric rate filter broken?
On 2026-09-11 it returned zero rows on every run where hourlyRateMin or hourlyRateMax was set, alone or with other filters, while its enum hourlyRateRange worked. We report what we measured that day.
Does crw return the Job Success Score?
No — its records carry no JSS field. bovi, which returns the same payload with different key names, returns a flag; ours returns the percentage.
Which is cheaper for a live search?
The same: $5 per 1,000 rows on both. Ours is cheaper for a stored search ($4) and the only one of the two with a stored search at all.