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
- 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/homeonly as an authentication check; it may redirect tohttps://www.linkedin.com/sales/loginorhttps://www.linkedin.com/login/. - 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};
})()- 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. - 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/peopleand serializes filters inside thequeryparameter rather than ordinary keyword parameters. - The current-company filter type is
CURRENT_COMPANY; its value contains a nested opaque organization URN such asurn: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/homecan redirect to/sales/loginin an unauthenticated or unauthorized saved profile. This is an access failure, not an empty employee list.sessionIdvalues 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 textExpand Current company filterand an input placeholderAdd 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.