---
title: "Search LinkedIn Jobs"
method: POST
path: "/search/linkedin/jobs"
tags: ["search"]
---

# Search LinkedIn Jobs

`POST /search/linkedin/jobs`

# Search LinkedIn Jobs

Find job listings on LinkedIn by keywords, location, job type, experience level, and workplace type. Returns lightweight job rows (title, company, companyUrl, companyLogo, location, workplaceType, postedAt, jobUrl, listingId). For RICH job-detail (applicant count, full description, employment status, listed/expire timestamps, inferred benefits, formattedJobFunctions, formattedIndustries, applyMethod, companyDescription), pass the result's `listingId` to `visitJob` (or POST `/api/visit/linkedin/job`).

## Parameters
- **keywords** (optional): Search terms matched against job title, company name, and description

## Keyword syntax (Boolean operators)
Keywords support LinkedIn Boolean search syntax:
- **Exact phrase**: `"frontend engineer"` — matches only that exact title
- **AND**: `React AND TypeScript` — both terms required (spaces default to AND)
- **OR**: `"frontend engineer" OR "front-end developer"` — either term
- **NOT**: `engineer NOT intern` — exclude unwanted terms
- **Parentheses**: `(React OR Vue) AND "senior engineer"` — group logic

Operators must be **UPPERCASE**. Precedence: Quotes > Parentheses > NOT > AND > OR.

## Available filters
Pass human-readable names for `location`, `company`, `industry`, `jobFunction`, `benefits`, `commitments` — they are resolved to LinkedIn IDs server-side. Do not hand-resolve.

| Filter | Type | Description |
|--------|------|-------------|
| `location` | string[] | City/region/country names |
| `company` | string[] | Hiring company names |
| `industry` | string[] | Company industry names |
| `jobFunction` | string[] | Job function names (Engineering, Sales, …) |
| `datePosted` | string | `"past-24h"` \| `"past-week"` \| `"past-month"` |
| `sortBy` | string | `"relevance"` \| `"date"` |
| `jobType` | string[] | Employment type codes (see below) |
| `experienceLevel` | string[] | Seniority codes (see below) |
| `workplaceType` | string[] | Work location codes (see below) |
| `benefits` | string[] | Advertised benefit names |
| `commitments` | string[] | Employer commitment names |
| `easyApply` | boolean | Only Easy Apply jobs |
| `under10Applicants` | boolean | Only jobs with <10 applicants |
| `inYourNetwork` | boolean | Only jobs where you have a connection |
| `hasVerifications` | boolean | Only verified job posters |
| `fairChanceEmployer` | boolean | Only Fair Chance employers |

### Job type codes
| Code | Type |
|------|------|
| `F` | Full-time |
| `P` | Part-time |
| `C` | Contract |
| `T` | Temporary |
| `I` | Internship |
| `V` | Volunteer |
| `O` | Other |

### Experience level codes
| Code | Level |
|------|-------|
| `1` | Internship |
| `2` | Entry level |
| `3` | Associate |
| `4` | Mid-Senior level |
| `5` | Director |
| `6` | Executive |

### Workplace type codes
| Code | Type |
|------|------|
| `1` | On-site |
| `2` | Remote |
| `3` | Hybrid |

## Response fields (per item)
| Field | Type | Description |
|-------|------|-------------|
| `title` | string | Job title |
| `company` | string\|null | Hiring company name |
| `companyUrl` | string\|null | Company LinkedIn page URL |
| `companyLogo` | string\|null | Company logo URL |
| `location` | string\|null | Job location |
| `workplaceType` | string\|null | On-site / Remote / Hybrid |
| `postedAt` | string\|null | Human-readable posting time (e.g. `"2 days ago"`) |
| `jobUrl` | string | Direct URL to the job listing |
| `listingId` | string | LinkedIn job listing ID |

## Pagination
- Default page size: 10, max: 50
- Use `start` + `count` to paginate. Check `hasMore` for more pages.

## Example workflows
1. **Job monitoring**: Search by title + location → track new openings in your area
2. **Competitive hiring analysis**: Search by company keywords → see what roles competitors are hiring for
3. **Market demand research**: Search by skills → gauge demand for specific expertise

## Credits

## Request body

