Built-in tool
LinkedIn job search
Search LinkedIn job postings by title or keyword, filtered by company, location, workplace, employment type, experience, salary and recency.
Endpoint
Parameters
| Name | Type | Required | Note |
|---|---|---|---|
| geoIdstring · optional | string | optional | LinkedIn Geo ID to filter by. Overrides "location" when set. |
| salarystring · optional | string | optional | Filter by minimum base salary (USD). |
| searchstring · optional | string | optional | Job title or keywords to search for, e.g. "product manager". Separate several titles with COMMAS to match any of them — "AI engineer, machine learning engineer" is sent as an OR of the two exact phrases. Each phrase is matched as a phrase, not as loose words, so a two-word title will not pull in every posting that happens to contain both words. Boolean syntax is passed straight through if you prefer to write it yourself: `"AI engineer" AND python`, `"AI engineer" NOT intern`. Note sortBy=date returns newest first regardless of how well a posting matches, so use sortBy=relevance when ranking matters more than recency. Example: |
| sortBystring · optional | string | optional | Sort results by relevance or most recent posting date. |
| locationstring · optional | string | optional | Filter by ONE LinkedIn-recognized location (e.g. "United States" or "London"). A comma-separated list of countries is not supported. For several locations, make separate bounded searches, starting with the user's priority geography. |
| maxPagesnumber · optional | number | optional | Max pages to scrape. Page size depends on the endpoint — read `returned` in the result for the count actually returned, `totalCount` for how many exist and `servableCount` for how many are reachable. Defaults to all pages in Workflows, capped at 100. In chat, returns a preview of ~100 results. |
| companyIdstring · optional | string | optional | Filter by LinkedIn company ID. One ID or several comma-separated. |
| easyApplyboolean · optional | boolean | optional | Only include jobs that support LinkedIn Easy Apply. |
| functionIdstring · optional | string | optional | Filter by LinkedIn job function ID. One ID or several comma-separated. |
| industryIdstring · optional | string | optional | Filter by LinkedIn industry ID. One ID or several comma-separated. |
| postedLimitstring · optional | string | optional | Only include jobs posted within this recency window. |
| workplaceTypearray · optional | array | optional | Filter by workplace type. Choose one or more. |
| employmentTypearray · optional | array | optional | Filter by employment type. Choose one or more. |
| experienceLevelarray · optional | array | optional | Filter by experience level. Choose one or more. Common API spellings such as entry_level and mid_senior are accepted. |
| under10Applicantsboolean · optional | boolean | optional | Only include jobs with fewer than 10 applicants. |
Response schema
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"elements"
],
"properties": {
"hasMore": {
"type": "boolean",
"description": "True only when the provider still had reachable data and this execution stopped early. A managed Agent must treat this as an incomplete batch, never as completion."
},
"elements": {
"type": "array",
"items": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string",
"description": "Direct link to the job listing"
},
"title": {
"type": "string",
"description": "Title of the position"
},
"company": {
"type": "object",
"properties": {
"name": {
"type": [
"string",
"null"
],
"description": "Hiring company name. NULL when the vendor has no company for the posting — measured at roughly 1 row in 25, so guard it rather than assuming it is set."
},
"linkedinUrl": {
"type": [
"string",
"null"
],
"description": "Company page URL. Null when the vendor has no company."
},
"universalName": {
"type": [
"string",
"null"
],
"description": "URL-friendly company name. Null when the vendor has no company."
}
},
"description": "Hiring company. Always an object on output — the three fields are individually null when the vendor omitted the company, so `company.name` is a safe read.",
"additionalProperties": true
},
"location": {
"type": "object",
"properties": {
"linkedinText": {
"type": "string",
"description": "Job location"
}
},
"description": "Location details",
"additionalProperties": true
},
"easyApply": {
"type": "boolean",
"description": "Whether quick apply is available"
},
"postedDate": {
"type": "string",
"description": "When the job was posted"
}
},
"additionalProperties": true
}
},
"nextPage": {
"type": "integer",
"exclusiveMinimum": 0
},
"returned": {
"type": "number",
"description": "How many records this run returned, after any `limit` was applied. ONE EXCEPTION: on a chat preview — where `truncated` is true — this is the count actually FETCHED while `elements` carries only a short sample of them, so the two deliberately disagree. Read `truncated` before comparing this against the array length; in a workflow it is never set and the two always match. Matches the other LinkedIn data tools, whose `meta.returned` is the fetched count on a truncated preview too."
},
"truncated": {
"type": "boolean"
},
"stopReason": {
"enum": [
"cancelled",
"provider-error",
"empty-page-stall",
"caller-limit",
"presentation-preview",
"cursor-stall",
"runtime-page-window"
],
"type": "string"
},
"suggestion": {
"type": "string"
},
"totalCount": {
"type": "number",
"description": "How many records the search MATCHES, per the provider — the grand total, routinely in the millions while the endpoint will only serve about a thousand of them. Do NOT compare it with the row count to decide whether a run was complete, and do not paginate towards it: use `servableCount` for what is actually reachable. Absent when the provider sent no count."
},
"totalPages": {
"type": "number"
},
"pagesScraped": {
"type": "number"
},
"servableCount": {
"type": "number",
"description": "How many records this endpoint will serve across all its pages — the real ceiling on what any number of runs can reach, which the provider caps well below `totalCount` on most search endpoints. Absent when the provider sent no count."
},
"totalElements": {
"type": "number",
"description": "DEPRECATED — despite the name this is the count RETURNED by this run, not a grand total, so it equals your `limit` on a limited run. Kept at that value so existing flows do not change meaning. Use `returned` for this number, `totalCount` for how many records match, or `servableCount` for how many are reachable."
},
"nextPaginationToken": {
"type": "string"
}
},
"additionalProperties": true
}