santifer/career-ops · error · Error

jobvite: could not find companyEId on ${boardUrl} for ${entr

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

Thrown after the discovery path fetched the Jobvite board page HTML but extractEidFromBoard() could not find the companyEId value in the inline JavaScript. This is the runtime discovery fallback (path 3) failing: the provider made one extra request to scrape the eId from the board page source, and the expected companyEId: '…' token was absent — usually because the board page was redesigned, the slug is retired and serves search.jobvite.com?invalid=1, or the tenant migrated off Jobvite.

Source

Thrown at providers/jobvite.mjs:303

    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 9b17a8ac97)

Solutions

  1. Set company_eid: explicitly on the entry (open the board page, view source, copy the companyEId value) to skip discovery entirely.
  2. Confirm the slug is still a live Jobvite tenant by opening the board URL in a browser; if it redirects to search.jobvite.com?invalid=1, the tenant is gone.
  3. If the board page structure changed, update extractEidFromBoard's regex to match the new companyEId assignment shape.

Example fix

# before — relies on discovery, which broke
acme:
  provider: jobvite
  careers_url: https://jobs.jobvite.com/acme

# after — pin the eId, discovery is bypassed
acme:
  provider: jobvite
  careers_url: https://jobs.jobvite.com/acme
  company_eid: q6NaVfwI
Defensive patterns

Strategy: validation

Validate before calling

// Verify the board page exposes companyEId before relying on discovery.
async function boardExposesEid(fetchText, boardUrl) {
  const html = await fetchText(boardUrl);
  return /companyEId\s*:\s*['"][^'"]+['"]/i.test(html);
}

Try / catch

try {
  jobs = await provider.fetch(entry, ctx);
} catch (err) {
  if (/could not find companyEId/.test(err.message)) {
    console.error(`${entry.name}: discovery failed — set company_eid manually`);
  }
  throw err;
}

Prevention

When it happens

Trigger: A Jobvite vanity slug whose board page no longer contains the companyEId token (board redesign, retired slug, or invalid-redirect page served despite redirect:'error'); an edge case where the inline JS uses a different quoting or variable name than the scraper's regex expects.

Common situations: Jobvite shipped a board page redesign that renamed or moved the companyEId assignment; the company left Jobvite so the slug answers an invalid page; a transient full-page error (maintenance, WAF) that returned HTML without the token.

Related errors


AI-assisted analysis of santifer/career-ops@9b17a8ac97 (2026-08-13). Data as JSON: /api/errors/0c7b0d9e189a1070. Report an issue: GitHub.