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

  1. Verify the URL is still valid in a browser; if a16z moved the page, update A16Z_PORTFOLIO_URL in seeds/vc-portfolios.mjs.
  2. Retry — transient 5xx or bot-challenge pages may clear.
  3. Run from a residential/non-blocked IP if 403.
  4. 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

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


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