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.
Works with
AI-first code editor with Composer
Before installing skills in Cursor, ensure your development environment meets these requirements:
node --versionsearch-recent-jobsExecute the skills CLI command in your project's root directory to begin installation:
Fetches search-recent-jobs from linkedin.com/search-linkedin-jobs-3v1wu7 and configures it for Cursor.
The CLI shows a list of agents. Use arrow keys and space to select Cursor:
Confirm successful installation by checking the skill directory location:
Restart Cursor to activate search-recent-jobs. Access via /search-recent-jobs in your agent's command palette.
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 environment. Always review source, verify the publisher, and test in isolation before production.
Submit your Claude Code skill and start earning
Automate repetitive workflows and reduce manual effort
Example
Generate reports, summarize documents, draft communications
Save 3-5 hours per week on routine tasks
Learn new skills, understand complex topics, get expert guidance
Example
Explain concepts, provide examples, suggest learning resources
Accelerate learning and skill development by 2x
Enhance output quality through reviews, suggestions, and refinements
Example
Review drafts, suggest improvements, catch errors
Improve work quality by 30-40% with less effort
0
total installs
0
this week
0
upvotes
Run in your terminal
0
installs
0
this week
—
stars
| 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 |
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.
/jobs/search?... HTML — the guest API is an order of magnitude cheaper and structurally cleaner.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.
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.
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.
<li> cardEach 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.
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).
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.
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.
browse cloud fetch is enough. No cookies, no auth, no Referer header, no User-Agent spoofing, no Browserbase session needed. The endpoint is https://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 a 302 redirect 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," compose keywords from the caller's profile data instead.&count=25 works — it's silently ignored. The response is structurally always ≤ 10 <li> cards. Paginate via start=.totalResultCount in the guest response. Discover end-of-results empirically: stop when a page returns < 10 cards or you hit your application's max.<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 bare https://www.linkedin.com/jobs/view/{slug}-{jobId} is the canonical form, dedups cleanly, and the slug is recoverable from the URL alone.<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 --new suffix is purely a CSS hook — when matching, allow both via class="job-search-card__listdate(?:--new)?". Both expose the same datetime="YYYY-MM-DD" and relative-time text-content.datetime is date-only (no time-of-day). The <time datetime> attribute is YYYY-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..replace(/\s+/g,' ').trim() after each text extraction — otherwise you get strings like "\n Senior Frontend Engineer\n " in your output.senior-software-engineer-frontend-ui-%E2%80%93-san-francisco-... (an em-dash). When normalizing URLs for dedup, normalize percent-decoding or strictly keep the jobId numeric tail as the dedup key.location text drives scope, not the request IP. Verified iter-1: the same query with location=New+York from a Browserbase US-west session returns NYC jobs (New York, NY, New York City Metropolitan Area); changing to location=San+Francisco+Bay+Area flips the result set to SF metro. No postal= override is needed (unlike Craigslist's API which IS IP-scoped).geoId is the deterministic alternative to free-text location. When the location string is ambiguous or stable across runs, prefer geoId={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 with location=<text> first and inspecting the response URL or by hitting https://www.linkedin.com/jobs-guest/api/typeaheadHits?query=<text>&typeaheadType=GEO.%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 to keywords=.currentTitle + " " + top 3 skills + " " + seniorityWord. Example: keywords=senior+frontend+engineer+react+typescript+nextjs. LinkedIn's keywords field tokenizes and matches across title + skills + description — heavier ranking on title matches./jobs/search page 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/...).connect.usw2.browserbase.com, so live browse cloud browse --connect driving was not exercised in iter-1 — but browse 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.{
"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" }
Prerequisites
Time Estimate
15-45 minutes depending on use case complexity
Steps
Common Pitfalls
✓ Do
✗ Don't
💡 Pro Tips
✓ 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.
kostja94/marketing-skills
aaaaqwq/claude-code-skills
agentbay-ai/agentbay-skills
glebis/claude-skills
shopmeskills/mcp
wuchubuzai2018/expert-skills-hub
search-recent-jobs has been reliable in day-to-day use. Documentation quality is above average for community skills.
Registry listing for search-recent-jobs matched our evaluation — installs cleanly and behaves as described in the markdown.
search-recent-jobs fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.
search-recent-jobs reduced setup friction for our internal harness; good balance of opinion and flexibility.
We added search-recent-jobs from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
search-recent-jobs has been reliable in day-to-day use. Documentation quality is above average for community skills.
search-recent-jobs has been reliable in day-to-day use. Documentation quality is above average for community skills.
Solid pick for teams standardizing on skills: search-recent-jobs is focused, and the summary matches what you get after install.
Solid pick for teams standardizing on skills: search-recent-jobs is focused, and the summary matches what you get after install.
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