{"record":{"id":"88fbfc7fcdc827e7","repo":"jackwener/OpenCLI","slug":"linkedin-redirected-away-from-the-search-page-r","errorCode":null,"errorMessage":"LinkedIn redirected away from the search page (${result.error}). Likely Commercial Use Limit reached - the limit resets on the 1st of next month.","messagePattern":"LinkedIn redirected away from the search page \\((.+?)\\)\\. Likely Commercial Use Limit reached - the limit resets on the 1st of next month\\.","errorType":"error_code","errorClass":"CommandExecutionError","httpStatus":null,"severity":"error","filePath":"clis/linkedin/people-search.js","lineNumber":228,"sourceCode":"        }\n        const jsession = cookies.find((c) => c.name === 'JSESSIONID')?.value;\n        if (!jsession) {\n            throw new AuthRequiredError(LINKEDIN_DOMAIN, 'LinkedIn JSESSIONID cookie not found. Please sign in to LinkedIn in the browser.');\n        }\n\n        let result;\n        try {\n            result = unwrapEvaluateResult(await page.evaluate(extractionScript()));\n        } catch (error) {\n            throw new CommandExecutionError(`LinkedIn people search extraction failed: ${error?.message || error}`);\n        }\n        if (result?.error) {\n            if (looksLinkedInAuthWall(`${result.url || ''} ${result.error || ''}`)) {\n                throw new AuthRequiredError(LINKEDIN_DOMAIN, 'LinkedIn people search requires an active signed-in browser session.');\n            }\n            // If LinkedIn redirected away from the search page that\n            // usually means CUL was reached or the account is gated.\n            throw new CommandExecutionError(`LinkedIn redirected away from the search page (${result.error}). Likely Commercial Use Limit reached - the limit resets on the 1st of next month.`);\n        }\n        if (!result || typeof result !== 'object') {\n            throw new CommandExecutionError('LinkedIn people search returned malformed extraction payload');\n        }\n        const candidateCount = parseNonNegativeCount(result.candidate_count, 'candidate_count');\n        parseNonNegativeCount(result.person_entries_count, 'person_entries_count');\n        const resolvedCount = parseNonNegativeCount(result.resolved_count, 'resolved_count');\n        const rows = normalizePeopleRows(result.rows);\n        if (rows.length === 0 && (candidateCount > 0 || resolvedCount > 0)) {\n            throw new CommandExecutionError('LinkedIn people search found profile candidates but could not parse stable result rows');\n        }\n        if (rows.length === 0) {\n            throw new EmptyResultError(`No people found on the rendered page for \"${keywords}\". The search may have returned zero results, or the DOM markup may have changed.`);\n        }\n        return rows.slice(0, limit).map((p, i) => ({ rank: i + 1, ...p }));\n    },\n});\n","sourceCodeStart":210,"sourceCodeEnd":246,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/linkedin/people-search.js#L210-L246","documentation":"If the extraction script reports result.error but the page does not look like the auth wall, the library concludes LinkedIn redirected away from the people-search results — which in practice means the account's Commercial Use Limit (CUL) for search was reached or the account is otherwise gated. It throws CommandExecutionError advising the user that CUL resets on the 1st of the next month.","triggerScenarios":"result.error set, looksLinkedInAuthWall returns false, and the final URL is not the search page — LinkedIn bounced the search to a generic feed/upgrade page after the monthly CUL quota of searches was exhausted or the account lacks commercial search features.","commonSituations":"Free/basic accounts after exhausting monthly people-search credits; accounts without Sales Navigator/Recruiter commercial features searching too often; end-of-month quota exhaustion; LinkedIn A/B-gating the account.","solutions":["Wait until the 1st of next month for CUL to reset, then retry","Reduce search volume / spread queries across the month (respect the --limit flag)","Use an account tier that includes commercial search (Premium/Sales Navigator/Recruiter)","Check the account in a browser: if linkedin.com shows an upgrade/limit banner, that confirms CUL","Distinguish from auth issues — if a login wall appears instead, fix auth first (see 2345/2347)"],"exampleFix":"// before: hard loop burning remaining CUL\nfor (const kw of keywords) await cli('linkedin people-search', { keywords: kw });\n// after: stop on CUL error\ntry { await cli('linkedin people-search', { keywords: kw }); }\ncatch (e) { if (String(e.message).includes('Commercial Use Limit')) break; throw e; }","handlingStrategy":"fallback","validationCode":"// track monthly search usage yourself and stop before LinkedIn's CUL\nconst used = await getMonthlySearchCount();\nif (used >= CUL_BUDGET) throw new Error('Local CUL budget reached; skip searches until next month');","typeGuard":"null","tryCatchPattern":"try { await cli('linkedin people-search', args); }\ncatch (e) { if (/Commercial Use Limit/.test(e.message)) { return fallbackDataSource(args); } throw e; }","preventionTips":["Budget searches monthly and stop before hitting CUL (resets on the 1st)","Use a commercial-tier account (Premium/Sales Navigator) for heavy search needs","Cache/dedupe search results to reduce query count","Fall back to non-search LinkedIn APIs or stored data when gated","Distinguish CUL redirects from auth walls so the right remedy is applied"],"tags":["linkedin","rate-limit","cul","account-restricted"],"backgroundTag":"commercial-use-limit-reached","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}