Find Current Employees in LinkedIn Sales Navigator

Site linkedin.comTask find-linkedin-sales-navigator-company-employeesVersion v3Updated Sep 2, 2026Category sales

Search LinkedIn Sales Navigator people by current company and return every accessible visible result, resolving the company's opaque organization ID before constructing the filtered search URL. This skill was captured from a live agent session on linkedin.com and is published here as a reusable recipe for agents.

NoteSelectors and URL schemes drift as sites change. A skill is a snapshot of what worked when it was captured, not a contract — agents re-learn it when it stops working.

Find current employees of {company-name} in LinkedIn Sales Navigator and return all accessible visible people from the filtered search, including canonical profile URLs and available result-card metadata. This is read-only and requires an authenticated Sales Navigator session, such as the caller's approved saved browser profile.

Use Cases

Use when the caller wants a complete accessible Sales Navigator people search constrained by current company. Do not use for messaging, exporting private data, or actions on profiles.

Automation Flow

  1. Use the caller's approved authenticated Sales Navigator browser profile. Do not enter credentials. Treat a login wall, CAPTCHA, checkpoint, consent gate, or access-denied page as an access failure rather than an empty result. Navigate directly to https://www.linkedin.com/sales/home only as an authentication check; it may redirect to https://www.linkedin.com/sales/login or https://www.linkedin.com/login/.
  2. Resolve the company's opaque organization ID; never guess it. Navigate directly to https://www.linkedin.com/search/results/companies/?keywords={encodeURIComponent(company-name)}. On the loaded page, run this evaluator and select an exact or unambiguous company-name match:
(() => {
 const clean=s=>(s||'').replace(/\s+/g,' ').trim();
 const wanted=new URL(location.href).searchParams.get('keywords')||'';
 const target=clean(wanted).toLowerCase(); const out=[]; const seen=new Set();
 for(const el of document.querySelectorAll('[data-entity-urn*="organization"],[data-urn*="organization"],a[href*="/company/"]')){
  const a=el.matches('a')?el:el.querySelector('a[href*="/company/"]'); let url=null;
  try{if(a){const u=new URL(a.href,location.href);u.search='';u.hash='';url=u.href;}}catch{}
  const raw=el.getAttribute('data-entity-urn')||el.getAttribute('data-urn')||a?.getAttribute('data-entity-urn')||a?.getAttribute('data-urn')||'';
  const urn=(raw.match(/urn:li:organization:\d+/)||[])[0]||null;
  const text=clean(el.innerText||a?.innerText||el.textContent); const name=clean(text.split(/\n| · /)[0]);
  const key=urn||url; if(!key||seen.has(key))continue; seen.add(key);
  const lower=name.toLowerCase(); out.push({name,url,organizationUrn:urn,organizationId:urn?.split(':').pop()||null,score:lower===target?3:lower.includes(target)?2:0});
 }
 return out.sort((a,b)=>b.score-a.score).slice(0,10);
})()

Prefer an exact result. If only a company slug is exposed, open its canonical company URL and read urn:li:organization:{id} from data-entity-urn, data-urn, or embedded result metadata. Stop if no unambiguous numeric ID is visible. 3. Construct the filtered Sales Navigator URL directly: https://www.linkedin.com/sales/search/people?query={encodeURIComponent('(recentSearchParam:(doLogHistory:true),filters:List((type:CURRENT_COMPANY,values:List((id:urn%253Ali%253Aorganization%253A{organization-id},text:{encoded-company-name},selectionType:INCLUDED)))))')}&viewAllFilters=true Do not reuse a prior sessionId; retain one only if generated by the current authenticated navigation. 4. In one browser-agent call, navigate to that URL, wait for dynamic cards, and run this evaluator:

(() => {
 const clean=s=>(s||'').replace(/\s+/g,' ').trim();
 const abs=h=>{try{const u=new URL(h,location.href);u.search='';u.hash='';return u.href}catch{return null}};
 const anchors=[...document.querySelectorAll('a[href*="/in/"]')].filter(a=>a.offsetParent!==null);
 const containers=anchors.map(a=>{let e=a;for(let i=0;i<7&&e;i++,e=e.parentElement)if(e.matches('li,article,[role="listitem"],.artdeco-list__item'))return e;return a.closest('li,article,[role="listitem"]')||a});
 const seen=new Set(),people=[];
 for(const card of containers){const link=card.querySelector('a[href*="/in/"]');const profileUrl=link?abs(link.href):null;if(!profileUrl||seen.has(profileUrl))continue;seen.add(profileUrl);
  const n=card.querySelector('[data-anonymize="person-name"],.result-lockup__name,.artdeco-entity-lockup__title,h3,h4');
  const t=card.querySelector('[data-anonymize="job-title"],.result-lockup__highlight-keyword,.artdeco-entity-lockup__subtitle');
  const l=card.querySelector('[data-anonymize="location"],.result-lockup__misc-item,.artdeco-entity-lockup__caption');
  people.push({profileUrl,name:clean(n?.innerText||link.innerText)||null,title:clean(t?.innerText)||null,location:clean(l?.innerText)||null,cardText:clean(card.innerText).slice(0,2000)});
 }
 const body=clean(document.body?.innerText||''); const blocked=/uas\/login|authwall|sign in|join linkedin|checkpoint|captcha|security verification/i.test(location.href+' '+body.slice(0,1500))&&people.length===0;
 return {success:!blocked,pageUrl:location.href.split('?')[0],count:people.length,people,blocked};
})()
  1. Continue until every accessible result has been collected. Prefer a visible next-page or load-more control; after activation, wait for new cards, rerun the evaluator, and union by canonical profileUrl. If a stable page/start parameter is exposed, direct navigation may be used. Stop when no enabled control remains or no new profiles appear.
  2. Return only profiles visible to the authorized session. Report authentication, authorization, challenge, or rendering failures separately from a valid zero-result search.

Possible Friction Points

  • Sales Navigator people search uses /sales/search/people and serializes filters inside the query parameter rather than ordinary keyword parameters.
  • The current-company filter type is CURRENT_COMPANY; its value contains a nested opaque organization URN such as urn:li:organization:{id} with additional URL encoding.
  • Organization IDs are opaque. Resolve them from company search or page metadata and verify the visible company name before using the filtered URL.
  • /sales/home can redirect to /sales/login in an unauthenticated or unauthorized saved profile. This is an access failure, not an empty employee list.
  • sessionId values are session-specific and must not be hard-coded or carried between callers.
  • If direct URL construction fails, the UI fallback may expose button[data-x-search-filter="container-toggle"] with text Expand Current company filter and an input placeholder Add current companies and account lists.
  • Result cards may contain duplicate or unrelated /in/ links. Prefer the nearest list-item, article, or role-listitem container and deduplicate by canonical profile URL.
  • Pagination and load-more behavior vary by account and interface version; do not invent a page parameter.
  • A login wall, CAPTCHA, checkpoint, consent page, or anti-automation challenge is an access failure, not evidence that the company has no employees.
  • Keep navigation and extraction read-only and same-origin; do not collect credentials, cookies, tokens, private messages, or unrelated profile data.

Call it

GET https://production-sfo.browserless.io/skills?token=TOKEN-HERE&domain=linkedin.com&task=find-linkedin-sales-navigator-company-employees