jackwener/OpenCLI · warning · EmptyResultError
No Upwork job posting found for id "${id}" (may be closed, e
Error message
No Upwork job posting found for id "${id}" (may be closed, expired, or private) What it means
When the payload is valid but payload.ready is false or payload.job is missing, the command concludes no job data exists for the given id and throws EmptyResultError naming the id and likely causes (closed, expired, or private posting). This distinguishes 'authentically no data' from auth/challenge/shape failures.
Source
Thrown at clis/upwork/detail.js:92
buyer: s.buyer ? JSON.parse(JSON.stringify(s.buyer)) : null,
};
})()`));
}
catch (e) {
throw new CommandExecutionError(`Failed to read Upwork job-detail store: ${e?.message ?? e}`, 'The Vuex store was not reachable; try again after opening Upwork in the connected browser.');
}
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 (!isPlainObject(payload)) {
throw new CommandExecutionError('Upwork detail returned an unexpected Browser Bridge payload shape');
}
if (!payload?.ready || !payload.job) {
throw new EmptyResultError('upwork detail', `No Upwork job posting found for id "${id}" (may be closed, expired, or private)`);
}
if (!isPlainObject(payload.job)) {
throw new CommandExecutionError('Upwork job-detail store had an unexpected job shape; expected an object.');
}
const job = payload.job;
const returnedCiphertext = String(job?.ciphertext ?? '').trim();
if (returnedCiphertext && returnedCiphertext !== id) {
throw new CommandExecutionError(`Upwork job-detail store returned ciphertext "${returnedCiphertext}" while reading "${id}".`);
}
const buyer = payload.buyer || {};
const stats = buyer?.stats || {};
const location = buyer?.location || {};
const category = job?.category?.name || '';
const skills = formatSkills(job);
const totalSpent = Number(stats?.totalCharges?.amount);
const totalHires = Number(stats?.totalJobsWithHires);
const score = Number(stats?.score);View on GitHub (pinned to 49907e53dc)
Solutions
- Verify the job id is correct and open the job URL manually in the browser to confirm it's still public.
- If the page is still loading, retry after it fully renders (ready can be false during hydration).
- Log in to Upwork in the connected browser — private/login-required postings won't expose job data otherwise.
- Accept closed/expired jobs as terminal: filter such ids out of your pipeline instead of retrying.
- If the job is visible in the browser but the error persists, update the library — the ready/job extraction may be outdated.
Defensive patterns
Strategy: try-catch
Validate before calling
if (!/^(~\w+\/)?[0-9a-f]{16,20}$/i.test(jobId) && !~jobId.indexOf('/')) {
console.warn('Job id looks malformed; verify the URL/id before fetching.');
} Try / catch
try {
const detail = await fetchUpworkJobDetail(id);
} catch (e) {
if (e instanceof EmptyResultError) {
console.warn(`Job ${id} unavailable (closed/expired/private) — skipping.`);
return null;
}
throw e;
} Prevention
- Open the job URL manually to confirm it's still live before automation fetches.
- Log in first — private or login-required postings surface as empty results.
- Wait for full page load; reading the store too early yields ready:false.
- Treat closed/expired ids as terminal and filter them from retry queues.
When it happens
Trigger: Calling upwork detail with a job id whose posting is no longer visible: job closed or expired by the buyer, made private, deleted, wrong/typo'd id, or the SPA hasn't finished loading the job (ready:false) when the store was read.
Common situations: Scraping stale job ids from old search results; fetching a job that requires login to view while the payload skips it; querying too quickly after page load before the Vuex store populates; ids from a different Upwork locale/domain.
Related errors
- 1point3acres thread
- 1point3acres user
- amazon ${definition.commandName} did not expose any ranked i
- amazon search did not expose any product cards
- No posts found in this Band
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/3fc6f0978edca4ad.
Report an issue: GitHub.