{"record":{"id":"75f149f11edea6af","repo":"jackwener/OpenCLI","slug":"upwork-tab-feed-is-empty-for-the-current-accoun","errorCode":null,"errorMessage":"Upwork ${tab} feed is empty for the current account","messagePattern":"Upwork (.+?) feed is empty for the current account","errorType":"exception","errorClass":"EmptyResultError","httpStatus":null,"severity":"warning","filePath":"clis/upwork/feed.js","lineNumber":100,"sourceCode":"        if (payload?.onLogin) {\n            throw new AuthRequiredError('upwork.com', 'Upwork redirected to login. Open https://www.upwork.com in the connected browser and sign in, then retry.');\n        }\n        if (payload?.challenge) {\n            throw new CommandExecutionError('Upwork served a Cloudflare challenge page', 'Open https://www.upwork.com in the connected browser and clear the challenge, then retry.');\n        }\n        if (!payload?.ready) {\n            throw new CommandExecutionError(`Upwork feed state (window.__NUXT__.state.${stateKey}) was not present within 15s`, 'The page may not have finished hydrating, or the SSR state shape may have changed.');\n        }\n        if (!isPlainObject(payload)) {\n            throw new CommandExecutionError('Upwork feed returned an unexpected Browser Bridge payload shape');\n        }\n        if (!payload.jobsPresent || !Array.isArray(payload.jobs)) {\n            throw new CommandExecutionError(`Upwork feed state had an unexpected jobs shape; expected window.__NUXT__.state.${stateKey}.jobs to be an array.`);\n        }\n\n        const jobs = payload.jobs;\n        if (jobs.length === 0) {\n            throw new EmptyResultError(`upwork feed ${tab}`, `Upwork ${tab} feed is empty for the current account`);\n        }\n\n        const rows = jobsToListRows(jobs, { limit });\n        if (rows.length === 0) {\n            throw new CommandExecutionError('Upwork feed results did not include any job with a valid ciphertext id; cannot produce round-trippable detail rows.');\n        }\n        return rows;\n    },\n});\n","sourceCodeStart":82,"sourceCodeEnd":110,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/upwork/feed.js#L82-L110","documentation":"This EmptyResultError is thrown when the feed state hydrated correctly and jobs is a valid array, but that array contains zero items. The library raises it (instead of returning an empty list) so callers explicitly distinguish 'no jobs right now for this account/tab' from structural failures. The resource string interpolates the tab, e.g. 'upwork feed best-matches'.","triggerScenarios":"Calling `upwork feed` (either tab) when the authenticated account's personalized feed is genuinely empty: a brand-new freelancer account with no recommendations, a region/locale with no matched jobs, or a momentary Upwork feed hiccup returning an empty jobs array.","commonSituations":"Newly created Upwork accounts before recommendations populate; niche skill profiles with no Best Matches; checking Most Recent during a quiet period; running right after login before the feed finishes personalizing.","solutions":["Retry later — feeds repopulate continuously; an empty feed is often transient.","Try the other tab: `upwork feed most-recent` if best-matches is empty, or vice versa.","Verify in the browser at https://www.upwork.com/nx/search/jobs/?sort=recency that the feed is truly empty for this account.","Handle EmptyResultError in your code as a normal empty state rather than a hard failure (e.g. back off and re-poll)."],"exampleFix":"// before\nconst jobs = await upwork.feed(); // throws EmptyResultError on empty feed\n// after\ntry {\n  const jobs = await upwork.feed();\n} catch (e) {\n  if (e instanceof EmptyResultError) return []; // treat as empty, not fatal\n  throw e;\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"import { EmptyResultError } from '@jackwener/opencli/errors';\ntry {\n  const jobs = await upwork.feed();\n} catch (e) {\n  if (e instanceof EmptyResultError) {\n    return []; // normal empty feed: schedule a re-poll instead of failing\n  }\n  throw e;\n}","preventionTips":["Treat EmptyResultError as an expected empty state for new/quiet accounts.","Fall back to the other tab (best-matches vs most-recent) when one is empty.","Back off and re-poll later rather than erroring out batch pipelines.","Verify against the web UI once if emptiness persists unexpectedly."],"tags":["upwork","empty-result","no-data","feed"],"backgroundTag":"empty-result-set","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}