Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the LinkedIn Jobs API page →
Jobs & Hiring

LinkedIn Jobs API & Scraper

The LinkedIn Jobs API returns job postings, company and location data as clean JSON.

6 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

The primary jobs/search endpoint returns jobs with id, URL, title, company (name, URL, slug), location, workplace type, posted date, salary and seniority, and you can pull a jobs/detail, a company, jobs by company, similar jobs and a location search. It is built for recruiting tools, labor-market analysts and sales intelligence that need LinkedIn job data without a login or a scraper. One ReefAPI key, one shared credit pool, the standard envelope.

Reference

Search filters, their accepted values, and what a bad value does

Every filter below is an enum with a fixed vocabulary, and the two failure modes are not the same. keywords is validated and a missing or empty value is rejected outright. The filters are not: a value outside the list is silently ignored, so a typo in date_posted returns unfiltered results that look correct. Check the values here before you ship a query builder.

ParameterAccepted valuesBad value
keywordsfree text (title, skill, keyword) — requiredrejected
date_posted24h · week · monthignored (query runs unfiltered)
experienceinternship · entry · associate · mid_senior · director · executiveignored
job_typefulltime · parttime · contract · temporary · internship · volunteer · otherignored
workplaceonsite · remote · hybridignored
geoIdnumeric LinkedIn id — get it from locations/searchignored
companycompany slug, full company URL, or numeric LinkedIn company idignored
max_results1–1000, default 50rejected

1000 is LinkedIn's own ceiling for a single guest query, not a plan limit — past it the result set stops regardless of paging. To go deeper, split the query by location or date window rather than paging further.

Live example

Real request and response JSON

Captured from the indexed primary action, jobs/search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/linkedin-jobs/v1/jobs/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "keywords": "python developer",
    "location": "United States",
    "max_results": 25
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "linkedin-jobs",
    "endpoint": "jobs/search",
    "mode": "live",
    "latency_ms": 3804.4,
    "record_count": 25,
    "bytes": 119505,
    "cache_hit": false,
    "completeness_pct": 100,
    "stop_reason": "max_results",
    "requests": 4,
    "included_detail": false,
    "included_company": false,
    "pagination": {
      "has_more": true,
      "next_cursor": "25"
    }
  },
  "data": {
    "jobs": [
      {
        "job_id": "[redacted-phone]",
        "job_url": "https://www.linkedin.com/jobs/view/python-developer-at-open-systems-technologies-[redacted-phone]",
        "title": "Python Developer",
        "company": {
          "name": "[redacted-name]",
          "url": "https://www.linkedin.com/company/open-systems-technologies",
          "slug": "open-systems-technologies",
          "logo": "https://media.licdn.com/dms/image/v2/C4D0BAQHdzu0CEs024A/company-logo_100_100/company-logo_100_100/0/[redacted-phone]/open_systems_technologies_logo?e=[redacted-phone]&v=beta&t=MI3Ojj1GBjmbiIhFGIQ-sgGOIMaYzzgo5636Y351nyc",
          "specialties": []
        },
        "location": "New York, NY",
        "posted_date": "[redacted-phone]",
        "posted_relative": "4 days ago",
        "benefits": [
          "Actively Hiring"
        ],
        "search_query": "python developer",
        "search_location": "United States"
      },
      {
        "job_id": "[redacted-phone]",
        "job_url": "https://www.linkedin.com/jobs/view/middle-backend-developer-at-aml-crypto-[redacted-phone]",
        "title": "Middle Backend Developer",
        "company": {
          "name": "[redacted-name]",
          "url": "https://www.linkedin.com/company/aml-crypto",
          "slug": "aml-crypto",
          "logo": "https://media.licdn.com/dms/image/v2/C4E0BAQHWGUfdl-4noA/company-logo_100_100/company-logo_100_100/0/[redacted-phone]/aml_crypto_logo?e=[redacted-phone]&v=beta&t=Te898WQQzD0Ao6LoVt193x89CNK5Br7Omm7LSpqyw-I",
          "specialties": []
        },
        "location": "Marion County, IN",
        "posted_date": "[redacted-phone]",
        "posted_relative": "1 day ago",
        "benefits": [
          "Be an early applicant"
        ],
        "search_query": "python developer",
        "search_location": "United States"
      },
      {
        "job_id": "[redacted-phone]",
        "job_url": "https://www.linkedin.com/jobs/view/python-developer-at-aci-infotech-[redacted-phone]",
        "title": "Python Developer",
        "company": {
          "name": "[redacted-name]",
          "url": "https://www.linkedin.com/company/aciinfotech",
          "slug": "aciinfotech",
          "logo": "https://media.licdn.com/dms/image/v2/C560BAQF2q-kc4T8Tow/company-logo_100_100/company-logo_100_100/0/[redacted-phone]/aci_infotech_logo?e=[redacted-phone]&v=beta&t=SmlWXghpJi6ZlGJcUrot9cOPK5cxexK03Zk1ux4Vrqs",
          "specialties": []
        },
        "location": "New York, NY",
        "posted_date": "[redacted-phone]",
        "posted_relative": "2 months ago",
        "benefits": [],
        "search_query": "python developer",
        "search_location": "United States"
      }
    ],
    "count": 25,
    "pages_fetched": 4,
    "stop_reason": "max_results"
  }
}
Actions

