Search LinkedIn jobs
Search for job postings on LinkedIn with various filters. Supports pagination and multiple filter criteria including location, employment type, experience level, and more. Filters changed when LinkedIn rebuilt its job search. `industry`, `locationId`, `geoUrn` and `jobType` are rejected with a 400 rather than ignored — LinkedIn no longer offers those filters. Use `employmentType`, `experienceLevel`, `geoId`, and `segmentIds` (filter-pill ids, e.g. `"225001:272001"` for Remote). | Old filter | Use instead | | --- | --- | | `jobType: ["F"]` | `employmentType: ["full-time"]` | | `experienceLevel: ["4","5","6"]` | `experienceLevel: ["senior","director","executive"]` | | `workplaceType: ["2"]` (Remote) | `workplaceType: ["remote"]` | | `industry` | `segmentIds` (the ids LinkedIn offers vary by keyword) | | `locationId` / `geoUrn` | `geoId` | `workplaceType` is applied to the returned cards, not by LinkedIn. LinkedIn honours the Remote segment, but when the fully-filtered pool is thin it BACKFILLS the page with rows that do not match and still answers 200. Measured on one account with keywords "VP of Marketing" and the Remote segment held constant: alone 10/10 remote, plus `experienceLevel` 9/10, plus `past-month` 8/10, plus `past-week` 5/10, plus `past-24h` 5/10, plus `past-24h` and `experienceLevel` 4/10. It tracks how narrow the filter set is, not the keyword, so no segment id avoids it. Filtering on each card's own pill is therefore the only reliable option, with two consequences: a page may return fewer than `count` rows (check `hasMore` and page on), and jobs LinkedIn labels with no workplace pill are excluded rather than assumed. Rate limit: 1,000 search calls per account per day (resets at midnight UTC), and 30 calls per minute. One request counts as one call regardless of `count`.
/search/jobsCode Examples
curl -X POST 'https://api.connectsafely.ai/linkedin/search/jobs' \ -H 'Authorization: Bearer <your_api_key>' \ -H 'Content-Type: application/json' \ -d '{"accountId":"acc_12345","keywords":"","count":25,"start":0,"filters":{"datePosted":"2024-01-15","companyIds":["Acme Inc"],"easyApply":false,"earlyApplicant":false,"inYourNetwork":false,"employmentType":["default"],"experienceLevel":["example_value"],"workplaceType":["default"],"segmentIds":["12345"],"geoId":"12345","distance":"example_value"}}'Search for job postings on LinkedIn with various filters. Supports pagination and multiple filter criteria including location, employment type, experience level, and more.
Filters changed when LinkedIn rebuilt its job search. industry, locationId, geoUrn and jobType are rejected with a 400 rather than ignored — LinkedIn no longer offers those filters. Use employmentType, experienceLevel, geoId, and segmentIds (filter-pill ids, e.g. "225001:272001" for Remote).
| Old filter | Use instead |
|---|---|
jobType: ["F"] | employmentType: ["full-time"] |
experienceLevel: ["4","5","6"] | experienceLevel: ["senior","director","executive"] |
workplaceType: ["2"] (Remote) | workplaceType: ["remote"] |
industry | segmentIds (the ids LinkedIn offers vary by keyword) |
locationId / geoUrn | geoId |
workplaceType is applied to the returned cards, not by LinkedIn. LinkedIn honours the Remote segment, but when the fully-filtered pool is thin it BACKFILLS the page with rows that do not match and still answers 200. Measured on one account with keywords "VP of Marketing" and the Remote segment held constant: alone 10/10 remote, plus experienceLevel 9/10, plus past-month 8/10, plus past-week 5/10, plus past-24h 5/10, plus past-24h and experienceLevel 4/10. It tracks how narrow the filter set is, not the keyword, so no segment id avoids it. Filtering on each card's own pill is therefore the only reliable option, with two consequences: a page may return fewer than count rows (check hasMore and page on), and jobs LinkedIn labels with no workplace pill are excluded rather than assumed.
Rate limit: 1,000 search calls per account per day (resets at midnight UTC), and 30 calls per minute. One request counts as one call regardless of count.
Parameters
No parameters.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
accountId | string | No | LinkedIn account ID to use for the search. If not provided, uses the default account. |
keywords | string | No | Search keywords for job title, company, or description |
count | number | No | Number of results to return per page |
start | number | No | Pagination offset (0-indexed) |
filters | object | No | Optional filters to narrow down search results |
Example
{
"accountId": "acc_12345",
"keywords": "",
"count": 25,
"start": 0,
"filters": {
"datePosted": "2024-01-15",
"companyIds": [
"Acme Inc"
],
"easyApply": false,
"earlyApplicant": false,
"inYourNetwork": false,
"employmentType": [
"default"
],
"experienceLevel": [
"example_value"
],
"workplaceType": [
"default"
],
"segmentIds": [
"12345"
],
"geoId": "12345",
"distance": "example_value"
}
}Responses
| Status | Description |
|---|---|
| 200 | Jobs retrieved successfully |
| 400 | Bad Request - Invalid request parameters, or a filter LinkedIn no longer supports. Retired filters are rejected rather than ignored, so a request never silently returns unfiltered results. |
| 401 | Unauthorized - Invalid or missing API key |
| 429 | Rate limit exceeded - the account has spent its monthly job-search budget |
| 500 | Internal Server Error - Failed to get LinkedIn credentials or search failed |
Rate Limit Headers
All responses include rate limit information in the headers:
| Header | Description |
|---|---|
X-RateLimit-Action | The action type being rate limited |
X-RateLimit-Limit | Maximum actions allowed per period |
X-RateLimit-Used | Actions used in current period |
X-RateLimit-Remaining | Actions remaining |
X-RateLimit-Reset | ISO 8601 timestamp when limit resets |
200 Response Parameters
| Name | Type | Description |
|---|---|---|
success | boolean | |
jobs | array | |
pagination | any | |
hasMore | boolean | Whether more results are available |
200 Example
{
"success": true,
"jobs": [
{
"jobId": "4367156030",
"title": "Founding Software Engineer - AI and Backend",
"companyName": "Dexicon",
"companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQ.../company-logo_100_100/...",
"location": "Bengaluru, Karnataka, India",
"isRemote": true,
"isHybrid": false,
"postedDate": "Posted 4 days ago",
"jobUrl": "https://www.linkedin.com/jobs/view/4367156030/",
"easyApply": false
},
{
"jobId": "4321502503",
"title": "Software Engineer (backend)",
"companyName": "Kodo",
"companyLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQ.../company-logo_100_100/...",
"location": "Mumbai Metropolitan Region",
"isRemote": false,
"isHybrid": false,
"postedDate": "Posted 2 days ago",
"salary": "30K INR/month - 45K INR/month",
"jobUrl": "https://www.linkedin.com/jobs/view/4321502503/",
"easyApply": true
}
],
"pagination": {
"count": 25,
"start": 0
},
"hasMore": true
}400 Response Parameters
| Name | Type | Description |
|---|---|---|
success | boolean | |
error | object |
400 Example
{
"issues": [
{
"received": "4",
"code": "invalid_enum_value",
"options": [
"entry",
"senior",
"manager",
"director",
"executive"
],
"path": [
"filters",
"experienceLevel",
0
],
"message": "Invalid enum value. Expected 'entry' | 'senior' | 'manager' | 'director' | 'executive', received '4'"
},
{
"code": "custom",
"message": "'industry' has no equivalent — the flagship SRP exposes industries only as per-query pills; use segmentIds",
"path": [
"filters",
"industry"
]
},
{
"code": "custom",
"message": "'jobType' has no equivalent — renamed to employmentType with values full-time|part-time|contract|internship|volunteer",
"path": [
"filters",
"jobType"
]
}
],
"name": "ZodError"
}401 Response Parameters
| Name | Type | Description |
|---|---|---|
error | string |
401 Example
{
"error": "Unauthorized - Invalid credentials"
}429 Response Parameters
| Name | Type | Description |
|---|---|---|
error | string | |
success | boolean |
429 Example
{
"error": "Rate limit exceeded for SEARCH_JOBS: 300/300 used. Resets at 2026-09-01T00:00:00.000Z",
"success": false
}500 Response Parameters
| Name | Type | Description |
|---|---|---|
error | string |
500 Example
{
"error": "Failed to search jobs",
"success": false
}Search LinkedIn people (alias)
Alias endpoint for /search/people. Search for LinkedIn members/professionals with extensive filtering options. Ideal for recruiting, sales prospecting, and networking. Filter by name, job title, company, location, connection degree, and more. Recommended: For `connectionOf` or `followerOf` filters, prefer `search-people-v2` which natively supports these filters and returns more accurate results.
Get job details
Retrieve a job posting: its top card (title, company, location, pills, applicant count, hiring status) and its full description. Use the jobId from search results, or any jobId — the endpoint does not need a prior search. `postedOn` is not returned. LinkedIn shows the posting's age rather than a date, so `postedText` carries it verbatim ("2 weeks ago").
