santifer/career-ops · error · Error
jobvite: could not find companyEId on
Error message
jobvite: could not find companyEId on ${boardUrl} for ${entry.name}. Set it explicitly with company_eid: (find it in the board page source as companyEId: '…'). What it means
When no company_eid was configured, jobvite's fetch() fetches the board HTML with redirect:'error' and scrapes extractEidFromBoard() for the companyEId value. If the page was fetched but no companyEId could be extracted (retired slug, board moved, page structure changed), it throws this error advising you to set company_eid: explicitly.
Solutions
- Open the board URL in a browser, view source, locate companyEId: '…', and add `company_eid: <id>` to the portals.yml entry.
- Verify the company still uses Jobvite; if it moved to another ATS, update the provider/URL for that portal entry.
- If the board URL redirects to search.jobvite.com?invalid=1 the slug is dead — find the current slug and fix careers_url.
Example fix
// before (portals.yml) provider: jobvite careers_url: https://jobs.jobvite.com/acme-old // after provider: jobvite careers_url: https://jobs.jobvite.com/acme company_eid: "7654321"
Defensive patterns
Strategy: try-catch
Validate before calling
const html = await fetch(boardUrl).then(r => r.text());
if (!/companyEId\s*[:=]\s*['"]?\d+/.test(html)) console.warn(`no companyEId on ${boardUrl} — set company_eid:`); Try / catch
try {
await provider.fetch(entry, ctx);
} catch (e) {
if (e.message.includes('could not find companyEId')) {
// board slug is retired or markup changed — set company_eid manually
entry.company_eid = promptForEid(entry);
}
} Prevention
- Prefer explicit company_eid: over automatic scraping for every jobvite entry.
- Re-check jobvite entries after the company rebrands or changes its board slug.
- Monitor board pages for Jobvite template changes that break eid extraction.
When it happens
Trigger: fetch() fell back to slug-based board scraping; buildBoardFetchUrl(slug) returned a page (fetch succeeded) whose HTML contains no companyEId — e.g. the slug is retired and Jobvite serves an error/stub page that doesn't redirect, or Jobvite changed the board markup.
Common situations: Company renamed its Jobvite slug; board shut down after a company moved ATS; Jobvite updated the board page template so the regex/scrape no longer matches.
Related errors
- csod: no anonymous token on
- vc-portfolios: a16z portfolio fetch failed
- Access denied: Egress guard blocked private target IP
- Access denied: Egress guard blocked private target IP
- All active models failed. Last error
AI-assisted analysis of santifer/career-ops@aac998c7ed (2026-09-16).
Data as JSON: /api/errors/0c7b0d9e189a1070.
Report an issue: GitHub.
Appendix: source
Thrown at providers/jobvite.mjs:309
const slug = resolveSlug(entry);
return slug ? { url: buildBoardUrl(slug) } : null;
},
async fetch(entry, ctx) {
let eid = resolveConfiguredEid(entry);
if (!eid) {
const slug = resolveSlug(entry);
if (!slug) throw new Error(`jobvite: cannot derive a company id for ${entry.name} — set company_eid: or an api: URL with ?c=`);
const boardUrl = buildBoardFetchUrl(slug);
assertJobviteHost(boardUrl);
// redirect:'error' here, not 'manual'. A board that still redirects once
// fr=true&nl=1 is present is a retired slug answering
// search.jobvite.com?invalid=1, and that must fail loudly.
const html = await fetchTextWithRetry(ctx, boardUrl, { redirect: 'error' }, RETRY_POLICY);
eid = extractEidFromBoard(html);
if (!eid) {
throw new Error(
`jobvite: could not find companyEId on ${boardUrl} for ${entry.name}. ` +
`Set it explicitly with company_eid: (find it in the board page source as companyEId: '…').`,
);
}
}
const feedUrl = buildFeedUrl(eid);
assertJobviteHost(feedUrl);
try {
const xml = await fetchTextWithRetry(
ctx,
feedUrl,
{ redirect: 'manual', timeoutMs: FEED_TIMEOUT_MS },
RETRY_POLICY,
);
return parseJobviteXml(xml, entry.name);
} catch (err) {
// An empty board is reported as a redirect to NoJobs.htm rather than asView on GitHub (pinned to aac998c7ed)