What the LinkedIn Jobs API does

ActionDescriptionConcrete use caseKey params
jobs/searchSearch public LinkedIn job postings by keywords, with optional location and date/seniority/job-type/workplace filters.Recruiting teams call jobs/search to search public LinkedIn job postings by keywords, with optional location and date/seniority/jo….keywords, location, max_results, date_posted, experience, ...
jobs/detailFull posting for one job: description, employment type, seniority, salary, applicant count.Labor-market analysts call jobs/detail to get full posting for one job.job_id, include_company
companyCompany profile: description, website, employee count, industry, HQ, founded year, specialties.Job boards call company to get company profile.company
jobs/by-companyAll public job postings at a specific company — pass a company slug, URL or numeric id; optionally narrow with the same keyword/location/date/seniority/job-type/workplace filters as jobs/search.Sales intelligence teams call jobs/by-company to get all public job postings at a specific company.company, keywords, location, max_results, date_posted, ...
locations/searchLocation typeahead → resolve a place name (city, region, metro area, country) to the LinkedIn numeric geoId used by the `geoId` search param for precise geo-pinned searches.Recruiting teams call locations/search to get location typeahead → resolve a place name (city, region, metro area, country) to the LinkedIn….query
jobs/similarRelated job postings for a given job_id. LinkedIn's guest surface exposes no direct similar-jobs feed, so results are a keyword+location re-search seeded from the source job's own title (the seed job is excluded).Labor-market analysts call jobs/similar to get related job postings for a given job_id.job_id, keywords, location, max_results, include_detail, ...
Code samples

Call jobs/search from your stack

curl -X POST https://api.reefapi.com/linkedin-jobs/v1/jobs/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"keywords":"python developer","location":"United States","max_results":25}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.linkedin-jobs.jobs/search with {"keywords":"python developer","location":"United States","max_results":25}.
Use cases

Who uses this API and why

  • Recruiting tools call jobs/search to track open roles by title, location and workplace type.
  • Sales-intelligence teams use jobs/by-company to spot hiring and expansion signals at accounts.
  • Labor-market analysts use seniority and posted_date to measure demand trends over time.
FAQ

Questions developers ask before integrating

Which fields only appear when I pass include_detail?

A plain jobs/search result carries job_id, job_url, title, company (name, url, slug, logo), location, posted_date, posted_relative. Everything a hiring analyst actually wants — description_text, description_html, salary, seniority_level, employment_type, job_function, industries, applicant_count_text, apply_url, easy_apply, job_state — only arrives with include_detail set. The cost is one extra request per job: a 2-job search with include_detail measured 3 requests, so pull the list first and hydrate the rows you care about.

Why is salary missing on some LinkedIn jobs even with include_detail?

Because LinkedIn did not publish one. In a measured two-job sample one posting returned salary as an object with text, min_value, max_value and currency; the other had no salary key at all. Treat the field as absent-or-object, never as an empty string, and never infer a range from the seniority label. The same applies to benefits, which comes back as an empty array far more often than a populated one.

