Site Name
Upwork
Site URL
https://www.upwork.com
Desired Commands
search — keyword job search with --location / --sort / --page / --per_page filters
feed — personalized recommended jobs (best-matches | most-recent), requires login
detail — full job posting + client stats, looked up by ciphertext id
Example Links or API Endpoints
- Search page:
https://www.upwork.com/nx/search/jobs/?q=react
- Feed page:
https://www.upwork.com/nx/find-work/best-matches
- Job detail:
https://www.upwork.com/jobs/~<ciphertext>
All three are Cloudflare-protected, so the adapter plans to run in browser mode with Strategy.COOKIE. Data is read from the embedded Nuxt state (window.__NUXT__.state.{jobsSearch,feedBestMatch,feedMostRecent}.jobs[] for lists, window.$nuxt.$store.state.jobDetails.{job,buyer} for detail) rather than DOM scraping, since Upwork's card markup changes frequently. Decoders normalize Upwork's three coded enum styles (i18n keys like jsn_Intermediate_206 on search, rendered labels on feed, numeric contractorTier on detail) so output columns stay stable across surfaces.
Willing to Contribute?
Implementation is already drafted locally (3 adapters + shared utils.js + 41 unit tests covering validators, decoders, URL builders, row mappers, and func-level happy / auth / challenge / empty paths). Will open the PR once this issue gets a 👍 from a maintainer.
Implementation drafted with Claude Code assistance.
Site Name
Upwork
Site URL
https://www.upwork.com
Desired Commands
search— keyword job search with--location/--sort/--page/--per_pagefiltersfeed— personalized recommended jobs (best-matches|most-recent), requires logindetail— full job posting + client stats, looked up by ciphertext idExample Links or API Endpoints
https://www.upwork.com/nx/search/jobs/?q=reacthttps://www.upwork.com/nx/find-work/best-matcheshttps://www.upwork.com/jobs/~<ciphertext>All three are Cloudflare-protected, so the adapter plans to run in browser mode with
Strategy.COOKIE. Data is read from the embedded Nuxt state (window.__NUXT__.state.{jobsSearch,feedBestMatch,feedMostRecent}.jobs[]for lists,window.$nuxt.$store.state.jobDetails.{job,buyer}for detail) rather than DOM scraping, since Upwork's card markup changes frequently. Decoders normalize Upwork's three coded enum styles (i18n keys likejsn_Intermediate_206on search, rendered labels on feed, numericcontractorTieron detail) so output columns stay stable across surfaces.Willing to Contribute?
Implementation is already drafted locally (3 adapters + shared
utils.js+ 41 unit tests covering validators, decoders, URL builders, row mappers, and func-level happy / auth / challenge / empty paths). Will open the PR once this issue gets a 👍 from a maintainer.Implementation drafted with Claude Code assistance.