santifer/career-ops · error · Error
vc-portfolios: a16z portfolio fetch failed — ${err.message}
Error message
vc-portfolios: a16z portfolio fetch failed — ${err.message} What it means
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.
Source
Thrown at seeds/vc-portfolios.mjs:419
return null;
}
/**
* Fetch the a16z public portfolio page and return parsed SeedCompany entries.
*
* a16z does not expose a public JSON API, so we fetch the HTML portfolio page
* and parse it with `parseA16zPayload()`.
*
* @param {{ timeoutMs?: number }} [opts]
* @returns {Promise<SeedCompany[]>}
*/
export async function fetchA16zCompanies({ timeoutMs = DEFAULT_TIMEOUT_MS } = {}) {
let html;
try {
const res = await fetchWithTimeout(A16Z_PORTFOLIO_URL, { timeoutMs });
html = await res.text();
} catch (err) {
throw new Error(`vc-portfolios: a16z portfolio fetch failed — ${err.message}`);
}
return parseA16zPayload(html);
}
// ── SEED_SOURCES registry ────────────────────────────────────────────
/**
* Registry mapping seed source names to their fetch functions.
* Consumed by scan-ats-full.mjs --seeds flag and CLI tooling.
*
* To add a new VC portfolio:
* 1. Add a fetchXyzCompanies() function above.
* 2. Add an entry here: { fetch: fetchXyzCompanies, label: 'XYZ Portfolio' }
*
* @type {Record<string, { fetch: (opts?: object) => Promise<SeedCompany[]>, label: string }>}
*/
export const SEED_SOURCES = {
yc: {View on GitHub (pinned to 9b17a8ac97)
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.
Defensive patterns
Strategy: fallback
Try / catch
let a16zCompanies = [];
try {
a16zCompanies = await fetchA16zCompanies({ timeoutMs });
} catch (err) {
if (err.message.includes('a16z portfolio fetch failed')) {
console.error(`a16z seed unavailable: ${err.message}. Skipping.`);
} else throw err;
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: a16z redesigns their portfolio page and the URL changes; bot-protection (e.g. Cloudflare) blocks the automated fetch; transient network issues; a corporate firewall.
Related errors
- vc-portfolios: YC API fetch failed — ${err.message}
- HTTP ${res.status}${snippet ? ': ' + snippet.replace(/\s+/g,
- HTTP ${r.status} ${r.statusText}
- Could not fetch job page: ${e.message}
- DNS resolution returned no addresses for ${hostname}
AI-assisted analysis of santifer/career-ops@9b17a8ac97 (2026-08-13).
Data as JSON: /api/errors/48361f7727fd0b05.
Report an issue: GitHub.