{"record":{"id":"4f6619c78fd7f48e","repo":"santifer/career-ops","slug":"vdab-all-keywords-length-keyword-request-s-fa","errorCode":null,"errorMessage":"vdab: all ${keywords.length} keyword request(s) failed — ${errors[0]}","messagePattern":"vdab: all (.+?) keyword request\\(s\\) failed — (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"providers/vdab.mjs","lineNumber":317,"sourceCode":"          try {\n            const detail = await keyedFetchJson(`${DETAIL_API}${encodeURIComponent(job.id)}?preview=false`, {\n              method: 'GET',\n              headers: { accept: 'application/json' },\n            });\n            const description = extractDescription(detail);\n            if (description) job.description = description;\n          } catch {\n            // Detail fetch is an enrichment only. Keep the listing result.\n          }\n        }));\n      }\n    }\n\n    // Total outage = every keyword request failed. A keyword that answered with\n    // zero results is not an outage, so key off the success count, not the\n    // deduped result size — otherwise a legitimately-empty search throws.\n    if (succeeded === 0 && errors.length) {\n      throw new Error(`vdab: all ${keywords.length} keyword request(s) failed — ${errors[0]}`);\n    }\n\n    return [...byId.values()].map(({ id, ...job }) => job);\n  },\n};\n","sourceCodeStart":299,"sourceCodeEnd":323,"githubUrl":"https://github.com/santifer/career-ops/blob/aac998c7ed7248ea853b720ceeb1fdbeb322fc5d/providers/vdab.mjs#L299-L323","documentation":"The vdab provider issues one request per configured keyword and tolerates individual failures, but if every keyword request failed (succeeded === 0) it throws this error summarizing the count and the first underlying error. A keyword returning zero results is NOT a failure — the check keys off the success count, so this error means the VDAB API (or the network path to it) is effectively unreachable for this run.","triggerScenarios":"All keyword requests to the VDAB API failed — e.g. the API key was rejected (403) and re-derivation from the live bundle also failed, network/DNS outage, VDAB API downtime, rate limiting on every request, or a malformed request rejected for all keywords.","commonSituations":"VDAB rotated their VEJ key and the re-derive path broke too; corporate proxy/firewall blocking the VDAB host; VDAB maintenance window; expired/rotted hardcoded monitor key plus a changed bundle URL.","solutions":["Read errors[0] (shown in the message) to identify the root cause — 403 points at key rotation, timeouts at network, 5xx at VDAB-side outage","Check VDAB API status / retry later if it is a transient outage — this error is safe to treat as 'skip this run'","If it is a 403, verify the key re-derivation path: fetch the live bundle and confirm the new VEJ key is being extracted correctly","Test connectivity to the VDAB endpoint from the machine (curl) to rule out proxy/firewall blocking","Reduce to a single keyword in a test config to isolate whether the failure is keyword-specific or global"],"exampleFix":"null","handlingStrategy":"retry","validationCode":"null","typeGuard":"null","tryCatchPattern":"try {\n  const jobs = await vdabProvider.fetch(entry, ctx);\n} catch (err) {\n  if (err.message.startsWith('vdab: all') && err.message.includes('keyword request(s) failed')) {\n    console.error(`VDAB unreachable this run (${err.message}). Skipping; will retry next scan.`);\n    scheduleRetry({ backoffMs: 15 * 60 * 1000 });\n    return [];\n  }\n  throw err;\n}","preventionTips":["Inspect the embedded errors[0] first — 403 means key rotation, timeouts mean network, 5xx means VDAB outage","Wrap scheduled scans in per-provider try/catch so one dead board does not abort the whole run","Monitor the VEJ key re-derivation path; alert when the hardcoded key 403s and the fresh bundle also fails","Test VDAB reachability with curl from the deployment environment to catch proxy/firewall blocks early"],"tags":["network","api","outage","vdaab-key","retry"],"backgroundTag":"http-request-failed","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"}