LinkedIn Search Results Scraper API
Our LinkedIn search results scraper runs against LinkedIn's own public guest jobs search: pass keywords and a location, and get back a clean list of job-card results as JSON, each with title, company, company URL, location, posted date, salary when shown, and logo, with offset pagination for more.
Why LinkedIn Search Results data is login-walled
The only LinkedIn search surface that answers logged-out is the guest jobs endpoint; people search and Sales Navigator sit behind a login and are not returned here. LinkedIn serves the jobs results as a bare HTML fragment of 10 cards with offset pagination, so a naive parser has to handle the missing page wrapper and the +10 offset itself.
Call the LinkedIn Search Results Scraper API in one request
curl "https://api.linkedinscraperapi.com/api/v1/linkedin/search?keywords=software+engineer&location=United+States&api_key=$API_KEY" import requests
BASE = "https://api.linkedinscraperapi.com"
API_KEY = "YOUR_API_KEY"
# Page 1: keywords + location. start is an OFFSET (0, 10, 20, ...).
params = {
"keywords": "software engineer",
"location": "United States",
"start": 0,
"api_key": API_KEY,
}
data = requests.get(f"{BASE}/api/v1/linkedin/search", params=params, timeout=30).json()
print(data["total_results"], "cards on page", data["page"])
for job in data["results"]:
print(job["position"], job["title"], "-", job["company"], "-", job["location"])
# Next page: bump the offset by 10.
params["start"] = 10
next_page = requests.get(f"{BASE}/api/v1/linkedin/search", params=params, timeout=30).json() Parameters
| Parameter | Required | Default | Notes |
|---|---|---|---|
keywords | required | - | The search query, e.g. software engineer. The alias q is also accepted. Required. |
location | optional | United States | Geographic filter, e.g. United States. Defaults to United States. |
start | optional | 0 | Pagination OFFSET, not a page number: 0, 10, 20, and so on (+10 per page). |
limit | optional | 25 | Maximum cards to return; the guest endpoint serves up to 10 per call. |
api_key | required | - | Your API key, passed as a query parameter. Get one free at signup. |
The JSON the LinkedIn Search Results Scraper API returns
{
"query": "software engineer",
"keywords": "software engineer",
"location": "United States",
"start": 0,
"page": 1,
"total_results": 10,
"results": [
{
"position": 1,
"id": "4406118990",
"job_id": "4406118990",
"title": "Software Engineer, New Grad",
"url": "https://www.linkedin.com/jobs/view/software-engineer-new-grad-at-notion-4406118990",
"currency": "USD",
"thumbnail": "https://media.licdn.com/dms/image/v2/D4E0BAQGwvcv_1tHZ4w/company-logo_100_100/B4EZW25gE2GgAQ-/0/1742530282185/notionhq_logo?e=2147483647&v=beta&t=h_sgZm5R2TgP9Fpbo95m2wmxnSDoEz06eupofZwpSXs",
"company": "Notion",
"company_url": "https://www.linkedin.com/company/notionhq",
"location": "San Francisco, CA",
"posted_date": "2026-06-27",
"posted_label": "3 days ago",
"salary": null,
"company_logo": "https://media.licdn.com/dms/image/v2/D4E0BAQGwvcv_1tHZ4w/company-logo_100_100/B4EZW25gE2GgAQ-/0/1742530282185/notionhq_logo?e=2147483647&v=beta&t=h_sgZm5R2TgP9Fpbo95m2wmxnSDoEz06eupofZwpSXs"
},
{
"position": 4,
"id": "4433513807",
"job_id": "4433513807",
"title": "Software Engineer I",
"url": "https://www.linkedin.com/jobs/view/software-engineer-i-at-uber-4433513807",
"currency": "USD",
"thumbnail": "https://media.licdn.com/dms/image/v2/C4D0BAQFiYnR1Mbtxdg/company-logo_100_100/company-logo_100_100/0/1630552741617/uber_com_logo?e=2147483647&v=beta&t=eLjukYsixVQJyGQQ7asxFiNOUNa3RVdnAMESgTWs_AQ",
"company": "Uber",
"company_url": "https://www.linkedin.com/company/uber-com",
"location": "Sunnyvale, CA",
"posted_date": "2026-06-25",
"posted_label": "5 days ago",
"salary": null,
"company_logo": "https://media.licdn.com/dms/image/v2/C4D0BAQFiYnR1Mbtxdg/company-logo_100_100/company-logo_100_100/0/1630552741617/uber_com_logo?e=2147483647&v=beta&t=eLjukYsixVQJyGQQ7asxFiNOUNa3RVdnAMESgTWs_AQ"
}
]
} | Field | Type | Description |
|---|---|---|
keywords | string | The search query that was run, echoed back from your request. |
location | string | The location filter applied to the search. |
start | integer | The pagination offset used for this response. |
page | integer | The page number derived from the offset, starting at 1. |
total_results | integer | Number of job cards returned on this page. |
results | array | The job cards for this page. The same list is also mirrored under the jobs key. |
results[].job_id | string | The numeric job ID, usable directly with the linkedin/job endpoint. |
results[].title | string | The job title from the card. |
results[].url | string | The /jobs/view/ URL for the posting, with tracking params stripped. |
results[].company | string | The hiring company name. |
results[].company_url | string | The hiring company's /company/ page URL. |
results[].location | string | The job location shown on the card. |
results[].posted_date | string | The machine-readable posting date, e.g. "2026-06-27". |
results[].posted_label | string | Relative posting time, e.g. "3 days ago". |
results[].salary | string | The salary text when the card shows it, otherwise null. |
results[].company_logo | string | URL of the company logo (also mirrored as thumbnail). |
Who pulls LinkedIn data, and for what
Job board building
Hiring-trend tracking
Recruiting sourcing
Feed and alert pipelines
Search-to-detail workflows
Labor-market datasets
Why teams build on our LinkedIn Search Results Scraper API
Each call returns a page of parsed job cards in the order LinkedIn's guest search ranks them, with company URLs and job IDs ready to reuse. We handle the missing page wrapper, the +10 offset, and de-duping, and route through residential proxies with retries at a 2.6s median so a page reliably comes back instead of a rate-limit shell.
Keywords and location input
Offset pagination
Ready-to-chain job IDs
Real logo URLs
Residential-first routing
Block vs empty diagnostics
LinkedIn Search Results Scraper API measured against the alternatives
| Our API | DIY (requests / headless) | Official LinkedIn API | |
|---|---|---|---|
| Search input | Keywords plus location | Build the guest URL yourself | No public jobs-search endpoint |
| Output | Parsed job cards as JSON | Bare HTML fragment to parse | Partner-gated, if approved |
| Pagination | Offset handled, page returned | Track the +10 offset yourself | Cursor, partner-only |
| Setup | API key only | Residential proxies, parsers | Talent Solutions partnership |
| Anti-bot and proxies | Residential-first, built in | You build and maintain it | Not applicable |
| Chaining to detail | job_id ready for the job endpoint | Extract the ID yourself | Separate authorized calls |
| Scope, logged-out | Public jobs search | Same, if you dodge blocks | People search needs a login |
Usage-based pricing, no seats
| Plan | Price | Best for |
|---|---|---|
| Free | 1,000 requests | Testing and small jobs |
| Pro | $0.60 / 1k | Production workloads |
| Pay-as-you-go | $0.90 / 1k | Spiky or one-off volume |
Median response 2.6s. You only pay for successful requests.
FAQ
A LinkedIn search results scraper reads a LinkedIn results page and returns the entries in a structured format. Ours runs against LinkedIn's public guest jobs search: you pass keywords and a location, and it returns a paginated list of job cards as JSON, each with title, company, company URL, location, posted date, salary when shown, and logo.
No. People search and Sales Navigator sit behind a LinkedIn login and are not exposed to logged-out visitors, so this endpoint does not return them. The search surface LinkedIn does render publicly is its guest jobs search, which is what this endpoint reads. We describe the scope plainly rather than implying access to login-only results.
The start parameter is an offset, not a page number. The guest endpoint serves up to 10 cards per call, so you fetch the next page by increasing start by 10 (0, 10, 20, and so on). Each response also returns a derived page number so you can track position without doing the math yourself.
Each card in the results array includes a job_id and a clean /jobs/view/ URL. Pass that job_id to our LinkedIn job endpoint to get the full posting: description, salary when shown, seniority, employment type, job function, and industries. The search endpoint finds postings; the job endpoint expands them.
No. You only need a linkedinscraperapi key, passed as the api_key query parameter. There is no LinkedIn login, no cookies, and no Talent Solutions partnership. We read the public guest jobs search. The free tier includes 1,000 requests per month.
Either the query genuinely has no guest-visible postings for that location, or the egress hit a LinkedIn rate-limit or block. The endpoint distinguishes the two by reporting the markers it matched when a page comes back empty, so a block can be retried while a truly empty search is not. We lead with residential proxies to keep blocks rare.
Median end-to-end response is about 2.6 seconds per page, which includes residential proxy routing, anti-bot handling, retries, and parsing. Each call returns one page of up to 10 job cards.