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

  1. Open the board URL in a browser, view source, locate companyEId: '…', and add `company_eid: <id>` to the portals.yml entry.
  2. Verify the company still uses Jobvite; if it moved to another ATS, update the provider/URL for that portal entry.
  3. 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

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


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 as

View on GitHub (pinned to aac998c7ed)