Facebook Pixel
APILinkedIn Search

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`.

POST/search/jobs
Authentication requiredSearch

Code 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 filterUse instead
jobType: ["F"]employmentType: ["full-time"]
experienceLevel: ["4","5","6"]experienceLevel: ["senior","director","executive"]
workplaceType: ["2"] (Remote)workplaceType: ["remote"]
industrysegmentIds (the ids LinkedIn offers vary by keyword)
locationId / geoUrngeoId

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

FieldTypeRequiredDescription
accountIdstringNoLinkedIn account ID to use for the search. If not provided, uses the default account.
keywordsstringNoSearch keywords for job title, company, or description
countnumberNoNumber of results to return per page
startnumberNoPagination offset (0-indexed)
filtersobjectNoOptional 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

StatusDescription
200Jobs retrieved successfully
400Bad 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.
401Unauthorized - Invalid or missing API key
429Rate limit exceeded - the account has spent its monthly job-search budget
500Internal Server Error - Failed to get LinkedIn credentials or search failed

Rate Limit Headers

All responses include rate limit information in the headers:

HeaderDescription
X-RateLimit-ActionThe action type being rate limited
X-RateLimit-LimitMaximum actions allowed per period
X-RateLimit-UsedActions used in current period
X-RateLimit-RemainingActions remaining
X-RateLimit-ResetISO 8601 timestamp when limit resets

200 Response Parameters

NameTypeDescription
successboolean
jobsarray
paginationany
hasMorebooleanWhether 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

NameTypeDescription
successboolean
errorobject

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

NameTypeDescription
errorstring

401 Example

{
  "error": "Unauthorized - Invalid credentials"
}

429 Response Parameters

NameTypeDescription
errorstring
successboolean

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

NameTypeDescription
errorstring

500 Example

{
  "error": "Failed to search jobs",
  "success": false
}

On this page