{"record":{"id":"48361f7727fd0b05","repo":"santifer/career-ops","slug":"vc-portfolios-a16z-portfolio-fetch-failed-err","errorCode":null,"errorMessage":"vc-portfolios: a16z portfolio fetch failed — ${err.message}","messagePattern":"vc-portfolios: a16z portfolio fetch failed — (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"seeds/vc-portfolios.mjs","lineNumber":419,"sourceCode":"  return null;\n}\n\n/**\n * Fetch the a16z public portfolio page and return parsed SeedCompany entries.\n *\n * a16z does not expose a public JSON API, so we fetch the HTML portfolio page\n * and parse it with `parseA16zPayload()`.\n *\n * @param {{ timeoutMs?: number }} [opts]\n * @returns {Promise<SeedCompany[]>}\n */\nexport async function fetchA16zCompanies({ timeoutMs = DEFAULT_TIMEOUT_MS } = {}) {\n  let html;\n  try {\n    const res = await fetchWithTimeout(A16Z_PORTFOLIO_URL, { timeoutMs });\n    html = await res.text();\n  } catch (err) {\n    throw new Error(`vc-portfolios: a16z portfolio fetch failed — ${err.message}`);\n  }\n  return parseA16zPayload(html);\n}\n\n// ── SEED_SOURCES registry ────────────────────────────────────────────\n\n/**\n * Registry mapping seed source names to their fetch functions.\n * Consumed by scan-ats-full.mjs --seeds flag and CLI tooling.\n *\n * To add a new VC portfolio:\n *  1. Add a fetchXyzCompanies() function above.\n *  2. Add an entry here: { fetch: fetchXyzCompanies, label: 'XYZ Portfolio' }\n *\n * @type {Record<string, { fetch: (opts?: object) => Promise<SeedCompany[]>, label: string }>}\n */\nexport const SEED_SOURCES = {\n  yc: {","sourceCodeStart":401,"sourceCodeEnd":437,"githubUrl":"https://github.com/santifer/career-ops/blob/9b17a8ac97b398a496b38e423ae24e433b43254f/seeds/vc-portfolios.mjs#L401-L437","documentation":"fetchA16zCompanies() fetches the a16z portfolio HTML page (no public JSON API) and parses it. If the fetch itself fails (network error or non-2xx via fetchWithTimeout), it throws an Error wrapping the underlying message. Unlike the YC path, there is no partial-data tolerance because a16z is a single page.","triggerScenarios":"The a16z portfolio URL (A16Z_PORTFOLIO_URL) returns non-2xx, is unreachable, or the abort timeout fires. Also if the page is behind a bot-protection layer returning 403.","commonSituations":"a16z redesigns their portfolio page and the URL changes; bot-protection (e.g. Cloudflare) blocks the automated fetch; transient network issues; a corporate firewall.","solutions":["Verify the URL is still valid in a browser; if a16z moved the page, update A16Z_PORTFOLIO_URL in seeds/vc-portfolios.mjs.","Retry — transient 5xx or bot-challenge pages may clear.","Run from a residential/non-blocked IP if 403.","Drop 'a16z' from the --seeds list to continue with other seeds."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"let a16zCompanies = [];\ntry {\n  a16zCompanies = await fetchA16zCompanies({ timeoutMs });\n} catch (err) {\n  if (err.message.includes('a16z portfolio fetch failed')) {\n    console.error(`a16z seed unavailable: ${err.message}. Skipping.`);\n  } else throw err;\n}","preventionTips":["Gracefully skip individual seed sources that fail so one down endpoint does not abort the whole scan.","Keep A16Z_PORTFOLIO_URL updated when a16z redesigns their site.","Cache successful seed fetches to ride out transient outages."],"tags":["network","seeds","vc-portfolios","a16z","fetch","html-scraping"],"backgroundTag":null,"analyzedSha":"9b17a8ac97b398a496b38e423ae24e433b43254f","analyzedAt":"2026-08-13T00:48:39.135Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}