{"record":{"id":"4cccbe5498b74e05","repo":"jackwener/OpenCLI","slug":"http-result-httpstatus-from-voyager-api-me-4cccbe","errorCode":null,"errorMessage":"HTTP ${result.httpStatus} from /voyager/api/me","messagePattern":"HTTP (.+?) from /voyager/api/me","errorType":"exception","errorClass":"CommandExecutionError","httpStatus":null,"severity":"error","filePath":"clis/linkedin/auth.js","lineNumber":43,"sourceCode":"      const d = await res.json();\n      const mini = d && d.miniProfile;\n      if (!mini || !mini.publicIdentifier) {\n        return { kind: 'auth', detail: 'LinkedIn /voyager/api/me 200 but miniProfile missing' };\n      }\n      const firstName = (mini.firstName && (mini.firstName.text || mini.firstName)) || '';\n      const lastName = (mini.lastName && (mini.lastName.text || mini.lastName)) || '';\n      return {\n        ok: true,\n        public_id: String(mini.publicIdentifier),\n        plain_id: String(d.plainId || ''),\n        name: String((firstName + ' ' + lastName).trim()),\n      };\n    } catch (e) {\n      return { kind: 'exception', detail: String(e && e.message || e) };\n    }\n  })()`);\n  if (result?.kind === 'auth') throw new AuthRequiredError('linkedin.com', result.detail);\n  if (result?.kind === 'http') throw new CommandExecutionError(`HTTP ${result.httpStatus} from /voyager/api/me`);\n  if (result?.kind === 'exception') throw new CommandExecutionError(`LinkedIn whoami failed: ${result.detail}`);\n  if (!result?.ok) throw new CommandExecutionError(`Unexpected LinkedIn probe: ${JSON.stringify(result)}`);\n  return { public_id: result.public_id, plain_id: result.plain_id, name: result.name };\n}\n\nregisterSiteAuthCommands({\n  site: 'linkedin',\n  domain: 'www.linkedin.com',\n  loginUrl: 'https://www.linkedin.com/login',\n  columns: ['public_id', 'plain_id', 'name'],\n  quickCheck: hasLinkedinSessionCookie,\n  verify: verifyLinkedinIdentity,\n  poll: async (page) => {\n    if (!await hasLinkedinSessionCookie(page)) {\n      throw new AuthRequiredError('linkedin.com', 'Waiting for LinkedIn li_at cookie');\n    }\n    return verifyLinkedinIdentity(page);\n  },","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/linkedin/auth.js#L25-L61","documentation":"The whoami probe to /voyager/api/me answered with a non-success HTTP status (kind:'http'); the library throws CommandExecutionError embedding that status. Typically a 401/403 (bad session or CSRF token) but any failing status is surfaced verbatim.","triggerScenarios":"page.evaluate probe's fetch to /voyager/api/me returns httpStatus other than ok — e.g. 401 after session expiry, 403 rate-limit/bot-detection, 5xx from LinkedIn.","commonSituations":"Rapid automated requests triggering LinkedIn rate limits; missing JSESSIONID header paired with li_at causing 401; LinkedIn Voyager API rejecting stale CSRF tokens; transient LinkedIn 5xx.","solutions":["Re-authenticate (fresh login) if the status is 401/403.","Add backoff/spacing between LinkedIn calls to avoid 429 throttling.","Retry on 5xx after a short delay — often transient.","Verify the JSESSIONID cookie is being sent with the request; a bad CSRF token yields 403."],"exampleFix":"// before\nawait run('linkedin whoami'); // CommandExecutionError: HTTP 403 from /voyager/api/me\n// after\nawait sleep(60000);            // cool down after throttling\nawait run('auth linkedin');    // refresh session if 401/403 persists\nawait run('linkedin whoami');","handlingStrategy":"retry","validationCode":"null","typeGuard":"null","tryCatchPattern":"async function whoamiWithRetry() {\n  for (let attempt = 0; attempt < 3; attempt++) {\n    try {\n      return await run('linkedin whoami');\n    } catch (e) {\n      const m = /HTTP (\\d{3}) from \\/voyager\\/api\\/me/.exec(e.message);\n      if (!m) throw e;\n      const status = Number(m[1]);\n      if (status === 401 || status === 403) { await run('auth linkedin'); continue; }\n      if (status >= 500 || status === 429) { await sleep(30000 * (attempt + 1)); continue; }\n      throw e;\n    }\n  }\n  throw new Error('whoami failed after retries');\n}","preventionTips":["Throttle LinkedIn requests with delays/backoff.","Keep li_at and JSESSIONID cookies valid; re-login on 401.","Retry only on transient statuses (429, 5xx)."],"tags":["http","voyager-api","rate-limit"],"backgroundTag":"http-403-forbidden","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}