- object
  - `keywords` string — Search keywords. Matches against job title, company name, and description. Optional — you can search by filters alone. Supports LinkedIn Boolean syntax: use double quotes for exact phrases (e.g. "frontend engineer"), AND to require both terms, OR for alternatives (e.g. React OR Vue OR Angular), NOT to exclude (e.g. engineer NOT intern), and parentheses to group (e.g. (React OR Vue) AND "senior engineer"). Operators must be UPPERCASE.
  - `url` string — A LinkedIn search URL. The category and every filter the vertical can actually apply are read from it; a facet it carries that this search cannot apply is reported back as a URL_FACET warning rather than applied, so a result set carrying those is WIDER than the URL asked for. Explicit params override anything read from the URL.
  - `location` string[] — Filter by job location. Pass human labels (e.g. ['Paris','France']) — server resolves to LinkedIn geo IDs via typeahead. Numeric IDs pass through if you already have them.
  - `datePosted` string — Filter by posting date: 'past-24h'/'past-week'/'past-month' or natural ('last week','this month'). Normalized server-side.
  - `sortBy` string — Sort order: 'relevance' (default) or 'date'/'newest' (most recent first). Normalized server-side.
  - `jobType` string[] — Filter by employment type (OR logic). Pass a natural label (full-time, part-time, contract, temporary, internship, volunteer, other) OR a code F/P/C/T/I/V/O — normalized server-side.
  - `experienceLevel` string[] — Filter by seniority (OR logic). Pass a natural label (internship, entry, associate, mid-senior, director, executive) OR a code 1-6 — normalized server-side.
  - `workplaceType` string[] — Filter by workplace type (OR logic). Pass 'onsite'/'remote'/'hybrid' or a code 1/2/3 — labels are normalized server-side.
  - `company` string[] — Filter by hiring company. Pass company NAMES (e.g. ['Stripe','Datadog']) — they are resolved to LinkedIn company IDs server-side. Numeric IDs also accepted.
  - `industry` string[] — Filter by company industry. Pass industry NAMES (e.g. ['Software Development','Financial Services']) — resolved to LinkedIn industry IDs server-side. Numeric IDs also accepted.
  - `jobFunction` string[] — Filter by job function. Pass function names: Information Technology, Engineering, Consulting, Sales, Marketing, Finance, Business Development, Management, Project Management, Quality Assurance, Analyst, Research, Manufacturing, Other.
  - `easyApply` boolean — When true, only return jobs with LinkedIn Easy Apply (apply without leaving LinkedIn).
  - `under10Applicants` boolean — When true, only return jobs with fewer than 10 applicants — less competition.
  - `inYourNetwork` boolean — When true, only return jobs at companies where the credential holder has a connection.
  - `hasVerifications` boolean — When true, only return jobs from verified job posters.
  - `fairChanceEmployer` boolean — When true, only return jobs from Fair Chance employers.
  - `benefits` string[] — Filter by advertised benefits. Names: Medical insurance, Vision insurance, Dental insurance, 401(k), Pension plan, Paid maternity leave, Paid paternity leave, Commuter benefits, Student loan assistance, Tuition assistance, Disability insurance.
  - `commitments` string[] — Filter by employer commitments. Names: Diversity equity and inclusion, Environmental sustainability, Work-life balance, Social impact, Career growth and learning.
  - `start` integer — Pagination offset (default 0). Use multiples of `count` to page through results.
  - `count` integer — Results per page (default 10, max 50).

## Response `200`

List of LinkedIn job listings matching the search criteria

- object
  - `success` true, required
  - `category` 'jobs', required
  - `items` object[], required
    - `type` 'JOB', required
    - `title` string, required
    - `company` string, nullable, required
    - `companyUrl` string, nullable, required
    - `companyLogo` string, nullable, required
    - `location` string, nullable, required
    - `workplaceType` string, nullable, required
    - `postedAt` string, nullable, required
    - `jobUrl` string, required
    - `listingId` string, required — LinkedIn job listing id — pass to /visit/linkedin/job to fetch the full posting (applicant count, full description, employment status, listed/expire timestamps, inferred benefits, job functions, industries, apply method).
  - `paging` object, required
    - `start` integer, required
    - `count` integer, required
    - `total` integer, required
  - `hasMore` boolean, required
  - `warnings` object[] — Caveats about this result set. Absent or empty means the search ran exactly as asked.
    - `field` string, required — Which part of the request this is about, or `search` when it is about the whole result set.
    - `value` string, required — The value involved: what was dropped, or a code naming the condition.
    - `type` string, required — What kind of caveat this is. SEARCH_QUOTA: LinkedIn capped this account for the month, so the set is TRUNCATED and not the whole market. PARSE_EMPTY: the page answered and no rows could be read, and LinkedIn did not say the market is empty, so treat it as unread rather than as nobody matching. URL_FACET: a pasted search URL carried a filter this search cannot apply, so it ran wider than the one on screen. ENUM: a value was not recognised and that filter was dropped. LANE_FALLBACK: some or all rows came from the public lane, which fills fewer fields. AND_BLOB / OR_OVERFLOW: the keyword shape over-constrained and was retried or flagged. SEARCH_PLAN: the ask was spread across a search budget rather than paged.
    - `hint` string — One sentence a caller can show a person.
  - `creditsUsed` integer, required — Credits consumed by this call. 0 for free endpoints, cached results, duplicates, and for every query that does not touch LinkedIn.
  - `retryAfter` integer, required — Seconds to wait before another call of the same type. 0 means no wait is needed.
  - `_meta` object — Credit balance carried on every response so a caller never has to ask for it separately. Absent when the caller has no connected account.
    - `credits` object, required
      - `current` number, required — Credits spent this period.
      - `limit` number, nullable, required — Period allowance, or null when unlimited.
      - `remaining` number, nullable, required — Allowance left, or null when unlimited.
      - `percentage` number, required — Share of the allowance spent, 0 to 100.
      - `isUnlimited` boolean, required
      - `accountPlan` string, required — The credential's plan.

## Other responses

- `400` — The server cannot or will not process the request due to something that is perceived to be a client error.
- `401` — Although HTTP specifies "unauthorized", this response means "unauthenticated". Authenticate to continue. NOTE: 401 is also returned with code "linkedin_not_connected" when the caller IS authenticated but has no connected LinkedIn account — connect LinkedIn (not re-authenticate) to continue.
- `403` — The client does not have access rights to the content.
- `404` — The server cannot find the requested resource.
- `409` — The request conflicts with the current state of the server.
- `410` — The requested content has been permanently deleted from the server.
- `422` — The request was well-formed but was unable to be followed due to semantic errors.
- `429` — Rate limit exceeded. Read error.retryAfter for the wait time in seconds.
- `500` — The server encountered a situation it does not know how to handle.
- `502` — LinkedIn returned a server error or the proxy connection failed. Retry after a few seconds.
- `503` — Proxy capacity temporarily exceeded. Retry after a few seconds.

---

[API](https://skmtc.net/berea/apis/bereach-api.md) · [All operations](https://skmtc.net/berea/apis/bereach-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/berea/bereach-api/revisions/32391e7c6322/schema)
