{"record":{"id":"2bf7eb5409aa7b5a","repo":"jackwener/OpenCLI","slug":"no-linkedin-services-page-link-was-found-on-the-pr","errorCode":null,"errorMessage":"No LinkedIn Services page link was found on the profile.","messagePattern":"No LinkedIn Services page link was found on the profile\\.","errorType":"exception","errorClass":"EmptyResultError","httpStatus":null,"severity":"info","filePath":"clis/linkedin/services-read.js","lineNumber":183,"sourceCode":"  browser: true,\n  args: [\n    { name: 'profile-url', type: 'string', required: false, help: 'LinkedIn /in/<handle>/ profile URL. Defaults to /in/me/.' },\n    { name: 'services-url', type: 'string', required: false, help: 'LinkedIn /services/page/<id>/ URL. If omitted, it is discovered from the profile.' },\n  ],\n  columns: ['service_url', 'page_title', 'overview', 'availability', 'work_locations', 'pricing', 'services_provided', 'services_count', 'media', 'media_count', 'messages', 'reviews_visibility'],\n  func: async (page, args) => {\n    if (!page) throw new CommandExecutionError('Browser session required for linkedin services-read');\n    let servicesUrl = normalizeWhitespace(args['services-url']);\n    const shouldReadOwnerEdit = !servicesUrl && !normalizeWhitespace(args['profile-url']);\n    if (servicesUrl) {\n      servicesUrl = normalizeServicesUrl(servicesUrl);\n    } else {\n      await page.goto(normalizeProfileUrl(args['profile-url']));\n      await page.wait(5);\n      await assertLinkedInAuthenticated(page, 'LinkedIn services-read profile');\n      const found = unwrapEvaluateResult(await page.evaluate(buildFindServicesUrlScript()));\n      servicesUrl = normalizeWhitespace(found?.services_url);\n      if (!servicesUrl) throw new EmptyResultError('linkedin services-read', 'No LinkedIn Services page link was found on the profile.');\n      servicesUrl = normalizeServicesUrl(servicesUrl);\n    }\n\n    await page.goto(servicesUrl);\n    await page.wait(5);\n    await assertLinkedInAuthenticated(page, 'LinkedIn services-read');\n    const services = unwrapEvaluateResult(await page.evaluate(buildServicesPageScript()));\n\n    const edit = shouldReadOwnerEdit ? await readOwnerOnlyServicesEdit(page, servicesUrl) : {};\n\n    let media = {};\n    if (shouldReadOwnerEdit) {\n      const mediaUrl = new URL(servicesUrl);\n      mediaUrl.pathname = mediaUrl.pathname.replace(/\\/?$/, '/media/');\n      await page.goto(mediaUrl.toString());\n      await page.wait(4);\n      await assertLinkedInAuthenticated(page, 'LinkedIn services-read media');\n      media = unwrapEvaluateResult(await page.evaluate(buildMediaPageScript()));","sourceCodeStart":165,"sourceCodeEnd":201,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/linkedin/services-read.js#L165-L201","documentation":"When no --services-url is given, services-read loads the profile and runs buildFindServicesUrlScript to discover the profile's Services page link. If the script finds no services_url, the command throws EmptyResultError: the profile has no Services page (or the link could not be detected).","triggerScenarios":"Running services-read with only --profile-url (or defaulting to /in/me/) on a profile where the Services feature is disabled, or where LinkedIn markup changes prevent the discovery script from finding the link.","commonSituations":"Profiles without Services enabled (most members); scraping a profile in a locale/language where the Services button text differs and the finder relies on text; creator-mode Services toggle turned off.","solutions":["Confirm the profile actually shows a Services page (open it in a browser); if not, this is expected — skip the profile.","If Services exists but was not found, update buildFindServicesUrlScript selectors/text matching to current markup.","If you already know the Services URL, pass it directly via --services-url to skip discovery."],"exampleFix":"// before\nawait runCommand('linkedin services-read', ['--profile-url', profileUrl]);\n// after (skip discovery when URL is known)\nawait runCommand('linkedin services-read', ['--services-url', 'https://www.linkedin.com/services/page/1234abc/']);","handlingStrategy":"fallback","validationCode":"// pre-check: only run for profiles known to have Services enabled\nif (!profile.hasServicesFeature) return null;","typeGuard":null,"tryCatchPattern":"try {\n  return await runCommand('linkedin services-read', ['--profile-url', url]);\n} catch (e) {\n  if (e.name === 'EmptyResultError') return null; // profile has no Services page\n  throw e;\n}","preventionTips":["Maintain a list of profiles with Services enabled; skip others.","If you know the Services URL, pass --services-url to bypass discovery.","Keep buildFindServicesUrlScript text/locale matching up to date."],"tags":["linkedin","empty-result","services-page","scraping"],"backgroundTag":"empty-result-set","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}