{"record":{"id":"36622fc75c9d8258","repo":"santifer/career-ops","slug":"echojobs-this-feed-is-gone-echojobs-io-api-jobs","errorCode":null,"errorMessage":"echojobs: this feed is gone — echojobs.io/api/jobs is now behind bot protection (HTTP 429, Vercel checkpoint) and the site's robots.txt disallows /api (#2976). This provider is retired, not broken-and-fixable: remove `provider: echojobs` from portals.yml. See docs/SUPPORTED_JOB_BOARDS.md.","messagePattern":"echojobs: this feed is gone — echojobs\\.io/api/jobs is now behind bot protection \\(HTTP 429, Vercel checkpoint\\) and the site's robots\\.txt disallows /api \\(#2976\\)\\. This provider is retired, not broken-and-fixable: remove `provider: echojobs` from portals\\.yml\\. See docs/SUPPORTED_JOB_BOARDS\\.md\\.","errorType":"exception","errorClass":"Error","httpStatus":429,"severity":"error","filePath":"providers/echojobs.mjs","lineNumber":138,"sourceCode":"  // `posted_at` is already epoch milliseconds.\n  if (Number.isFinite(j.posted_at) && j.posted_at > 0) job.postedAt = j.posted_at;\n  return job;\n}\n\n/** @type {Provider} */\nexport default {\n  id: 'echojobs',\n\n  detect(entry) {\n    return entry?.provider === 'echojobs' ? { url: FEED_BASE } : null;\n  },\n\n  async fetch() {\n    // Deliberately no network call: the feed is confirmed gone (see the file\n    // header), and career-ops does not work around bot protection. Throwing\n    // immediately, with a message naming the cause, is what turns \"expected\n    // { jobs: [...] }\" into something a user can act on.\n    throw new Error(RETIRED_MESSAGE);\n  },\n};\n","sourceCodeStart":120,"sourceCodeEnd":141,"githubUrl":"https://github.com/santifer/career-ops/blob/1696bec4d021768e7359f9aad6b329cba883da20/providers/echojobs.mjs#L120-L141","documentation":"Error \"echojobs: this feed is gone — echojobs.io/api/jobs is now behind bot protection (HTTP 429, Vercel checkpoint) and the site's robots.txt disallows /api (#2976). This provider is retired, not broken-and-fixable: remove `provider: echojobs` from portals.yml. See docs/SUPPORTED_JOB_BOARDS.md.\" thrown in santifer/career-ops.","triggerScenarios":"Thrown at providers/echojobs.mjs:138 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"1696bec4d021768e7359f9aad6b329cba883da20","analyzedAt":"2026-09-01T19:19:23.111Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}