What is a LinkedIn geoId, and why does one city name return several?

geoId is LinkedIn's internal numeric id for a place, and it is the only way to pin a search to exactly the geography you mean. locations/search on 'Berlin' returned 10 of them: Berlin, Berlin, Germany (106967730), Berlin Metropolitan Area (90009712), Stadt Berlin (101283667), plus Berlin in Connecticut, Maryland and New Jersey. The free-text location parameter picks one of those for you and will sometimes pick a different one than you expect — resolve the geoId once and reuse it.

What does workplace_type_source mean on a job?

It tells you where the Remote/Hybrid/On-site label came from. A value of facet means the job inherited the label from the filter you searched with, not from a statement in the posting itself. That distinction matters if you are counting remote roles: filtering on workplace=remote and then counting workplace_type=Remote is circular. Only rows whose source is the posting are independent evidence.

Are seniority_level and employment_type reliable?

They are LinkedIn's own labels, copied through unchanged, and employers fill them in carelessly. A measured example: a Cargill posting titled 'Data Engineer' came back with seniority_level 'Not Applicable' and employment_type 'Internship'. We do not correct these — if we normalized them you would have no way to tell a real label from our guess. Filter on them, but expect noise at the tails.

How do I page through more than one screen of results?

meta.pagination returns has_more and next_cursor; pass next_cursor back as cursor to continue. record_count and stop_reason tell you why a page ended — stop_reason 'max_results' means you hit your own cap, not the end of the inventory. The ceiling on any single query is roughly 1000 postings.

Can I get every open role at one company?

Use jobs/by-company with a company slug (the part after linkedin.com/company/), the full company URL or the numeric id. It returns the same job shape plus the resolved company_id, and accepts the same keyword, location, date and seniority filters if you want to narrow within the employer. The separate company action returns the employer profile: description, website, employee_count, industry, headquarters, founded and specialties.

What is the LinkedIn Jobs API?

LinkedIn Jobs API is a ReefAPI endpoint group for public job listings and details. It returns live JSON through POST requests under /linkedin-jobs/v1.

Is the LinkedIn Jobs API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. LinkedIn Jobs calls use the same shared credit balance as every other ReefAPI engine.

Do I need a LinkedIn Jobs login or account?

No login to LinkedIn Jobs is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the LinkedIn Jobs data?

The page example is captured from a live jobs/search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the LinkedIn Jobs API use?

LinkedIn Jobs actions currently cost 1-2 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

Can I call LinkedIn Jobs from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call linkedin-jobs actions with the same key, credit pool and JSON envelope used by normal REST requests.

Is the LinkedIn Jobs API a LinkedIn Jobs scraper?

It is the managed alternative to a DIY LinkedIn Jobs scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same public job listings and details back as clean JSON.

docs / linkedin-jobs

LinkedIn Jobs

Public job listings and details.

base /linkedin-jobs/v16 endpoints
post/linkedin-jobs/v1/jobs/search1 credit

Search public LinkedIn job postings by keywords, with optional location and date/seniority/job-type/workplace filters.

