Fields an LLM can reason over
salary as numbers (min · max · currency · interval), applicant_count as an integer with a timestamped history, is_active as a bool. No string-soup, no parsing on your side.
salary as numbers (min · max · currency · interval), applicant_count as an integer with a timestamped history, is_active as a bool. No string-soup, no parsing on your side.
linkfetch-mcp registers jobs search, job detail, applicant history, and location lookup as tools. Your agent searches and cites jobs without you writing a fetch wrapper.
8M+ postings since April 2026 as a PostgreSQL dump, CSV, and JSONL for $199 one-time — or $49/month for live read-only Postgres. No credits, no meter.
Pick the surface that matches your stack. Same rows, same provenance — different ergonomics. No SDK to install: the API is plain HTTPS and JSON.
# Senior+ machine-learning roles in the US posted this week
curl "https://api.linkfetch.io/v1/jobs" \
-H "Authorization: Bearer $LINKFETCH_KEY" \
-G \
--data-urlencode "q=machine learning" \
--data-urlencode "level=senior,staff,principal" \
--data-urlencode "location=United States" \
--data-urlencode "posted_within=week" \
--data-urlencode "limit=50"// Plain fetch — no SDK to install
const params = new URLSearchParams({
q: "machine learning",
level: "senior,staff,principal",
posted_within: "week",
limit: "50",
});
const res = await fetch(`https://api.linkfetch.io/v1/jobs?${params}`, {
headers: { Authorization: `Bearer ${process.env.LINKFETCH_KEY}` },
});
const { data: jobs, meta } = await res.json();
// Hand the typed rows to the model as grounded context
const summary = await anthropic.messages.create({
model: "claude-sonnet-5",
max_tokens: 1024,
messages: [{
role: "user",
content: `Summarize hiring trends from these ${jobs.length} roles (fetched ${meta.fetched_at}):\n${JSON.stringify(jobs)}`,
}],
});import os, requests
# Watch a competitor: everything they posted in the last 24h
r = requests.get(
"https://api.linkfetch.io/v1/jobs",
headers={"Authorization": f"Bearer {os.environ['LINKFETCH_KEY']}"},
params={"company": "acme-inc", "posted_within": "24h", "limit": 50},
)
jobs = r.json()["data"]
for job in jobs:
print(job["first_seen_at"], job["title"], job["applicant_count"])# claude_desktop_config.json
{
"mcpServers": {
"linkfetch": {
"command": "npx",
"args": ["-y", "linkfetch-mcp"],
"env": { "LINKFETCH_API_KEY": "sk_live_…" }
}
}
}
# Then ask Claude:
# "Find every infra-engineer role in Berlin posted this week.
# Group by company and rank by applicant velocity."One JSON object per posting, deduped on linkedin_job_id. The same shape comes back from the API, the MCP tools, and the dataset. Field-level coverage is published on the dataset page: descriptions on every row, parsed salary on ~10%, applicant counts on ~8%.
{
"linkedin_job_id": "4072311928",
"title": "Staff Backend Engineer",
"company": "Vercel",
"company_id": 14080355,
"location": "San Francisco, California, United States",
"level": "Mid-Senior level",
"employment_type": "Full-time",
"salary_min": 220000,
"salary_max": 290000,
"salary_currency": "USD",
"salary_interval": "year",
"applicant_count": 117,
"applicant_count_is_capped": false,
"posted_at_precise": "2026-04-29T08:13:11Z",
"first_seen_at": "2026-04-29T08:14:18Z",
"is_active": true,
"canonical_url": "https://www.linkedin.com/jobs/view/4072311928/"
}| capability | LinkFetch | Coresignal | Bright Data |
|---|---|---|---|
| 01Floor price | $0 · $5 free credit, then $29/mo | $49 / mo | $250 min order |
| 02Bulk export | $199 one-time · 8M+ rows | $1,000+ per dataset | $2.50 / 1K records |
| 03MCP server (Claude · Cursor · Zed) | Yes — linkfetch-mcp | — | — |
| 04Time to first call | 90 seconds, no card | Demo · eval · contract | Hours · proxy setup |
| 05is_active flag (re-checked on recrawl) | Yes | Yes | Not surfaced |
| 06Parsed salary fields | min · max · currency · interval | Yes | Range only |
| 07Applicant count + history | Yes — timestamped series | — | — |
| 08Provenance per row | source · fetched_at · freshness_days | Partial | — |
competitor figures from their public pricing pages · sources linked from each full teardown
Each pattern is a recipe with a working prompt and tool chain. Same API key, same rows, different agent loop.
Ground a candidate-matching agent in fresh roles. Pull new postings into your vector store on a schedule; let the model reason over current demand, not last quarter's snapshot.
Hiring is the loudest growth signal a company emits. Trigger your SDR agent when a target account posts a role that matches your buyer pattern.
Watchlist of N companies, weekly LLM-written market brief. Hiring velocity, role-mix shifts, geo expansion — the alt-data signal, indie-priced.
Three things. Structured fields the model can reason over — parsed salary as numbers, level and employment_type as strings, is_active as a boolean, applicant_count as an integer — not a bag of strings. MCP-native, so Claude Desktop, Claude Code, Cursor, and Zed pick it up as a tool with one config block (linkfetch-mcp). And provenance on every row, so when your agent surfaces a job to a user it can cite where and when it learned it.
Coresignal is an enterprise data-warehouse product with a sales cycle; Bright Data has a $250 minimum order and doesn't surface an is_active flag. Both are built for procurement, not for an indie dev shipping an agent on a Tuesday. LinkFetch starts at $0 with a $5 credit, ships an MCP server, and sells the whole archive for $199 one-time if you'd rather have the rows in Postgres.
We crawl LinkedIn's public guest endpoints continuously and index about 45,000+ new postings per day across 218 regions. Every row carries first_seen_at and last_seen_at, and is_active is re-checked on recrawl, so your index doesn't fill up with expired listings.
Not yet. Today you poll GET /v1/jobs with posted_within=24h (1 credit per call), or take the $49/month live database access and query first_seen_at directly. Real-time push delivery is on the roadmap; we'll announce it in the changelog when it ships rather than before.
Yes. We only index public job postings — listings any logged-out visitor can see. No fake accounts, no rented sessions, no cookie theft. We're aligned with GDPR and CCPA. Provenance fields (source, fetched_at, freshness_days) ship on every API row, so your agent can always say where it learned what it learned.
Flat per request, no per-result math. A jobs search is 1 credit and a job detail is 1 credit, whether the page holds one row or fifty. Empty results are free. The $5 free credit covers thousands of jobs calls; Starter is $29/month and Pro is $99/month. If you'd rather not meter at all, the dataset is $199 one-time or $49/month for live Postgres access.
All of them — the REST API returns plain JSON, so any HTTP client works and there is no SDK to install. The MCP server (linkfetch-mcp) plugs straight into Claude Desktop, Claude Code, Cursor, Zed, and Continue. Most customers wire it as a tool inside their agent loop alongside web search and a vector store.
You can. LinkedIn's guest endpoints are public. But you'll spend a quarter building the parser, another on rate-limit and proxy management, and you'll still be missing the structured shape — parsed salary, level, industry_ids, applicant counts over time — that we extract per row. We sell the time, not the access.