santifer/career-ops · error · Error
consider: ${entry.name} needs a 'consider_board' id in porta
Error message
consider: ${entry.name} needs a 'consider_board' id in portals.yml What it means
The Consider board id is not derivable from the hostname (e.g. Founderful's board id is 'wingman'), so the entry must declare it explicitly via `consider_board` in portals.yml. fetch throws this when the origin resolved fine but entry.consider_board is missing/empty, since the search POST body needs board.id.
Source
Thrown at providers/consider.mjs:151
if (Array.isArray(job.normalizedLocations) && job.normalizedLocations.length) {
return job.normalizedLocations.map(l => l?.label || l?.value).filter(Boolean).join(', ');
}
return job.remote ? 'Remote' : '';
}
/** @type {Provider} */
export default {
id: 'consider',
detect(entry) {
const origin = resolveOrigin(entry);
return entry.consider_board && origin ? { url: origin + ENDPOINT_PATH } : null;
},
async fetch(entry, ctx) {
const origin = resolveOrigin(entry);
if (!origin) throw new Error(`consider: ${entry.name} needs an https careers_url on a public host`);
if (!entry.consider_board) throw new Error(`consider: ${entry.name} needs a 'consider_board' id in portals.yml`);
const size = Number.isInteger(entry.consider_size) && entry.consider_size > 0 ? entry.consider_size : DEFAULT_SIZE;
// Perform the CSRF handshake before the POST. ctx._acquireHandshake is a
// test seam: set it to a stub in unit tests so no real network call is made.
const { cookie, csrfToken } = await (
typeof ctx._acquireHandshake === 'function'
? ctx._acquireHandshake(origin)
: acquireCsrfHandshake(origin)
);
const csrfHeaders = {};
if (cookie) csrfHeaders.cookie = cookie;
if (csrfToken) csrfHeaders['x-csrf-token'] = csrfToken;
const json = await ctx.fetchJson(origin + ENDPOINT_PATH, {
method: 'POST',
// redirect:'error' so a 3xx from the (config-driven) board host can't be
// followed to a private/metadata IP — the host guard above pins the first hop.View on GitHub (pinned to 1696bec4d0)
Solutions
- Add `consider_board: <board-id>` to the entry, e.g. consider_board: wingman for Founderful.
- Find the board id from a headless/network capture of the board's POST to /api-boards/search-jobs (the body's board.id field).
- Fix field-name typos — the provider reads exactly entry.consider_board.
- Verify the id is a non-empty string (numbers coerce via String() in the body, but empty/undefined throws).
Example fix
# before - name: Founderful (portfolio) provider: consider careers_url: https://jobs.founderful.com/jobs # after - name: Founderful (portfolio) provider: consider consider_board: wingman careers_url: https://jobs.founderful.com/jobs
Defensive patterns
Strategy: validation
Validate before calling
function hasConsiderBoard(entry) {
return typeof entry.consider_board === 'string' && entry.consider_board.length > 0;
}
if (entry.provider === 'consider' && !hasConsiderBoard(entry)) {
throw new Error(`${entry.name}: consider_board is required`);
} Type guard
function hasConsiderBoardId(e) {
return e != null && typeof e.consider_board === 'string' && e.consider_board.trim().length > 0;
} Try / catch
try {
await scanEntry(entry);
} catch (e) {
if (e.message.includes("needs a 'consider_board' id")) {
console.error(`${entry.name}: add consider_board: <board-id> (not derivable from the hostname)`);
} else throw e;
} Prevention
- Always set consider_board explicitly — the board id (e.g. 'wingman') is not the subdomain.
- Discover the id once via the board's /api-boards/search-jobs POST body and record it in portals.yml.
- Check for provider-template leftovers when adding consider entries from a greenhouse/ashby template.
- Add a schema check per provider: consider entries require careers_url + consider_board.
When it happens
Trigger: A consider entry with a valid public https careers_url but no consider_board field, an empty string, or a wrong-typed value (e.g. consider_size set instead). The check `if (!entry.consider_board)` fires right after the origin check passes.
Common situations: Assuming the board id equals the subdomain (it usually doesn't); copying an entry template from another provider (greenhouse/ashby style) that has no consider_board key; renaming the field by mistake (board, board_id).
Related errors
- comeet: cannot derive API URL for ${entry.name} (set api: to
- csod: cannot resolve careersite URL for ${entry.name}
- oraclecloud: cannot derive API URL for ${entry.name}
- personio: cannot derive feed URL for ${entry.name}
- phenom: cannot resolve origin for ${entry.name}
AI-assisted analysis of santifer/career-ops@1696bec4d0 (2026-09-01).
Data as JSON: /api/errors/c326befe5123a95b.
Report an issue: GitHub.