search-recent-jobs▌
linkedin.com/search-linkedin-jobs-3v1wu7 · updated May 21, 2026
MDX-style export adds YAML metadata + attribution linking explainx.ai and this canonical listing URL.
Return LinkedIn job postings matching profile-derived keywords + location, filtered to a configurable recency window (default last 24 hours). Leads with the public /jobs-guest seeMoreJobPostings HTML-fragment endpoint — no cookies, no auth, no Browserbase session required. Returns title, company, location, posted-when, jobId, and canonical job URL. Read-only.
| name | search-recent-jobs |
| title | LinkedIn Recent Jobs Search |
| description | >- Return LinkedIn job postings matching profile-derived keywords + location, filtered to a configurable recency window (default last 24 hours). Leads with the public /jobs-guest seeMoreJobPostings HTML-fragment endpoint — no cookies, no auth, no Browserbase session required. Returns title, company, location, posted-when, jobId, and canonical job URL. Read-only. |
| website | linkedin.com |
| category | careers |
| tags | - linkedin - jobs - careers - search - read-only |
| source | 'browserbase: agent-runtime 2026-05-17' |
| updated | '2026-05-17' |
| recommended_method | api |
| alternative_methods | - method: browser rationale: >- Fallback only — the JS-rendered /jobs/search page requires --verified + --proxies to bypass the auth-wall modal, and costs 30–100× the guest-API path. Use only if the guest endpoint is rate-limited or returns non-200 for sustained calls. - method: api rationale: >- /jobs/collections/recommended/ is the only LinkedIn surface that delivers truly profile-personalized recommendations, but it requires an authenticated cookie session (verified 302 to auth-wall when fetched anonymously). Out of scope for this anonymous skill — compose keywords from caller-supplied profile data instead. |
| verified | false |
| proxies | false |
LinkedIn — Search Recent Jobs Tailored to Profile
Purpose
Return LinkedIn job postings that match a profile-derived role/keyword query in a given geography and were posted within a configurable recency window (default: last 24 hours). For each posting, return jobId, title, company, location, both relative ("6 hours ago") and absolute ISO date, and the canonical /jobs/view/{slug}-{jobId} URL.
Read-only. Never applies, never saves a job, never messages a poster.
"Tailored to my profile" means: the caller passes role/skill keywords distilled from the user's profile (current title, top skills, target seniority). LinkedIn's true personalized feed at /jobs/collections/recommended/ requires an authenticated session (cookie-based) — confirmed 302-redirects to the auth wall when fetched anonymously. That logged-in path is intentionally out of scope here; this skill is the anonymous public-search surface that any agent can hit without credentials.
When to Use
- A profile-aware job-monitoring agent wakes up every hour and asks "what was posted in the last 24h that matches this user's role + location?"
- A scheduled daily digest: "top 25 new jobs since yesterday for {role} in {city}."
- Cross-referencing a user's resume keywords against fresh postings without storing LinkedIn credentials anywhere.
- Anywhere you'd otherwise scrape
/jobs/search?...HTML — the guest API is an order of magnitude cheaper and structurally cleaner.
Workflow
LinkedIn exposes a public guest-jobs API that returns the job-card grid as an HTML fragment, anonymously, with no cookies, no auth, no anti-bot challenges in normal use. Lead with this API; the JS-rendered /jobs/search page is a fallback only.
1. Build the search URL
GET https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search
?keywords={URL-encoded role+skills, e.g. "senior frontend engineer react typescript"}
&location={URL-encoded location text, e.g. "San Francisco Bay Area"}
&f_TPR=r86400
&sortBy=DD
&start=0
Recency-window mapping for f_TPR:
f_TPR value | Window |
|---|---|
r3600 | Last 1 hour |
r86400 | Last 24 hours ← default for this task |
r604800 | Last 7 days |
r2592000 | Last 30 days |
| (omitted) | All time (no recency filter) |
sortBy accepts DD (most recent first) or R (relevance, default). For "last 24h tailored to profile" use DD so the freshest matches come first.
location accepts either free-text (San Francisco Bay Area, New York, NY, Remote) or a numeric geoId (e.g. geoId=90000084 for SF Bay Area). Free text is fine for common metros; geoId is more deterministic when the same place name is ambiguous (Cambridge UK vs MA, Portland OR vs ME). Verified in iter-1 that both yield the same SF-scoped results.
2. Fetch via browse cloud fetch (no browser session required)
browse cloud fetch "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=senior+frontend+engineer&location=San+Francisco+Bay+Area&f_TPR=r86400&sortBy=DD&start=0"
Returns 200 OK with Content-Type: text/html; charset=utf-8 and a body of ~25–35 KB containing 10 <li> job-card fragments. No cookies, no Referer, no User-Agent spoofing required. Verified across 5 queries (SF Bay, NYC, geoId, special-char queries, last-hour filter) in iter-1.
3. Parse each <li> card
Each card is a self-contained <li>...</li> block. The robust extractors:
| Field | Extractor |
|---|---|
jobId | data-entity-urn="urn:li:jobPosting:(\d+)" |
url (canonical) | <a class="base-card__full-link[^"]*" href="([^"]+)" — drop everything after the first ? for the canonical form |
title | <h3 class="base-search-card__title">\s*([\s\S]*?)</h3> — collapse whitespace |
company | <h4 class="base-search-card__subtitle">[\s\S]*?<a[^>]*>\s*([\s\S]*?)\s*</a> |
location | <span class="job-search-card__location">\s*([\s\S]*?)</span> |
posted_iso | <time[^>]*datetime="([^"]+)" — ISO date like 2026-05-17 |
posted_relative | <time[^>]*>([\s\S]*?)</time> — e.g. "6 hours ago", "3 days ago" |
display_order | data-row="(\d+)" (1-indexed within the response) |
actively_hiring | presence of <div class="job-posting-benefits text-sm"> and "Actively Hiring" text |
Title and company text are wrapped in heavy whitespace + multi-line indentation — always .replace(/\s+/g,' ').trim() after extracting.
The canonical URL pattern is:
https://www.linkedin.com/jobs/view/{kebab-slug-built-from-title-and-company}-{jobId}
The href in the page contains tracking params (?position=N&pageNum=0&refId=...&trackingId=...). For storage/dedup, strip everything from ? onwards — the bare /jobs/view/{slug}-{jobId} resolves correctly and matches LinkedIn's canonical form.
4. Paginate
Page size is 10 results per response (not 25). Increment start in steps of 10:
start=0 → first 10
start=10 → next 10
start=25 → cards 26–35 (any positive integer works, server pages-from-N)
Stop when a response returns < 10 cards or 0 cards. There is no totalResultCount field in this endpoint's response — you discover the end empirically. Typical agentic usage: pull start=0 only (10 freshest jobs in the last 24h is usually enough for a daily digest).
5. (Optional) Enrich a specific posting
If the caller wants the full description for a single posting, the detail page is publicly accessible:
browse cloud fetch "https://www.linkedin.com/jobs/view/{jobId}/"
Returns 200 with full job HTML (~300 KB). Title and metadata are present in standard <title> and JSON-LD blocks. Don't enrich every card in the digest — that's an N+1 cost spike for marginal value.
Browser fallback (only if the guest API is rate-limited or broken)
If browse cloud fetch to the guest API returns non-200 for sustained calls (none observed in iter-1, but document for completeness), fall back to a Verified + residential-proxy Browserbase session driving the JS-rendered search page:
SID=$(browse cloud sessions create --keep-alive --verified --proxies | jq -r '.id')
browse cloud browse --connect "$SID" open \
"https://www.linkedin.com/jobs/search?keywords=senior%20frontend%20engineer&location=San%20Francisco%20Bay%20Area&f_TPR=r86400&sortBy=DD"
browse cloud browse --connect "$SID" wait load
browse cloud browse --connect "$SID" wait timeout 3000
# Extract from rendered HTML — selectors match the guest-API card structure
browse cloud browse --connect "$SID" get html body
browse cloud sessions update "$SID" --status REQUEST_RELEASE
Verified + proxies are mandatory on this path. The browser-rendered /jobs/search page presents the LinkedIn auth wall (sign-in modal overlay) on a bare session, hiding the listings. With Verified + residential proxy, the page renders the same 10-card grid the guest API returns. Expect ~30–100× the cost of the API path due to JS render and proxy bandwidth — only use as a fallback.
Site-Specific Gotchas
- The guest endpoint is the optimal surface —
browse cloud fetchis enough. No cookies, no auth, no Referer header, no User-Agent spoofing, no Browserbase session needed. The endpoint ishttps://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search. Lead with it; everything else is more expensive. /jobs/collections/recommended/is the auth wall — don't try it anonymously. Returns a302redirect with an empty body when fetched without cookies (verified iter-1). LinkedIn's true personalized recommendations require an authenticated session this skill intentionally does NOT carry. For "tailored," composekeywordsfrom the caller's profile data instead.- Page size is 10, not 25. Don't assume
&count=25works — it's silently ignored. The response is structurally always ≤ 10<li>cards. Paginate viastart=. - There is NO
totalResultCountin the guest response. Discover end-of-results empirically: stop when a page returns < 10 cards or you hit your application's max. - The
<a class="base-card__full-link">href is tracking-laden. It includes?position=N&pageNum=0&refId=...&trackingId=...— strip everything from?onwards before storing. The barehttps://www.linkedin.com/jobs/view/{slug}-{jobId}is the canonical form, dedups cleanly, and the slug is recoverable from the URL alone. - Two
<time>class variants. Cards posted recently (within ~3 days) carry<time class="job-search-card__listdate--new" datetime="...">; older cards carry<time class="job-search-card__listdate" datetime="...">. The--newsuffix is purely a CSS hook — when matching, allow both viaclass="job-search-card__listdate(?:--new)?". Both expose the samedatetime="YYYY-MM-DD"and relative-time text-content. datetimeis date-only (no time-of-day). The<time datetime>attribute isYYYY-MM-DD, not a full ISO 8601 timestamp. For sub-day precision (e.g. "5 minutes ago" vs "23 hours ago"), parse the relative-time text-content; for absolute-date queries, use the attribute.- Title/company/location are wrapped in heavy whitespace. The HTML is server-rendered Tailwind with deeply nested indentation. Always
.replace(/\s+/g,' ').trim()after each text extraction — otherwise you get strings like"\n Senior Frontend Engineer\n "in your output. - Title slugs can contain percent-encoded UTF-8. e.g.
senior-software-engineer-frontend-ui-%E2%80%93-san-francisco-...(an em-dash). When normalizing URLs for dedup, normalize percent-decoding or strictly keep thejobIdnumeric tail as the dedup key. - The endpoint is geo-permissive —
locationtext drives scope, not the request IP. Verified iter-1: the same query withlocation=New+Yorkfrom a Browserbase US-west session returns NYC jobs (New York, NY,New York City Metropolitan Area); changing tolocation=San+Francisco+Bay+Areaflips the result set to SF metro. Nopostal=override is needed (unlike Craigslist's API which IS IP-scoped). geoIdis the deterministic alternative to free-text location. When the location string is ambiguous or stable across runs, prefergeoId={numeric}. Common geoIds:90000084(San Francisco Bay Area),90000070(New York City Metropolitan Area),103644278(United States),92000000(Remote). Look up unknown geoIds by issuing a search withlocation=<text>first and inspecting the response URL or by hittinghttps://www.linkedin.com/jobs-guest/api/typeaheadHits?query=<text>&typeaheadType=GEO.- Special-char queries are accepted as-is. Quoted phrases (
%22senior+react%22) and required tokens (%2Btypescript→+typescript) work — verified iter-1 returned 6 narrower results vs 10 for the unquoted version. Don't strip user-supplied operators before passing tokeywords=. - "Tailored to profile" via keywords composition. Practical recipe when the caller has access to the user's LinkedIn profile data: concatenate
currentTitle + " " + top 3 skills + " " + seniorityWord. Example:keywords=senior+frontend+engineer+react+typescript+nextjs. LinkedIn'skeywordsfield tokenizes and matches across title + skills + description — heavier ranking on title matches. - Rate-limit behavior is undocumented and conservative. Iter-1 issued ~10 requests in 90 seconds without throttling, but anecdotal reports place sustained throughput at ≤ 1 req/s. For a daily digest agent, the natural cadence is well under the limit; for aggressive backfills, add an explicit 1–2s delay between calls.
- The JS-rendered
/jobs/searchpage DOES present a sign-in wall on a bare browser session. A normal Browserbase session without Verified+proxies renders an auth-wall modal that covers the listings. Use the guest API path (step 1–4) instead — that route bypasses the wall entirely because it's a different surface (/jobs-guest/...). - Sandbox-environment caveat (build-time, not skill-time): The skill-build sandbox blocks direct CDP WebSocket access to
connect.usw2.browserbase.com, so livebrowse cloud browse --connectdriving was not exercised in iter-1 — butbrowse cloud fetch(HTTP API path) is fully exercised and is what the skill leads with. The browser-fallback section above is unvalidated in this sandbox but is documented based on the LinkedIn page surface behavior; agents running this skill in a non-restricted environment can use it.
Expected Output
{
"success": true,
"query": {
"keywords": "senior frontend engineer react typescript",
"location": "San Francisco Bay Area",
"f_TPR": "r86400",
"sortBy": "DD"
},
"page": { "start": 0, "size": 10 },
"jobs": [
{
"job_id": "4304338796",
"title": "Senior Frontend Engineer",
"company": "Finix",
"location": "San Francisco, CA",
"posted_iso": "2026-05-17",
"posted_relative": "6 hours ago",
"actively_hiring": true,
"url": "https://www.linkedin.com/jobs/view/senior-frontend-engineer-at-finix-4304338796"
},
{
"job_id": "4373712261",
"title": "Sr. Frontend Engineer",
"company": "Arlo Technologies, Inc.",
"location": "Milpitas, CA",
"posted_iso": "2026-05-17",
"posted_relative": "6 hours ago",
"actively_hiring": false,
"url": "https://www.linkedin.com/jobs/view/sr-frontend-engineer-at-arlo-technologies-inc-4373712261"
}
],
"error_reasoning": null
}
Outcome shapes:
// Empty result — no postings matched in the recency window
{ "success": true, "jobs": [], "page": { "start": 0, "size": 10 }, "query": { ... }, "error_reasoning": null }
// Auth wall encountered (only possible if caller forced /jobs/collections/recommended/ or the browser-fallback path on a bare session)
{ "success": false, "error_reasoning": "auth_wall: /jobs/collections/recommended/ requires authenticated session; use keywords-based search instead" }
// Rate-limited (rare — 429 or sustained non-200 from the guest endpoint)
{ "success": false, "error_reasoning": "rate_limited: guest API returned <status> for <N> consecutive requests" }
How to use search-recent-jobs on Cursor
AI-first code editor with Composer
Prerequisites
Before installing skills in Cursor, ensure your development environment meets these requirements:
- ›Cursor installed and configured on your development machine
- ›Node.js version 16.0+ with npm package manager (verify with
node --version) - ›Active project directory or workspace where you want to add search-recent-jobs
Execute installation command
Execute the skills CLI command in your project's root directory to begin installation:
The skills CLI fetches search-recent-jobs from GitHub repository linkedin.com/search-linkedin-jobs-3v1wu7 and configures it for Cursor.
Select Cursor when prompted
The CLI will show a list of available agents. Use arrow keys to navigate and space to select Cursor:
Verify installation
Confirm successful installation by checking the skill directory location:
Reload or restart Cursor to activate search-recent-jobs. Access the skill through slash commands (e.g., /search-recent-jobs) or your agent's skill management interface.
Security & Verification Notice
We perform automated surface-level scans (Gen AI Scanner, Socket, Snyk) during installation. These checks detect common vulnerabilities but do not guarantee complete security. Always review skill source code and verify the publisher's reputation before production use.
Skills execute code in your development environment. Always verify the publisher's identity, review recent commits, and test in isolated environments before production deployment.
List & Monetize Your Skill
Submit your Claude Code skill and start earning
Use Cases▌
Task Automation & Efficiency
Automate repetitive workflows and reduce manual effort
Example
Generate reports, summarize documents, draft communications
Save 3-5 hours per week on routine tasks
Knowledge Enhancement
Learn new skills, understand complex topics, get expert guidance
Example
Explain concepts, provide examples, suggest learning resources
Accelerate learning and skill development by 2x
Quality Improvement
Enhance output quality through reviews, suggestions, and refinements
Example
Review drafts, suggest improvements, catch errors
Improve work quality by 30-40% with less effort
Implementation Guide▌
Prerequisites
- ›Claude Desktop or compatible AI client with skill support
- ›Clear understanding of task or problem to solve
- ›Willingness to iterate and refine outputs
Time Estimate
15-45 minutes depending on use case complexity
Installation Steps
- 1.Install skill using provided installation command
- 2.Test with simple use case relevant to your work
- 3.Evaluate output quality and relevance
- 4.Iterate on prompts to improve results
- 5.Integrate into regular workflow if valuable
Common Pitfalls
- ⚠Expecting perfect results without iteration
- ⚠Not providing enough context in prompts
- ⚠Using skill for tasks outside its intended scope
- ⚠Accepting outputs without review and validation
Best Practices▌
✓ Do
- +Start with clear, specific prompts
- +Provide relevant context and constraints
- +Review and refine all outputs before using
- +Iterate to improve output quality
- +Document successful prompt patterns
✗ Don't
- −Don't use without understanding skill limitations
- −Don't skip validation of outputs
- −Don't share sensitive information in prompts
- −Don't expect skill to replace human judgment
💡 Pro Tips
- ★Be specific about desired format and style
- ★Ask for multiple options to choose from
- ★Request explanations to understand reasoning
- ★Combine AI efficiency with human expertise
When to Use This▌
✓ Use When
Use when skill capabilities match your task, clear ROI on time saved, and you can validate outputs. Best for repetitive tasks, learning, and quality improvement.
✗ Avoid When
Avoid when task requires deep expertise you can't validate, involves sensitive decisions, or when learning process is more valuable than speed of completion.
Learning Path▌
- 1Familiarize yourself with skill capabilities and limitations
- 2Start with low-risk, non-critical tasks
- 3Progress to more complex and valuable use cases
- 4Build expertise through regular use and experimentation
Discussion
Product Hunt–style comments (not star reviews)- No comments yet — start the thread.
Ratings
4.5★★★★★26 reviews- ★★★★★Ava Khan· Dec 20, 2024
search-recent-jobs has been reliable in day-to-day use. Documentation quality is above average for community skills.
- ★★★★★Rahul Santra· Nov 27, 2024
Registry listing for search-recent-jobs matched our evaluation — installs cleanly and behaves as described in the markdown.
- ★★★★★Alexander Thompson· Nov 11, 2024
search-recent-jobs fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.
- ★★★★★Pratham Ware· Oct 18, 2024
search-recent-jobs reduced setup friction for our internal harness; good balance of opinion and flexibility.
- ★★★★★Alexander Wang· Oct 2, 2024
We added search-recent-jobs from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
- ★★★★★Hiroshi Nasser· Sep 25, 2024
search-recent-jobs has been reliable in day-to-day use. Documentation quality is above average for community skills.
- ★★★★★Sakshi Patil· Sep 5, 2024
search-recent-jobs has been reliable in day-to-day use. Documentation quality is above average for community skills.
- ★★★★★Chaitanya Patil· Aug 24, 2024
Solid pick for teams standardizing on skills: search-recent-jobs is focused, and the summary matches what you get after install.
- ★★★★★Hiroshi Tandon· Aug 16, 2024
Solid pick for teams standardizing on skills: search-recent-jobs is focused, and the summary matches what you get after install.
- ★★★★★Piyush G· Jul 15, 2024
We added search-recent-jobs from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
showing 1-10 of 26