{"uid":"cap_ewxed4c21GYvWVRKlsJ-7","slug":"agents-openwebninja-com-linkedin-job-search-via-openweb-ninja-cfb74f9d","name":"LinkedIn Job Search via OpenWeb Ninja","description":"Search LinkedIn job postings.\n\n**Pagination** is offset-based via `page` / `num_pages`. Page size is fixed at 10 by LinkedIn. Unlike the Bing jobs source, LinkedIn does not repeat a posting across consecutive pages (measured: 300/300 unique ids over 30 contiguous pages), so `num_pages=N` returns exactly `N x 10` jobs up to the end of the result set.\n\n**`include_details` (default `true`)** issues one extra request per job, bounded to 10 concurrent and capped at 100 jobs per request. It is what fills `job_description`, `job_employment_type(s)`, salary, `job_seniority_level`, `job_function`, `job_industries`, `job_applicants_count` and `job_linkedin_company_id` — none of which exist on a search card. Set it to `false` for a ~3x faster, card-only response.\n\n**Knowing when to stop:** the response is a flat array, matching the JSearch `/search` envelope, so there is no `has_more` flag. A page that returns fewer than `num_pages x 10` jobs is the last one, as is `page` 100.\n\n**Billing:** `Requests` counts one per upstream page of 10 actually fetched. Using `employment_types`, `seniority_levels` or `remote_jobs_only` over-fetches up to 3x the requested pages (capped at 10) to refill the page after local filtering, and those extra pages are billed.","url":"https://agents.openwebninja.com/realtime-linkedin-data/search?utm_source=zero.xyz","method":"GET","headers":{},"bodySchema":{"type":"object","required":["query"],"properties":{"page":{"type":"integer","default":1,"maximum":100,"minimum":1,"description":"1-based page number, 10 jobs per page. Capped at 100 by LinkedIn's 1000-result ceiling; `page + num_pages` may not cross it either."},"query":{"type":"string","example":"software engineer","description":"Free-form job search query (LinkedIn's `keywords`). Only one `query` is accepted; a second one is rejected with a 400 rather than silently ignored."},"fields":{"type":"string","description":"Comma-separated projection over the job object. `job_id` and `job_title` are always included. An unknown field is a 400."},"geo_id":{"type":"string","description":"LinkedIn numeric geo id (e.g. `102571732` = New York City, `103644278` = United States). Required if you want `radius` to take effect. There is no geo-id lookup endpoint in this API yet — take the value from a `geoId=` parameter on a linkedin.com/jobs URL."},"radius":{"type":"integer","minimum":1,"description":"Search radius in **kilometres**, converted to the miles LinkedIn expects. Passed through continuously, not as a coarse menu. **Requires `geo_id`.** LinkedIn ignores `distance` with a free-text location, so `radius` without `geo_id` is rejected with a 400 rather than silently doing nothing."},"country":{"type":"string","default":"us","description":"2-letter country code. Selects the proxy exit market and is the fallback for `job_country` when the posting's own location does not name a country. Geography is driven primarily by `location` / `geo_id`, not by this."},"sort_by":{"enum":["relevance","date"],"type":"string","default":"relevance","description":"`relevance` leaves LinkedIn's own ordering alone. `date` sorts **the jobs in this response** newest-first — it does not re-rank the result set upstream, because LinkedIn ignores its own `sortBy` on the logged-out surface. Combine with a larger `num_pages` for a more meaningful ordering, or with `date_posted` for real freshness control."},"location":{"type":"string","description":"Free-text location. Works internationally with no geo id (\"London, United Kingdom\", \"Berlin, Germany\"). Mutually usable with `geo_id`, but `radius` only applies to `geo_id`."},"num_pages":{"type":"integer","default":1,"maximum":20,"minimum":1,"description":"How many consecutive pages to fetch and concatenate, starting at `page`. Values above 20 are rejected with a 400 rather than silently clamped."},"company_id":{"type":"string","description":"Restrict results to one LinkedIn company, by its numeric company id (LinkedIn's `f_C`). Applied by LinkedIn itself. The id of any employer in a result is returned as `job_linkedin_company_id`, so \"more jobs at this company\" is a single follow-up call."},"date_posted":{"enum":["all","today","3days","week","month"],"type":"string","default":"all","description":"Freshness filter, applied by LinkedIn itself. Maps exactly onto LinkedIn's arbitrary-seconds window (`today` = 24 h, `3days` = 72 h, `week` = 7 d, `month` = 30 d) with no downgrade. `all` applies no filter."},"include_details":{"type":"boolean","default":true,"description":"Fetch each job's detail page to fill the fields a search card cannot carry (description, employment type, salary, seniority, function, industries, applicant count, company id). Set `false` for a card-only response that is roughly 3x faster. Forced on when a local filter is in use."},"employment_types":{"enum":["FULLTIME","PARTTIME","CONTRACTOR","INTERN"],"type":"string","description":"Comma-separated `FULLTIME`, `PARTTIME`, `CONTRACTOR`, `INTERN`. **Filtered by us, not by LinkedIn**, whose own job-type filter is ignored logged out. Forces `include_details` on and over-fetches up to 3x the requested pages (capped at 10), so expect fewer than `num_pages x 10` results and a higher `Requests` charge."},"remote_jobs_only":{"type":"boolean","default":false,"description":"Return only jobs with an explicit remote marker. **Best-effort and low-recall**: LinkedIn's logged-out payload has no workplace-type field, so this matches a textual marker in the location or title. It under-returns and never over-returns, and most queries return few or no results with it set."},"seniority_levels":{"enum":["Internship","Entry level","Associate","Mid-Senior level","Director","Executive","Not Applicable"],"type":"string","description":"Comma-separated list of LinkedIn's own seniority vocabulary: `Internship`, `Entry level`, `Associate`, `Mid-Senior level`, `Director`, `Executive`, `Not Applicable`.\n  **Enforced locally**, with the same cost and caveats as `employment_types`.\n  Deliberately LinkedIn's vocabulary rather than a years-of-experience enum: there is\n  no defensible mapping from \"Mid-Senior level\" to a year count."}}},"responseSchema":{"type":"object","required":["status","request_id","parameters","data"],"properties":{"data":{"type":"array","items":{"type":"object","required":["job_id","job_title","employer_name","employer_logo","employer_website","job_publisher","job_employment_type","job_employment_types","job_apply_link","job_apply_is_direct","apply_options","job_description","job_is_remote","job_posted_at","job_posted_at_timestamp","job_posted_at_datetime_utc","job_location","job_city","job_state","job_country","job_latitude","job_longitude","job_benefits","job_benefits_strings","job_google_link","job_salary","job_salary_string","job_min_salary","job_max_salary","job_salary_period","job_highlights","job_onet_soc","job_onet_job_zone","employer_reviews","job_uid","employer_linkedin_url","job_linkedin_company_id","job_seniority_level","job_function","job_industries","job_applicants_count","job_applicants_label","job_salary_currency","job_posted_at_date","job_posted_at_linkedin_label","job_linkedin_badges","job_position"],"properties":{"job_id":{"type":"string","example":"bGlua2VkaW46NDQ1MzY3MDk3Mw","description":"Opaque public id: `base64url(\"linkedin:\" + <posting id>)`. Pass it back to `/job-details`. Stable for the life of the posting."},"job_uid":{"type":"string","example":"4453670973","description":"The raw numeric LinkedIn posting id. Permanent, and accepted directly by `/job-details`."},"job_city":{"type":"string","example":"New York","nullable":true},"job_state":{"type":"string","example":"New York","nullable":true,"description":"US 2-letter codes are expanded to the full state name, matching JSearch."},"job_title":{"type":"string","example":"Software Engineer III (Java/AWS)"},"job_salary":{"type":"number","example":null,"nullable":true,"description":"Set only when a posting states a single figure rather than a range; a range populates `job_min_salary` / `job_max_salary` instead."},"job_country":{"type":"string","example":"US","nullable":true,"description":"2-letter code derived from the posting's own location where it names a country or a US state, falling back to the requested `country`. A US state code always wins over the requested market."},"job_benefits":{"type":"array","items":{"type":"string"},"example":null,"nullable":true,"description":"Always `null`; LinkedIn does not publish a normalized benefits list."},"job_function":{"type":"string","example":"Engineering and Information Technology","nullable":true,"description":"LinkedIn's job-function label. Detail surface only."},"job_latitude":{"type":"number","format":"float","example":null,"nullable":true,"description":"Always `null`; not published on this surface."},"job_location":{"type":"string","example":"New York, NY","nullable":true,"description":"LinkedIn's location string, verbatim. Three shapes occur: `\"New York, NY\"` (US, no country suffix), `\"London, England, United Kingdom\"` (international) and `\"New York City Metropolitan Area\"` (metro, no comma)."},"job_onet_soc":{"type":"string","example":null,"nullable":true,"description":"Always `null`; not published."},"job_position":{"type":"integer","example":0,"nullable":true,"description":"Absolute 0-based rank within the result set, continuing across pages (page 2 starts at 10). **Search surface only** — always `null` on `/job-details`."},"apply_options":{"type":"array","items":{"type":"object","required":["apply_link","is_direct","publisher"],"properties":{"is_direct":{"enum":[false],"type":"boolean","example":false},"publisher":{"enum":["LinkedIn"],"type":"string","example":"LinkedIn"},"apply_link":{"type":"string","format":"uri","example":"https://www.linkedin.com/jobs/view/software-engineer-iii-java-aws-at-jpmorganchase-4453670973"}},"description":"Always exactly one entry on this source, describing the LinkedIn posting page. LinkedIn's logged-out surface does not expose the employer's own application destination, so there is never a second option and `is_direct` is never `true`."}},"employer_logo":{"type":"string","format":"uri","example":"https://media.licdn.com/dms/image/v2/D4E0BAQGxpntCyRgsuA/company-logo_100_100/0/1718711710850/jpmorganchase_logo","nullable":true,"description":"LinkedIn CDN company logo. 50/50 on the measured sample."},"employer_name":{"type":"string","example":"JPMorganChase"},"job_is_remote":{"type":"boolean","example":null,"nullable":true,"description":"`true` or `null`, **never `false`**. LinkedIn's logged-out payload has no workplace-type field, so `true` is emitted only when an explicit textual remote marker is present and `null` means \"LinkedIn did not say\", not \"not remote\". 0/50 on the measured sample."},"job_longitude":{"type":"number","format":"float","example":null,"nullable":true,"description":"Always `null`; not published on this surface."},"job_posted_at":{"type":"string","example":"8 days ago","nullable":true,"description":"Relative posting age in JSearch's vocabulary: `today`, `1 day ago`, `N days ago` up to 30, then `N month(s) ago`. LinkedIn's own badge (\"1 week ago\", \"Just now\") is never emitted here — it is preserved verbatim as `job_posted_at_linkedin_label`."},"job_publisher":{"enum":["LinkedIn"],"type":"string","example":"LinkedIn","description":"Always `LinkedIn` — the guest surface never names the originating job board."},"job_apply_link":{"type":"string","format":"uri","example":"https://www.linkedin.com/jobs/view/software-engineer-iii-java-aws-at-jpmorganchase-4453670973","nullable":true,"description":"The public LinkedIn posting URL, with LinkedIn's per-render tracking parameters stripped. **Not** the employer's ATS URL — that is behind a login wall and is not present in the guest payload. International postings use a country subdomain (`uk.linkedin.com`)."},"job_highlights":{"type":"object","example":{},"description":"Always `{}`. LinkedIn ships one prose blob with no qualifications / responsibilities / benefits split.","additionalProperties":{"type":"array","items":{"type":"string"}}},"job_industries":{"type":"array","items":{"type":"string"},"example":["Financial Services"],"nullable":true,"description":"LinkedIn's industry labels, comma-split. Individual labels can themselves contain \"and\" (\"IT Services and IT Consulting\") and are not split further. Detail surface only."},"job_max_salary":{"type":"number","example":185000,"nullable":true},"job_min_salary":{"type":"number","example":137750,"nullable":true},"job_description":{"type":"string","nullable":true,"description":"Full posting text, HTML stripped to plain text with paragraph breaks preserved. Typically 5 000–10 000 characters. Detail surface only — `null` when `include_details=false`."},"job_google_link":{"type":"string","format":"uri","example":null,"nullable":true,"description":"Always `null`; Google-specific."},"employer_reviews":{"type":"array","items":{"type":"object"},"example":null,"nullable":true,"description":"Always `null`; not published."},"employer_website":{"type":"string","format":"uri","example":null,"nullable":true,"description":"Always `null`. LinkedIn only ever exposes the employer's LinkedIn company page, which is returned as `employer_linkedin_url` instead of being passed off as a website."},"job_onet_job_zone":{"type":"string","example":null,"nullable":true,"description":"Always `null`; not published."},"job_salary_period":{"enum":["HOUR","DAY","WEEK","MONTH","YEAR",null],"type":"string","example":"YEAR","nullable":true},"job_salary_string":{"type":"string","example":"$137,750.00/yr - $185,000.00/yr","nullable":true,"description":"LinkedIn's compensation string, verbatim. Present on ~24% of postings (12/50 measured); detail surface only."},"job_posted_at_date":{"type":"string","format":"date","example":"2026-09-03","nullable":true,"description":"The exact `datetime` attribute LinkedIn publishes on a search card. **Search surface only** — always `null` on `/job-details`, which carries no date element."},"job_apply_is_direct":{"enum":[false],"type":"boolean","example":false,"description":"Always `false`; the employer's own application destination is not visible."},"job_employment_type":{"type":"string","example":"Full-time","nullable":true,"description":"LinkedIn's own label (\"Full-time\"). Detail surface only — `null` when `include_details=false`."},"job_linkedin_badges":{"type":"array","items":{"type":"string"},"example":["Actively Hiring"],"nullable":true,"description":"LinkedIn engagement badges (\"Actively Hiring\", \"Be an early applicant\"). Search surface only; 37/50 on the measured sample."},"job_salary_currency":{"type":"string","example":"USD","nullable":true,"description":"ISO 4217 code inferred from the salary string's symbol or code."},"job_seniority_level":{"enum":["Internship","Entry level","Associate","Mid-Senior level","Director","Executive","Not Applicable",null],"type":"string","example":"Not Applicable","nullable":true,"description":"LinkedIn's own seniority vocabulary. Detail surface only."},"job_applicants_count":{"type":"integer","example":193,"nullable":true,"description":"Applicant count as an integer. Present on ~52% of postings (26/50 measured). When LinkedIn caps the figure (\"Over 200 applicants\") this is the capped number and `job_applicants_label` carries the exact wording. Detail surface only."},"job_applicants_label":{"type":"string","example":"193 applicants","nullable":true,"description":"LinkedIn's applicant caption, verbatim."},"job_benefits_strings":{"type":"array","items":{"type":"string"},"example":null,"nullable":true,"description":"Always `null`. LinkedIn's only chips are engagement badges (\"Actively Hiring\"), which are not benefits; they are returned as `job_linkedin_badges` instead."},"job_employment_types":{"type":"array","items":{"enum":["FULLTIME","PARTTIME","CONTRACTOR","INTERN","VOLUNTEER","OTHER"],"type":"string"},"example":["FULLTIME"],"description":"Normalized enum form of `job_employment_type`. Empty when `include_details=false`."},"employer_linkedin_url":{"type":"string","format":"uri","example":"https://www.linkedin.com/company/jpmorganchase","nullable":true,"description":"The employer's LinkedIn company page, tracking parameters stripped."},"job_linkedin_company_id":{"type":"string","example":"1068","nullable":true,"description":"The employer's numeric LinkedIn company id. Feed it back as `company_id` on `/search` to get more jobs at the same company. Detail surface only."},"job_posted_at_timestamp":{"type":"integer","example":1788393600,"nullable":true,"description":"Unix epoch seconds at **midnight UTC of the posting date**. LinkedIn publishes a date, not a time. On `/job-details` this is derived from the relative label and can be off by a few days; `/search` carries the exact date."},"job_posted_at_datetime_utc":{"type":"string","format":"date-time","example":"2026-09-03T00:00:00.000Z","nullable":true},"job_posted_at_linkedin_label":{"type":"string","example":"1 week ago","nullable":true,"description":"LinkedIn's own relative badge, verbatim."}},"description":"A superset of the 35-key JSearch `/search` job object. All 35 keys are always present, as are the 12 LinkedIn-only extras; a field LinkedIn cannot supply is `null`, `[]` or `{}`."}},"status":{"enum":["OK"],"type":"string"},"parameters":{"type":"object","required":["query","page","num_pages"],"properties":{"page":{"type":"integer","example":1},"query":{"type":"string","example":"software engineer"},"fields":{"type":"string","example":"job_title,employer_name"},"geo_id":{"type":"string","example":"102571732"},"radius":{"type":"integer","example":40},"country":{"type":"string","example":"us"},"sort_by":{"type":"string","example":"date"},"location":{"type":"string","example":"New York, United States"},"num_pages":{"type":"integer","example":1},"company_id":{"type":"string","example":"1441"},"date_posted":{"type":"string","example":"week"},"include_details":{"type":"string","example":"false"},"employment_types":{"type":"string","example":"FULLTIME"},"remote_jobs_only":{"type":"string","example":"true"},"seniority_levels":{"type":"string","example":"Mid-Senior level"}},"description":"Echo of the parameters as the caller sent them, before any internal transformation. Only the parameters actually supplied are present."},"request_id":{"type":"string"}}},"example":null,"exampleRequest":null,"tags":[],"displayCostAmount":"unknown","displayCostAsset":"USD","priceDynamic":true,"priceHint":null,"priceStatus":"unprobed","priceSource":"registry","requiresHandshake":false,"reviewCount":0,"rating":{"score":"0.00","successRate":"0.00","reviews":0,"stars":null,"state":"unrated"},"availabilityStatus":"unknown","priceObserved":null,"sessionDeposit":null,"pricing":{"kind":"unknown","summary":"price unknown","primary":{"kind":"dynamic","protocol":"mpp","network":"tempo","amountUsd":null,"per":"call","confidence":"unknown"},"accepted":[{"kind":"dynamic","protocol":"mpp","network":"tempo","amountUsd":null,"per":"call","confidence":"unknown"}]},"paymentMethods":[{"uid":"pm_q8bYX1m2il3I85tFSeocJ","protocol":"mpp","methodType":"crypto","chain":"tempo","mode":"charge","costAmount":"unknown","costPer":"request","priority":0,"asset":null,"unit":"request","depositMicros":null,"planRef":null}],"brandName":"agents.openwebninja.com","brandSlug":"agents-openwebninja-com-x402","brandBaseUrl":"https://agents.openwebninja.com","brandDocsUrl":null,"whatItDoes":"Search LinkedIn job postings by keyword, location, and filters, returning paginated structured job data including descriptions, salary, and applicant counts.","exampleAgentPrompt":"Search LinkedIn for senior software engineer jobs in New York City — show me up to 20 listings posted in the past week, sorted by date, and include full job descriptions and salary info where available.","exampleUseCases":[{"title":"Job market research for career pivot","prompt":"Find me the 20 most recent data scientist job postings on LinkedIn in the United States — I want to see descriptions, salary ranges, seniority levels, and how many applicants each has so I can gauge competition."},{"title":"Remote job hunt for a developer","prompt":"Search LinkedIn for remote full-time Python developer jobs posted in the last 24 hours — give me the first 2 pages of results with descriptions and apply links."},{"title":"Recruiting pipeline sourcing","prompt":"I'm hiring for a mid-level product manager role in London — can you pull the first page of LinkedIn job postings matching 'product manager' with a geo radius of 50 km around London and sort them by date?"}],"resultDescription":"A flat JSON array of job objects (up to num_pages × 10 per request) each containing job_id, job_title, employer_name, employer_logo, job_location, job_city, job_state, job_country, job_apply_link, job_posted_at, job_posted_at_datetime_utc, and (when include_details=true) job_description, job_employment_type, job_min_salary, job_max_salary, job_salary_currency, job_seniority_level, job_function, job_industries, job_applicants_count, and job_linkedin_company_id.","failureModes":["400 if query parameter is missing or duplicated","400 if radius is provided without geo_id","400 if an unknown field name is passed in the fields projection","400 if page + num_pages would exceed LinkedIn's 1000-result (page 100) ceiling","Fewer results than requested if the result set is exhausted — no has_more flag; detect by count < num_pages × 10","Slower response (~3x) when include_details=true due to per-job detail fetches","Over-billing when employment_types, seniority_levels, or remote_jobs_only filters trigger up to 3x page over-fetch"],"whenToPreferThis":"Choose this endpoint when you need structured LinkedIn job data — especially rich fields like job descriptions, salary, seniority level, applicant counts, and employment type — in a JSearch-compatible envelope. Prefer it over generic job search APIs when LinkedIn-specific data quality (unique posting IDs, no cross-page duplicates, LinkedIn company IDs) matters. Use include_details=false for fast card-only scanning and include_details=true when you need full job details for summarization or matching.","instructions":null,"reviewSummary":null,"reviewSummaryHighlights":null,"reviewSummaryConcerns":null,"reviewSummaryGeneratedAt":null,"activationCount":0,"lastUsedAt":null,"lastSuccessfullyRanAt":null,"lastHealthCheckAt":"2026-10-14T00:37:00.797Z","isFirstParty":false,"canonicalSlug":"agents-openwebninja-com-linkedin-job-search-via-openweb-ninja-cfb74f9d"}