moxlade/upwork-freelancers vs bovi/upwork-talent-scraper: the actor that returned nothing in six runs, measured against ours
bovi/upwork-talent-scraper lists at $0.019 per row, promises "you only pay for the freelancers actually returned", and had 67 users when we measured the lane on 2026-09-11. That day it returned zero rows in six runs — keyword, URL, URL with filters — with BRIGHTDATA_BROWSER_WS not set, no browser fallback in its log. On the last day it delivered, 2026-08-20, it charged 10 events for 5 rows. This page puts it next to ours. Written by the maker of ours.
Disclosure: Moxlade makes one of the two actors on this page. The bovi figures are from our own runs of it on 2026-09-11 and 2026-08-20, read from the settled run objects and its run logs; ours are from our release runs on 2026-09-12 and our table on 2026-09-13.
Side by side
| bovi/upwork-talent-scraper | moxlade/upwork-freelancers | |
|---|---|---|
| how it works | reads Upwork's search result at run time through a managed browser | answers from a census of 30,042 profiles; live read on request |
| rows on 2026-09-11 | 0 in 6 runs (28–64 s each), free | 25 of 25 on every release run |
| list price | $0.019 per row (tiered to $0.01881 on the paid tier) | $0.004 per stored row, $0.005 live, $0.02 per full profile; no start fee |
| paid, per 1,000 delivered | $37.6 on 2026-08-20: 10 profile-result events for 5 rows — it charges the page Upwork returns, not the rows written | $4.00; charged events equalled rows on every release run, the zero-row run at $0.00 |
| time, when it delivered | 12.2 s per row (2026-08-20) | 25 stored rows in 0.4–1.9 s |
| filters | a search URL with facets; untestable on the day, every URL run returned nothing | badge, country, region, numeric rate band, JSS, hours, jobs, earnings, hire-again, tenure, recency, skills — 25 of 25 |
| exact earnings | yes, with an earnings_hidden flag (80% of its 5 rows) | with earnings_precision: exact / band / hidden |
| Job Success Score | a 0/1 flag (its README says the percentage is not returned) | the percentage, on 90.3% of stored rows; a filter and a sort |
| 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 |
| record | 35 keys (the widest in the lane), incl. search_rank | 65 typed fields |
What bovi does well, when it runs
- The honest hidden-earnings flag. Its payload nulls a hidden figure and says so with
earnings_hidden; two other actors in the lane return 0 for hidden and for missed alike. We do the same as bovi, with a third state for a rounded band. - The widest record among the run-time scrapers, with a search rank per row.
- Free when empty. Its six zero-row runs cost nothing; three other actors in the lane charge a start fee before the first row.
Where ours wins
- Rows. A census does not depend on a managed browser being configured in the build; the release suite runs before every deploy and every scenario returned its rows.
- One event per row, after the row is in your dataset — not per page Upwork happened to return.
- Filters at your thresholds, not a URL's facets.
- JSS as the score, hire-again, tenure, recency; the contract history; what changed since a date.
- $4 against $19 list and $37.6 paid.
How this was measured
bovi on 2026-09-11: a keyword run, a plain URL run, a URL with Top Rated + United States, one with a rate facet, a 25-row plain run started in the same second as
the delivering actors, and a late retry with the plain Top Rated + US URL — six runs, zero rows, $0. On 2026-08-20 a plain python run for 5 rows, $0.1881.
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.
Rows every time, one event per row, and the history a search payload never carries.
$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
- Why did bovi return nothing?
- Its run log on 2026-09-11 says
BRIGHTDATA_BROWSER_WS not set, no browser fallbackand then "page 1: 0 profiles" — the managed-browser access it relies on was not configured in the build we ran. Every run ended SUCCEEDED with zero rows, which is why a 30-day success rate can read 99% while nothing is delivered. - Is bovi's 2× charge a one-off?
- It is one measured run (2026-08-20, 5 rows asked, 10 profile-result events charged). We could not add a second data point because bovi delivered no rows on the later day; the run object is what we report.
- Do the two return the same freelancers?
- When bovi delivered, its payload was the same as crw's for the same person in the same second (rate, exact earnings, hours, job counts identical, different key names). A stored search of ours draws on the same public profiles, held and re-read.