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-13Disclosure: 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-scraper | moxlade/upwork-freelancers | |
|---|---|---|
| how it works | calls 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 |
| time | 3–5 s per run; 0.2 s per row at 25 | 25 stored rows in 0.4–1.9 s; 25 live rows in under 30 s |
| filters that held | talentBadges 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 filter | hourlyRateMin/hourlyRateMax returned 0 rows every time, alone or combined ("No more profiles returned") | rateMin/rateMax, 25 of 25 |
| exact earnings | 96–100% of rows; 0 when hidden | with earnings_precision: exact / band / hidden |
| Job Success Score | no JSS field | the percentage, on 90.3% of stored rows; a filter and a sort |
| ids | ciphertext and numeric id, 100% | the same, 100% |
| contracts, feedback, education, employment, languages | no | yes — 395,022 contract rows, 156,836 with feedback both ways |
| history | no | fetched_at, versions, changedSince with diffs; private profiles answered |
| freshness | read at run time | stored rows up to 30 days old, stated per row; liveSearch reads now |
| record | 22 keys | 65 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
liveSearchmakes 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.
Cheaper still, the numeric rate band that works, JSS as a filter, and the contract history crw has nowhere to read.
$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 freeQuestions
- Is crw's numeric rate filter broken?
- On 2026-09-11 it returned zero rows on every run where
hourlyRateMinorhourlyRateMaxwas set, alone or with other filters, while its enumhourlyRateRangeworked. 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.