ParameterAllowed / rangeDescription
keywordsrequiredWhat job to search for — title, skill or keyword.
locationoptionalCountry, region or city to search in (free text, e.g. 'United States', 'Berlin').
max_results = 50optional1–1000How many jobs to return (1–1000). LinkedIn's guest API caps any single query at ~1000; use filters to narrow.
date_postedoptional24h · week · monthOnly jobs posted within this window (raw f_TPR codes like r86400 also accepted).
experienceoptionalinternship · entry · associate · mid_senior · director · executiveOnly jobs at this experience level (raw f_E codes 1–6 also accepted).
job_typeoptionalfulltime · parttime · contract · temporary · internship · volunteer · otherOnly jobs of this employment type (raw f_JT codes F/P/C/T/I/V/O also accepted).
workplaceoptionalonsite · remote · hybridOnly jobs with this workplace arrangement (raw f_WT codes 1/2/3 also accepted).
companyoptionalOnly jobs at this employer — a company slug (the part after linkedin.com/company/), the full company URL, or its numeric LinkedIn company id (maps to the f_C facet; slugs are resolved automatically). For a pure company browse use the jobs/by-company action.
industryoptionalOnly jobs in this LinkedIn industry — raw f_I industry code(s), comma-separated for several (e.g. '4' = software).
job_functionoptionalOnly jobs in this job function — raw f_F function code(s) (e.g. 'it', 'eng', 'sale'), comma-separated.
salary_minoptional0–Only jobs paying at least this annual salary (USD). Mapped to LinkedIn's nearest pay band: 40k/60k/80k/100k/120k/140k+.
salary_bandoptional1 · 2 · 3 · 4 · 5 · 6Advanced: LinkedIn pay-band code directly (raw f_SB2). Prefer salary_min.
include_detail = falseoptionalFetch the full posting per job (description, employment type, seniority, salary) — slower.
include_company = falseoptionalAlso fetch the employer's company profile (industry, size, HQ) per job — slower.
page = 1optional1–Page number (easy paging: 1, 2, 3… — page size = max_results).
cursoroptionalNext page: pass the previous response's meta.pagination.next_cursor (the 'Next' button does this automatically).
startoptional0–999Advanced: raw result offset (10 jobs/page, must stay < 1000). Prefer `page` or `cursor`.
geoIdoptionalAdvanced: LinkedIn numeric geo ID — pins the search to an exact region (more precise than free-text location).
filtersoptionalAdvanced: the same facets as one object {date_posted, experience, job_type, workplace} — explicit keys here win over the flat params.
detail_concurrency = 4optional1–8Advanced: parallel detail fetches when include_detail=true (1–8).
Try in playground →
post/linkedin-jobs/v1/jobs/detail1 credit

Full posting for one job: description, employment type, seniority, salary, applicant count.

ParameterAllowed / rangeDescription
job_idrequiredLinkedIn job ID — the number in the job URL (linkedin.com/jobs/view/<job_id>) or `job_id` from jobs/search.
include_company = falseoptionalAlso fetch the employer's company profile (industry, size, HQ) per job — slower.
Try in playground →
post/linkedin-jobs/v1/company2 credits

Company profile: description, website, employee count, industry, HQ, founded year, specialties.

ParameterAllowed / rangeDescription
companyrequiredCompany slug (the part after linkedin.com/company/) or the full LinkedIn company URL.
Try in playground →
post/linkedin-jobs/v1/jobs/by-company1 credit

All public job postings at a specific company — pass a company slug, URL or numeric id; optionally narrow with the same keyword/location/date/seniority/job-type/workplace filters as jobs/search.

ParameterAllowed / rangeDescription
companyrequiredThe employer — a company slug (the part after linkedin.com/company/), the full company URL, or its numeric LinkedIn company id. Slugs/URLs are resolved to the company id automatically.
keywordsoptionalOptional: also filter the company's jobs by title/skill/keyword (leave empty to browse all of the company's jobs).
locationoptionalOptional: country, region or city to narrow to.
max_results = 50optional1–1000How many jobs to return (1–1000).
page = 1optional1–Page number (easy paging: 1, 2, 3… — page size = max_results).
cursoroptionalNext page: pass the previous response's meta.pagination.next_cursor (the 'Next' button does this automatically).
Try in playground →
post/linkedin-jobs/v1/locations/search1 credit

Location typeahead → resolve a place name (city, region, metro area, country) to the LinkedIn numeric geoId used by the `geoId` search param for precise geo-pinned searches.

ParameterAllowed / rangeDescription
queryrequiredPlace name to look up — city, region, metro area or country (e.g. 'San Francisco', 'Greater London').
limit = 10optional1–25Max suggestions to return (1–25).
Try in playground →
post/linkedin-jobs/v1/jobs/similar1 credit

Related job postings for a given job_id. LinkedIn's guest surface exposes no direct similar-jobs feed, so results are a keyword+location re-search seeded from the source job's own title (the seed job is excluded).

ParameterAllowed / rangeDescription
job_idrequiredLinkedIn job ID to find similar postings for — the number in the job URL or `job_id` from jobs/search.
keywordsoptionalOptional: override the re-search keywords (defaults to the seed job's title).
locationoptionalOptional: override the re-search location (defaults to the seed job's location).
max_results = 25optional1–100How many similar jobs to return (1–100).
Try in playground →