# Real-Time LinkedIn Data - LinkedIn Job Search, Company Jobs & Job Details > Fast and reliable LinkedIn job search, company job listings, and full job details in real-time - titles, employers, locations, exact posting dates, salaries, seniority, and more. ## Overview Real-Time LinkedIn Data is a fast and reliable API for job postings from LinkedIn's public jobs surface in real-time. It returns structured JSON via REST. Who is this API for: developers building job boards and aggregators, recruiting and talent-intelligence tools, hiring-trend analytics, and compensation research. What it returns: keyword job search, every open job at one or more companies, and full job details for up to 20 job ids per request - each job carrying the title, employer name and LinkedIn company page, location, the exact posting date, the full description, employment type, seniority level, job function, industries, applicant count, hiring badges, and a structured salary range where the posting states one. Every job object is a superset of the JSearch job contract. Need help integrating? Contact support@openwebninja.com. For high volume / large scale plans, please contact support@openwebninja.com. ## Endpoints ### GET /search - Search Jobs Search LinkedIn job postings. Parameters: - **query** (string, required, e.g. `software engineer`): 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. - location (string): 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`. - page (integer, default: `1`): 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. - num_pages (integer, default: `1`): How many consecutive pages to fetch and concatenate, starting at `page`. Values above 20 are rejected with a 400 rather than silently clamped. - geo_id (string): 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. - country (string, default: `us`): 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 (string, default: `relevance`, allowed: relevance | date): `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. - date_posted (string, default: `all`, allowed: all | today | 3days | week | month): 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. - employment_types (string, allowed: FULLTIME | PARTTIME | CONTRACTOR | INTERN): 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. - seniority_levels (string, allowed: Internship | Entry level | Associate | Mid-Senior level | Director | Executive | Not Applicable): Comma-separated list of LinkedIn's own seniority vocabulary: `Internship`, `Entry level`, `Associate`, `Mid-Senior level`, `Director`, `Executive`, `Not Applicable`. **Enforced locally**, with the same cost and caveats as `employment_types`. Deliberately LinkedIn's vocabulary rather than a years-of-experience enum: there is no defensible mapping from "Mid-Senior level" to a year count. - company_id (string): 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. - remote_jobs_only (boolean, default: `false`): 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. - include_details (boolean, default: `true`): 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. - radius (integer): 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. - cookie (string): Optional LinkedIn cookie string, forwarded verbatim as the `Cookie` header. Never echoed back; `parameters.cookie_status` reports `not_provided`, `applied` or `rejected`. An invalid session is detected, retried once without the cookie, and returns the normal logged-out result, so a bad cookie never errors and never empties a result set. - fields (string): Comma-separated projection over the job object. `job_id` and `job_title` are always included. An unknown field is a 400. Full URL: `https://api.openwebninja.com/realtime-linkedin-data/search` ### GET /job-details - Job Details Full details for up to 20 LinkedIn job postings in one call, fetched concurrently (bounded to 10 in flight). Parameters: - **job_id** (string, required, e.g. `bGlua2VkaW46NDQ1MzY3MDk3Mw`): Comma-separated list of up to 20 `job_id` values as returned by `/search`. Duplicates are collapsed before the cap is applied. The raw numeric LinkedIn posting id (`job_uid`) is also accepted. - country (string, default: `us`): 2-letter country code; selects the proxy exit market. - fields (string): Comma-separated projection over the job object. `job_id` and `job_title` are always included. An unknown field is a 400. - cookie (string): Optional caller-supplied LinkedIn cookie string. Same contract as on `/search`: never echoed, degrades to the logged-out surface with `cookie_status: rejected`, never errors. Full URL: `https://api.openwebninja.com/realtime-linkedin-data/job-details` ### GET /company-jobs - Company Jobs Every open LinkedIn job posting at one or more companies. Parameters: - company_id (string): Comma-separated LinkedIn company ids (`f_C`), up to 10, OR'd together. Take the value from `job_linkedin_company_id` on any job. Either `company_id` or `company` is required; combined, the union is echoed as `parameters.company_ids_resolved`. Ordering is relevance, so a small company paired with a large one may miss page 1. - company (string, e.g. `microsoft`): Comma-separated LinkedIn company vanity slugs or company page URLs, up to 10, resolved live to the ids `company_id` takes. `microsoft`, `/company/microsoft` and a full URL all work. Each slug costs **one extra billed request**. An unknown slug is a 404, and one bad slug fails the whole request. - query (string): Optional free-form keyword filter (LinkedIn's `keywords`) applied **within** the selected companies. Omit it to get the company's whole job list — verified live that `f_C` alone is a valid upstream request. Only one `query` is accepted; a second one is rejected with a 400 rather than silently ignored. - location (string): 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`. - geo_id (string): 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 (integer): 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. - date_posted (string, default: `all`, allowed: all | today | 3days | week | month): 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. - employment_types (string, allowed: FULLTIME | PARTTIME | CONTRACTOR | INTERN): 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. - seniority_levels (string, allowed: Internship | Entry level | Associate | Mid-Senior level | Director | Executive | Not Applicable): Comma-separated list of LinkedIn's own seniority vocabulary: `Internship`, `Entry level`, `Associate`, `Mid-Senior level`, `Director`, `Executive`, `Not Applicable`. **Enforced locally**, with the same cost and caveats as `employment_types`. Deliberately LinkedIn's vocabulary rather than a years-of-experience enum: there is no defensible mapping from "Mid-Senior level" to a year count. - remote_jobs_only (boolean, default: `false`): 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. - sort_by (string, default: `relevance`, allowed: relevance | date): `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. - page (integer, default: `1`): 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. - num_pages (integer, default: `1`): How many consecutive pages to fetch and concatenate, starting at `page`. Values above 20 are rejected with a 400 rather than silently clamped. - include_details (boolean, default: `true`): 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. - country (string, default: `us`): 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. - fields (string): Comma-separated projection over the job object. `job_id` and `job_title` are always included. An unknown field is a 400. - cookie (string): Optional LinkedIn cookie string, forwarded verbatim as the `Cookie` header. Never echoed back; `parameters.cookie_status` reports `not_provided`, `applied` or `rejected`. An invalid session is detected, retried once without the cookie, and returns the normal logged-out result, so a bad cookie never errors and never empties a result set. Full URL: `https://api.openwebninja.com/realtime-linkedin-data/company-jobs` ## Base URL and Authentication - Base URL: `https://api.openwebninja.com/realtime-linkedin-data` - Auth: API key in the `x-api-key` header. Get a key by subscribing (free tier available) at https://app.openwebninja.com/api/realtime-linkedin-data ## Topics linkedin jobs api, linkedin job search api, job postings api, company jobs api, job details api, recruiting api, talent intelligence api, hiring data api, salary data api, jobs data api ## Links - API page: https://www.openwebninja.com/api/real-time-linkedin-data - Get an API key / subscribe: https://app.openwebninja.com/api/realtime-linkedin-data - Pricing & plans: https://app.openwebninja.com/api/realtime-linkedin-data/pricing - Website: https://www.openwebninja.com - OpenAPI spec: https://openwebninja.s3.us-east-1.amazonaws.com/portal/openapi/realtime_linkedin_data.yaml - Support: support@openwebninja.com _Last updated: 2026-09-14_