Retrieve the newest accessible public LinkedIn job postings matching {query} or an optional list of {queries}, optionally constrained by {location}, {geo-id}, and {recency}. Return deduplicated canonical job URLs and visible card metadata such as title, company, location, and posting time. Results are sorted newest first within each query and deduplicated across queries. Include requested seniority terms such as {seniority} directly in the query value. This is suitable for recurring read-only job discovery.
Use Cases
Use when the caller wants recent public LinkedIn job postings for supplied keywords, especially postings from a defined time window or geography. Use {queries} for synonymous, multilingual, or adjacent role titles and merge results from several searches. A single Boolean query can combine related titles when appropriate. This is read-only and does not open applications or interact with employers.
Automation Flow
- Build the direct guest search API URL for each requested query; do not visit the homepage or use the search form:
https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords={encodeURIComponent(query)}&location={encodeURIComponent(location)}&geoId={geo-id}&f_TPR={recency}&sortBy=DD&start={offset}
Omit location and geoId when unnecessary, omit f_TPR when no recency filter is requested, and begin each query with start=0. For multiple queries, navigate once per direct URL and union results by job ID or canonical URL.
2. Supported optional parameters include location={location}, deterministic caller-supplied geoId={geo-id}, and sortBy=DD. Use f_TPR=r3600 for approximately one hour, r86400 for approximately one day, r259200 for approximately three days, r604800 for approximately seven days, or r2592000 for approximately thirty days. Never invent a geo ID. Quoted phrases and Boolean expressions may be passed as the keywords value, for example ("marketing operations" OR "marketing systems" OR "marketing automation"); encode the complete expression once. Include terms such as senior in {query} when senior roles are requested.
3. In one browser-agent call per URL, navigate directly to the endpoint, allow the HTML response to settle, and run this evaluator on the loaded response:
(() => {
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 seen=new Set(),jobs=[];
for(const li of document.querySelectorAll('li')){
const urn=li.querySelector('[data-entity-urn]')?.getAttribute('data-entity-urn')||'';
const jobId=(urn.match(/urn:li:jobPosting:(\d+)/)||[])[1]||null;
const a=li.querySelector('a.base-card__full-link,a[href*="/jobs/view/"]');
if(!jobId||!a||seen.has(jobId))continue;
const url=abs(a.href);
if(!url||!/\/jobs\/view\//.test(new URL(url).pathname))continue;
const time=li.querySelector('time');
seen.add(jobId);
jobs.push({jobId,title:clean(li.querySelector('.base-search-card__title')?.textContent),company:clean(li.querySelector('.base-search-card__subtitle a,.base-search-card__subtitle')?.textContent),location:clean(li.querySelector('.job-search-card__location')?.textContent),postedIso:time?.getAttribute('datetime')||null,postedRelative:clean(time?.textContent),activelyHiring:!!li.querySelector('.job-posting-benefits'),url});
}
const body=clean(document.body?.innerText||'');
const blocked=/uas\/login|authwall|sign in|join linkedin|checkpoint|captcha|security verification|consent/i.test(location.href+' '+body.slice(0,1800))&&jobs.length===0;
return {success:!blocked,pageUrl:location.href,count:jobs.length,jobs,blocked};
})()- Union results across queries by
jobId, falling back to canonical URL. Preserve the first-seen result and addmatchedQuerieswhen useful. Sort by visiblepostedIsowhen available, otherwise preserve query/document order. - If more results are needed, request another endpoint page by increasing
startby the number of returned cards, commonly 25. Inspect each response rather than assuming a fixed batch size; stop when the response has no cards or produces no new jobs. Deduplicate across pages. - For a posting's full description, pay, and requirements, open its
urlwith Inspect LinkedIn Job Posting. - Treat a login wall, consent page, CAPTCHA, checkpoint, or non-job response as an access/rendering failure rather than a valid empty result. Return only visible public cards and never fabricate postings or IDs.
Possible Friction Points
- The structured guest endpoint is
/jobs-guest/jobs/api/seeMoreJobPostings/search; it acceptskeywords,location,geoId,f_TPR,sortBy, andstartdirectly. sortBy=DDis LinkedIn's date-descending sort parameter.- The endpoint returns HTML result cards, not JSON. Cards are represented by
lielements containing adata-entity-urnsuch asurn:li:jobPosting:{id}. - Normalize results to canonical absolute
/jobs/view/...URLs after removing query strings and fragments, and deduplicate by job ID or URL. f_TPR=r86400is the appropriate approximately-last-24-hours modifier;f_TPR=r259200is the appropriate approximately-last-three-days modifier. Other supported recency values are listed in the workflow.- A caller-supplied numeric geography identifier may be placed in
geoId; geography IDs must not be guessed or generalized without verification. - Boolean keyword expressions with quoted phrases can be sent as one encoded
keywordsvalue, reducing multiple navigations when the caller wants OR semantics. - Multiple synonymous queries and localized geography spellings may instead be issued directly against the same endpoint and merged when broader coverage is requested.
- Seniority is not a separate observed filter in this endpoint; include terms such as
seniorin{query}when senior roles are requested. startis an offset and batch sizes can vary; advance based on returned card counts and stop when no new cards appear.- The guest API usually exposes card HTML directly, but allow a short settling wait. Dynamic normal search pages are unnecessary.
- Returned posting times are the visible card values and may be relative or approximate; do not claim stronger timestamp precision than
postedIsoprovides. - Keep navigation and evaluation read-only and same-origin. Do not collect credentials, cookies, tokens, or unrelated page data.