{"record":{"id":"0c7b0d9e189a1070","repo":"santifer/career-ops","slug":"jobvite-could-not-find-companyeid-on-boardurl","errorCode":null,"errorMessage":"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: '…').","messagePattern":"jobvite: could not find companyEId on (.+?) for (.+?)\\. Set it explicitly with company_eid: \\(find it in the board page source as companyEId: '…'\\)\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"providers/jobvite.mjs","lineNumber":309,"sourceCode":"    const slug = resolveSlug(entry);\n    return slug ? { url: buildBoardUrl(slug) } : null;\n  },\n\n  async fetch(entry, ctx) {\n    let eid = resolveConfiguredEid(entry);\n\n    if (!eid) {\n      const slug = resolveSlug(entry);\n      if (!slug) throw new Error(`jobvite: cannot derive a company id for ${entry.name} — set company_eid: or an api: URL with ?c=`);\n      const boardUrl = buildBoardFetchUrl(slug);\n      assertJobviteHost(boardUrl);\n      // redirect:'error' here, not 'manual'. A board that still redirects once\n      // fr=true&nl=1 is present is a retired slug answering\n      // search.jobvite.com?invalid=1, and that must fail loudly.\n      const html = await fetchTextWithRetry(ctx, boardUrl, { redirect: 'error' }, RETRY_POLICY);\n      eid = extractEidFromBoard(html);\n      if (!eid) {\n        throw new Error(\n          `jobvite: could not find companyEId on ${boardUrl} for ${entry.name}. ` +\n          `Set it explicitly with company_eid: (find it in the board page source as companyEId: '…').`,\n        );\n      }\n    }\n\n    const feedUrl = buildFeedUrl(eid);\n    assertJobviteHost(feedUrl);\n    try {\n      const xml = await fetchTextWithRetry(\n        ctx,\n        feedUrl,\n        { redirect: 'manual', timeoutMs: FEED_TIMEOUT_MS },\n        RETRY_POLICY,\n      );\n      return parseJobviteXml(xml, entry.name);\n    } catch (err) {\n      // An empty board is reported as a redirect to NoJobs.htm rather than as","sourceCodeStart":291,"sourceCodeEnd":327,"githubUrl":"https://github.com/santifer/career-ops/blob/aac998c7ed7248ea853b720ceeb1fdbeb322fc5d/providers/jobvite.mjs#L291-L327","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before (portals.yml)\nprovider: jobvite\ncareers_url: https://jobs.jobvite.com/acme-old\n// after\nprovider: jobvite\ncareers_url: https://jobs.jobvite.com/acme\ncompany_eid: \"7654321\"","handlingStrategy":"try-catch","validationCode":"const html = await fetch(boardUrl).then(r => r.text());\nif (!/companyEId\\s*[:=]\\s*['\"]?\\d+/.test(html)) console.warn(`no companyEId on ${boardUrl} — set company_eid:`);","typeGuard":null,"tryCatchPattern":"try {\n  await provider.fetch(entry, ctx);\n} catch (e) {\n  if (e.message.includes('could not find companyEId')) {\n    // board slug is retired or markup changed — set company_eid manually\n    entry.company_eid = promptForEid(entry);\n  }\n}","preventionTips":["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."],"tags":["scraping","jobvite","missing-data","network"],"backgroundTag":"unexpected-response-shape","analyzedSha":"aac998c7ed7248ea853b720ceeb1fdbeb322fc5d","analyzedAt":"2026-09-16T06:35:29.214Z","contentChangedAt":"2026-09-16T06:35:29.214Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}