jackwener/OpenCLI · warning · EmptyResultError
Upwork ${tab} feed is empty for the current account
Error message
Upwork ${tab} feed is empty for the current account What it means
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'.
Source
Thrown at clis/upwork/feed.js:100
if (payload?.onLogin) {
throw new AuthRequiredError('upwork.com', 'Upwork redirected to login. Open https://www.upwork.com in the connected browser and sign in, then retry.');
}
if (payload?.challenge) {
throw new CommandExecutionError('Upwork served a Cloudflare challenge page', 'Open https://www.upwork.com in the connected browser and clear the challenge, then retry.');
}
if (!payload?.ready) {
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.');
}
if (!isPlainObject(payload)) {
throw new CommandExecutionError('Upwork feed returned an unexpected Browser Bridge payload shape');
}
if (!payload.jobsPresent || !Array.isArray(payload.jobs)) {
throw new CommandExecutionError(`Upwork feed state had an unexpected jobs shape; expected window.__NUXT__.state.${stateKey}.jobs to be an array.`);
}
const jobs = payload.jobs;
if (jobs.length === 0) {
throw new EmptyResultError(`upwork feed ${tab}`, `Upwork ${tab} feed is empty for the current account`);
}
const rows = jobsToListRows(jobs, { limit });
if (rows.length === 0) {
throw new CommandExecutionError('Upwork feed results did not include any job with a valid ciphertext id; cannot produce round-trippable detail rows.');
}
return rows;
},
});
View on GitHub (pinned to 49907e53dc)
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).
Example fix
// before
const jobs = await upwork.feed(); // throws EmptyResultError on empty feed
// after
try {
const jobs = await upwork.feed();
} catch (e) {
if (e instanceof EmptyResultError) return []; // treat as empty, not fatal
throw e;
} Defensive patterns
Strategy: try-catch
Try / catch
import { EmptyResultError } from '@jackwener/opencli/errors';
try {
const jobs = await upwork.feed();
} catch (e) {
if (e instanceof EmptyResultError) {
return []; // normal empty feed: schedule a re-poll instead of failing
}
throw e;
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Understand the failure class
Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.
Related errors
- No trains found from ${fromStation.name} to ${toStation.name
- NO_DATA
- No Wayback snapshots for "${target}".
- Chess.com has no game archives for ${username}
- Chess.com has games archives for ${username} but no games in
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/75f149f11edea6af.
Report an issue: GitHub.