Track Hiring Trends with LinkedIn Jobs Data (2026)
Job postings are one of the most honest signals a company sends. Before a press release, before a funding announcement, a company tells the world what it is investing in by what it is hiring for. Aggregate those postings across a market and you get something valuable: a live read on where demand is heading — which roles, which companies, which cities.
This guide shows how to turn the public LinkedIn jobs surface into that kind of hiring-trend intelligence using one REST endpoint. We will pull real postings, aggregate and break them down by company and location, and track the volume over time. And — because this matters more than the pitch — I will be honest about exactly what the data can and cannot tell you.
TL;DR: Ingest public postings with GET /api/linkedin/jobs?keywords=<role>&location=<place>, dedupe by job_id, and you can (1) count how many roles of a type are open in a market, (2) break them down by company and location, and (3) track that volume over time by saving dated snapshots. It is keyword-matched, not company-filtered, and each page returns 10 postings — so you paginate for depth. Jobs calls are $0.50/1K, down to $0.025/1K at Scale. Reads publicly available LinkedIn data only. Real data and tested code below.
Why job postings are a market signal
Hiring is expensive and deliberate, so companies only post roles they intend to fill. That makes the mix of open postings a leading indicator: a surge in "machine learning engineer" roles across a sector says where budget is moving; a city climbing the location breakdown says where a function is concentrating. Recruiters, market researchers, investors, and go-to-market teams all want this read, and most of it is sitting in plain sight on public job pages.
What the data is (and isn't)
Set expectations correctly and this works well; misunderstand the endpoint and you will draw wrong conclusions. Two honest points up front:
- It is keyword-matched, not company-filtered. Searching a company name returns postings that mention that name — including roles at other firms — not a clean list of that company's own jobs. For company-level signals, track the employer's headcount with the company endpoint instead, and use jobs search for role-and-location demand.
- Each page returns 10 postings. You paginate with
start(in steps of 10) for depth. The signal you track is the count of unique postings you ingest for a query, not a total LinkedIn count — so keep your ingest depth constant when comparing over time.
Within those bounds, the reliable per-posting fields are job_id, job_title, company_name, location and job_posted_date — everything you need to count and break down demand.
Real data: a live market snapshot
Here is the top of a real response for keywords=machine learning engineer&location=United States, pulled on July 2, 2026:
| Job title | Company | Location |
|---|---|---|
| Data Scientist | Zest for Tech | Washington DC-Baltimore Area |
| Machine Learning Engineer I | CNN | New York, NY |
| Software Engineer, AI/ML, Google Research | Mountain View, CA | |
| Machine Learning Engineer, Entry | Paramount | New York, NY |
Method: live GET /api/linkedin/jobs call on 2026-07-02, first four rows verbatim. Note the mix — a broadcaster (CNN), a studio (Paramount), and a search giant (Google) all hiring ML talent, which is itself a signal.
Aggregating a snapshot by company and location
A list of postings becomes intelligence the moment you aggregate it. Ingest several pages, dedupe by job_id, and count. Here is a tested aggregator that does exactly that:
import time, requests
from collections import Counter
API_KEY = "YOUR_API_KEY"
BASE = "https://apiserpent.com/api/linkedin/jobs"
def ingest(keywords, location, pages=3):
seen, rows = set(), []
for p in range(pages):
r = requests.get(BASE, headers={"X-API-Key": API_KEY},
params={"keywords": keywords, "location": location, "start": p * 10},
timeout=60)
if r.status_code != 200:
break
jobs = r.json().get("data", {}).get("jobs", [])
if not jobs:
break
for j in jobs:
jid = j.get("job_id")
if jid and jid not in seen:
seen.add(jid); rows.append(j)
time.sleep(0.4)
return rows
rows = ingest("machine learning engineer", "United States", pages=3)
print("unique postings:", len(rows))
print("top locations:", Counter(r["location"] for r in rows).most_common(4))
print("top companies:", Counter(r["company_name"] for r in rows).most_common(4))
Running that against live data on July 2, 2026 returned:
unique postings: 29
top locations: [('United States', 4), ('New York, NY', 3), ('Atlanta, GA', 2), ('San Francisco, CA', 2)]
top companies: [('CNN', 2), ('Crossing Hurdles', 2), ('Adobe', 2), ('Qualcomm', 2)]
That is a real market read in five lines of output: ML-engineer demand is spread across the country with New York leading the named metros, and the hiring is not just the usual big-tech names — a recruiting firm, Adobe, and Qualcomm all show up. Swap the query for your sector and you have your own breakdown.
Turning snapshots into a trend
One snapshot is a photograph; a trend is a film. The endpoint returns a point-in-time read, so — exactly like the headcount tracker — you build the time series by saving snapshots on a schedule:
- Fix your queries and depth. Pick your role-and-location pairs and a constant page depth (say 3 pages), so counts are comparable week to week.
- Ingest weekly and save the count. Store
date, query, unique_countper run. Weekly is the right cadence — hiring moves in weeks, not hours. - Compare. A query whose unique count climbs over a quarter is a market heating up; a falling count is one cooling off.
Because the ingest and dedupe logic is the same as the job-board pipeline, you can run both off one scheduled script: store the postings for your board and log the counts for your trend in the same pass.
What to do with hiring trends
1. Market and talent research
Which roles are in demand, and where? A weekly breakdown by title and location maps the supply-and-demand of a skill across markets — the backbone of a talent-market report or a "state of hiring" content piece.
2. Competitive and sector intelligence
Track a sector's postings and watch which companies keep appearing. A firm that suddenly floods the board with engineering roles is scaling a product; pair the observation with its headcount trend to confirm.
3. Go-to-market timing
If your buyer is a "Head of Data" and those roles are spiking in a sector, that sector is building the teams that buy your product. Hiring trends make a surprisingly good early demand signal for sales and marketing.
Errors, rate limits and retries
| Status | Meaning | What to do |
|---|---|---|
200 | Success — {"success": true, "data": {…}} | Read data.jobs. |
400 | Missing keywords | Fix the request; don't retry. |
429 | Rate limit for your bracket | Honor Retry-After, then retry. |
503 | Temporarily unavailable | Exponential backoff and retry. |
The ingest function handles each code; your rate limit scales with your balance bracket. Full semantics live in the API docs.
Pricing
| Tier | Unlock | Jobs search | Per call |
|---|---|---|---|
| Default | None | $0.50 / 1,000 | $0.0005 |
| Growth | One $100 deposit (10× off) | $0.05 / 1,000 | $0.00005 |
| Scale | One $500 deposit (20× off) | $0.025 / 1,000 | $0.000025 |
Tracking 30 role-and-location queries at 3 pages each, weekly, is about 90 calls a week — roughly 4,700 a year, or under $3 a year on Default and pennies at Scale. Pay-as-you-go, no subscription. See the full pricing page.
A note on compliance
Serpent's jobs endpoint reads the public LinkedIn jobs surface only — the listings a logged-out visitor sees. There is no login or credential in the flow. Aggregating public postings for market research is a common use case, but whether your specific use is permitted depends on LinkedIn's terms, your jurisdiction, and how you store and use the data. Treat compliance as your own decision; you remain responsible for lawful use.
Turn job postings into market intelligence
Aggregate and track public LinkedIn hiring data through one REST endpoint — no login, no proxies to manage. Jobs data from $0.50/1K, dropping to $0.025/1K at Scale, pay-as-you-go with no subscription.
Get Your Free API KeyExplore: LinkedIn API · Social Media APIs · Pricing
FAQ
What hiring data can I get from the LinkedIn Jobs API?
For any keyword and location you get a list of public job postings, each with job_id, job_title, company_name, location and job_posted_date. By ingesting and deduping those postings you can measure how many roles of a given type are open in a given place, break them down by company and location, and — by re-running on a schedule and saving the counts — track how that volume changes over time.
Can I filter LinkedIn jobs by a specific company?
Not directly. The jobs endpoint matches your keywords against the posting text, so searching a company name returns postings that mention that company (including roles at other firms) rather than only that company's own listings. For company-level signals, track the employer's headcount with the company endpoint instead, and use jobs search for role-and-location demand.
How do I track hiring trends over time?
Pick a set of role-and-location queries, ingest and dedupe the postings for each on a schedule (weekly works well), and save the unique-posting count with a date. Comparing those saved counts week over week shows whether demand for a role in a market is rising or cooling. The API returns a point-in-time snapshot, so the trend is something you build by storing snapshots.
How much does hiring-trend tracking cost?
Jobs search is $0.50 per 1,000 requests on Default, $0.05 on Growth (one $100 deposit) and $0.025 on Scale (one $500 deposit). Tracking 30 role-and-location queries at 3 pages each, weekly, is about 90 calls a week or roughly 4,700 a year — under $3 a year on Default. Pay-as-you-go, no subscription.
Is this real-time hiring data?
It is a live read of the public LinkedIn jobs surface at the moment you call it, so it is current — but it is a snapshot, not a streaming feed. For trend analysis that is exactly what you want: sample on a schedule and compare. It is not designed to alert you the instant a single new role is posted.



