How do you scrape LinkedIn jobs via API without getting blocked?
To scrape LinkedIn job postings without logins or brittle HTML parsers, call ReefAPI's LinkedIn Jobs search endpoint with keywords and a location and read the returned roles as structured JSON.
This guide demonstrates the real LinkedIn Jobs API engine with a captured response from . The example is only published because the engine passed the SEO snapshot gate.
Recruiting intelligence, labor-market tracking, job-board aggregation and hiring-trend analysis.
Call the live endpoint
- 1
Choose keywords and a location
Start with a specific role and region (for example "python developer" in the United States) so the response stays relevant.
- 2
Call linkedin-jobs/v1/jobs/search
Send the JSON params from the captured example with your ReefAPI key in the x-api-key header.
- 3
Normalize jobs from data
Store job id, title, company, location, posting date and the canonical job URL for your workflow.
- 4
Use meta for monitoring
Check meta.record_count, latency_ms and error before charging downstream alerts or enrichment.
Copy the request
These snippets use the captured request params for linkedin-jobs/v1/jobs/search.
curl -X POST https://api.reefapi.com/linkedin-jobs/v1/jobs/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"keywords":"python developer","location":"United States","max_results":25}'import requests
r = requests.post(
"https://api.reefapi.com/linkedin-jobs/v1/jobs/search",
headers={"x-api-key": REEF_KEY},
json={
"keywords": "python developer",
"location": "United States",
"max_results": 25
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/linkedin-jobs/v1/jobs/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"keywords": "python developer",
"location": "United States",
"max_results": 25
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.linkedin-jobs.jobs/search with {"keywords":"python developer","location":"United States","max_results":25}.Captured output from ReefAPI
Captured on UTC. The response below is the committed snapshot, including the API envelope and metadata.
{
"method": "POST",
"url": "https://api.reefapi.com/linkedin-jobs/v1/jobs/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"keywords": "python developer",
"location": "United States",
"max_results": 25
}
}{
"ok": true,
"meta": {
"api": "linkedin-jobs",
"endpoint": "jobs/search",
"mode": "live",
"latency_ms": 3370.2,
"record_count": 25,
"bytes": 103606,
"cache_hit": false,
"completeness_pct": 100,
"stop_reason": "max_results",
"requests": 4,
"included_detail": false,
"included_company": false,
"pagination": {
"has_more": true,
"next_cursor": "25"
},
"attempts": 1
},
"data": {
"jobs": [
{
"job_id": "[redacted-phone]",
"job_url": "https://www.linkedin.com/jobs/view/python-developer-l3-at-wipro-[redacted-phone]",
"title": "PYTHON DEVELOPER L3",
"company": {
"name": "Wipro",
"url": "https://in.linkedin.com/company/wipro",
"slug": "wipro",
"logo": "https://media.licdn.com/dms/image/v2/D4E0BAQFTFdGNe-V9tw/company-logo_100_100/B4EZpFMu4WIQAQ-/0/[redacted-phone]?e=[redacted-phone]&v=beta&t=ou5vQOksNDH68avQwV6fPk4vX3nYe_Vc_K1zSfm9PFg",
"description": null,
"website": null,
"employee_count": null,
"company_size": null,
"industry": null,
"headquarters": null,
"founded": null,
"organization_type": null,
"specialties": []
},
"location": "Akron, NY",
"workplace_type": null,
"workplace_type_source": null,
"posted_date": "[redacted-phone]",
"posted_relative": "1 week ago",
"description_html": null,
"description_text": null,
"salary": null,
"seniority_level": null,
"employment_type": null,
"job_function": null,
"industries": null,
"applicant_count_text": null,
"applicant_count_min": null,
"apply_url": null,
"easy_apply": null,
"benefits": [],
"job_state": null,
"search_query": "python developer",
"search_location": "United States"
},
{
"job_id": "[redacted-phone]",
"job_url": "https://www.linkedin.com/jobs/view/python-developer-at-bcforward-[redacted-phone]",
"title": "Python Developer",
"company": {
"name": "BCforward",
"url": "https://www.linkedin.com/company/bcforward",
"slug": "bcforward",
"logo": "https://media.licdn.com/dms/image/v2/D4E0BAQGIlzwwOXZFkg/company-logo_100_100/B4EZ5P5G4OGUAM-/0/[redacted-phone]?e=[redacted-phone]&v=beta&t=NQd7JzLO9ivUj0H8io9v4wlJxAM1PXIU5kk37JaXWUE",
"description": null,
"website": null,
"employee_count": null,
"company_size": null,
"industry": null,
"headquarters": null,
"founded": null,
"organization_type": null,
"specialties": []
},
"location": "Phoenix, AZ",
"workplace_type": null,
"workplace_type_source": null,
"posted_date": "[redacted-phone]",
"posted_relative": "1 week ago",
"description_html": null,
"description_text": null,
"salary": null,
"seniority_level": null,
"employment_type": null,
"job_function": null,
"industries": null,
"applicant_count_text": null,
"applicant_count_min": null,
"apply_url": null,
"easy_apply": null,
"benefits": [],
"job_state": null,
"search_query": "python developer",
"search_location": "United States"
},
{
"job_id": "[redacted-phone]",
"job_url": "https://www.linkedin.com/jobs/view/python-developer-at-genpact-[redacted-phone]",
"title": "Python Developer",
"company": {
"name": "Genpact",
"url": "https://www.linkedin.com/company/genpact",
"slug": "genpact",
"logo": "https://media.licdn.com/dms/image/v2/D4E0BAQFIjOdiff8hjA/company-logo_100_100/company-logo_100_100/0/[redacted-phone]/genpact_logo?e=[redacted-phone]&v=beta&t=Jm64InCy2eaPouk0Sx0XC-HIfv3mrdSUoF4zOkk7SKQ",
"description": null,
"website": null,
"employee_count": null,
"company_size": null,
"industry": null,
"headquarters": null,
"founded": null,
"organization_type": null,
"specialties": []
},
"location": "New York City Metropolitan Area",
"workplace_type": null,
"workplace_type_source": null,
"posted_date": "[redacted-phone]",
"posted_relative": "1 week ago",
"description_html": null,
"description_text": null,
"salary": null,
"seniority_level": null,
"employment_type": null,
"job_function": null,
"industries": null,
"applicant_count_text": null,
"applicant_count_min": null,
"apply_url": null,
"easy_apply": null,
"benefits": [],
"job_state": null,
"search_query": "python developer",
"search_location": "United States"
}
],
"count": 25,
"pages_fetched": 4,
"stop_reason": "max_results"
}
}Why this is hard manually
LinkedIn aggressively blocks scraping: guest pages paginate through hydrated state, rate-limit by IP and serve different markup to logged-out crawlers. A scraper tuned for one query routinely fails on pagination, expired postings or location filters.
Beyond fetching, the hard part is normalizing job title, company, location, posting date and the canonical job URL into a repeatable shape that recruiting or analytics jobs can trust.
Why ReefAPI solves it
ReefAPI wraps the working LinkedIn Jobs engine behind one POST request and returns the standard envelope: ok, data, meta and error. The live snapshot on the LinkedIn Jobs API page shows a real jobs/search call returning roles with title, company, location and posting metadata.
Use it when you need dependable public job data for recruiting tools, market dashboards, job aggregators or AI agents — without LinkedIn accounts or proxy management.
Questions developers ask
Does this require a LinkedIn login?
No. The guide uses ReefAPI's LinkedIn Jobs engine and a ReefAPI key; no LinkedIn account or cookies are required.
Why does my LinkedIn scraper keep getting blocked?
LinkedIn scraping needs rotating proxies and careful pacing to survive guest-page rate limits and IP bans. ReefAPI handles that for you and returns live JSON; blocked or failed calls are free.
What job fields come back?
The captured response includes job ids, titles, company names, locations, posting dates and canonical job URLs.
Can I track many searches?
Yes. Run one request per keyword and location, store seen job ids, and dedupe new results in your own database.