Jobs & Hiring

How do you scrape LinkedIn jobs via API without getting blocked?

To scrape LinkedIn job postings without logins or brittle HTML parsers, call ReefAPI's LinkedIn Jobs search endpoint with keywords and a location and read the returned roles as structured JSON.

LinkedIn Jobs engineLive JSON4 steps1,000 free credits

This guide demonstrates the real LinkedIn Jobs API engine with a captured response from . The example is only published because the engine passed the SEO snapshot gate.

Use case

Recruiting intelligence, labor-market tracking, job-board aggregation and hiring-trend analysis.

Step by step

Call the live endpoint

  1. 1

    Choose keywords and a location

    Start with a specific role and region (for example "python developer" in the United States) so the response stays relevant.

  2. 2

    Call linkedin-jobs/v1/jobs/search

    Send the JSON params from the captured example with your ReefAPI key in the x-api-key header.

  3. 3

    Normalize jobs from data

    Store job id, title, company, location, posting date and the canonical job URL for your workflow.

  4. 4

    Use meta for monitoring

    Check meta.record_count, latency_ms and error before charging downstream alerts or enrichment.

Code

Copy the request

These snippets use the captured request params for linkedin-jobs/v1/jobs/search.

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}.
Real response

Captured output from ReefAPI

Captured on UTC. The response below is the committed snapshot, including the API envelope and metadata.

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": 3370.2,
    "record_count": 25,
    "bytes": 103606,
    "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"
    },
    "attempts": 1
  },
  "data": {
    "jobs": [
      {
        "job_id": "[redacted-phone]",
        "job_url": "https://www.linkedin.com/jobs/view/python-developer-l3-at-wipro-[redacted-phone]",
        "title": "PYTHON DEVELOPER L3",
        "company": {
          "name": "Wipro",
          "url": "https://in.linkedin.com/company/wipro",
          "slug": "wipro",
          "logo": "https://media.licdn.com/dms/image/v2/D4E0BAQFTFdGNe-V9tw/company-logo_100_100/B4EZpFMu4WIQAQ-/0/[redacted-phone]?e=[redacted-phone]&v=beta&t=ou5vQOksNDH68avQwV6fPk4vX3nYe_Vc_K1zSfm9PFg",
          "description": null,
          "website": null,
          "employee_count": null,
          "company_size": null,
          "industry": null,
          "headquarters": null,
          "founded": null,
          "organization_type": null,
          "specialties": []
        },
        "location": "Akron, NY",
        "workplace_type": null,
        "workplace_type_source": null,
        "posted_date": "[redacted-phone]",
        "posted_relative": "1 week ago",
        "description_html": null,
        "description_text": null,
        "salary": null,
        "seniority_level": null,
        "employment_type": null,
        "job_function": null,
        "industries": null,
        "applicant_count_text": null,
        "applicant_count_min": null,
        "apply_url": null,
        "easy_apply": null,
        "benefits": [],
        "job_state": null,
        "search_query": "python developer",
        "search_location": "United States"
      },
      {
        "job_id": "[redacted-phone]",
        "job_url": "https://www.linkedin.com/jobs/view/python-developer-at-bcforward-[redacted-phone]",
        "title": "Python Developer",
        "company": {
          "name": "BCforward",
          "url": "https://www.linkedin.com/company/bcforward",
          "slug": "bcforward",
          "logo": "https://media.licdn.com/dms/image/v2/D4E0BAQGIlzwwOXZFkg/company-logo_100_100/B4EZ5P5G4OGUAM-/0/[redacted-phone]?e=[redacted-phone]&v=beta&t=NQd7JzLO9ivUj0H8io9v4wlJxAM1PXIU5kk37JaXWUE",
          "description": null,
          "website": null,
          "employee_count": null,
          "company_size": null,
          "industry": null,
          "headquarters": null,
          "founded": null,
          "organization_type": null,
          "specialties": []
        },
        "location": "Phoenix, AZ",
        "workplace_type": null,
        "workplace_type_source": null,
        "posted_date": "[redacted-phone]",
        "posted_relative": "1 week ago",
        "description_html": null,
        "description_text": null,
        "salary": null,
        "seniority_level": null,
        "employment_type": null,
        "job_function": null,
        "industries": null,
        "applicant_count_text": null,
        "applicant_count_min": null,
        "apply_url": null,
        "easy_apply": null,
        "benefits": [],
        "job_state": null,
        "search_query": "python developer",
        "search_location": "United States"
      },
      {
        "job_id": "[redacted-phone]",
        "job_url": "https://www.linkedin.com/jobs/view/python-developer-at-genpact-[redacted-phone]",
        "title": "Python Developer",
        "company": {
          "name": "Genpact",
          "url": "https://www.linkedin.com/company/genpact",
          "slug": "genpact",
          "logo": "https://media.licdn.com/dms/image/v2/D4E0BAQFIjOdiff8hjA/company-logo_100_100/company-logo_100_100/0/[redacted-phone]/genpact_logo?e=[redacted-phone]&v=beta&t=Jm64InCy2eaPouk0Sx0XC-HIfv3mrdSUoF4zOkk7SKQ",
          "description": null,
          "website": null,
          "employee_count": null,
          "company_size": null,
          "industry": null,
          "headquarters": null,
          "founded": null,
          "organization_type": null,
          "specialties": []
        },
        "location": "New York City Metropolitan Area",
        "workplace_type": null,
        "workplace_type_source": null,
        "posted_date": "[redacted-phone]",
        "posted_relative": "1 week ago",
        "description_html": null,
        "description_text": null,
        "salary": null,
        "seniority_level": null,
        "employment_type": null,
        "job_function": null,
        "industries": null,
        "applicant_count_text": null,
        "applicant_count_min": null,
        "apply_url": null,
        "easy_apply": null,
        "benefits": [],
        "job_state": null,
        "search_query": "python developer",
        "search_location": "United States"
      }
    ],
    "count": 25,
    "pages_fetched": 4,
    "stop_reason": "max_results"
  }
}
Manual way

Why this is hard manually

LinkedIn aggressively blocks scraping: guest pages paginate through hydrated state, rate-limit by IP and serve different markup to logged-out crawlers. A scraper tuned for one query routinely fails on pagination, expired postings or location filters.

Beyond fetching, the hard part is normalizing job title, company, location, posting date and the canonical job URL into a repeatable shape that recruiting or analytics jobs can trust.

ReefAPI way

Why ReefAPI solves it

ReefAPI wraps the working LinkedIn Jobs engine behind one POST request and returns the standard envelope: ok, data, meta and error. The live snapshot on the LinkedIn Jobs API page shows a real jobs/search call returning roles with title, company, location and posting metadata.

Use it when you need dependable public job data for recruiting tools, market dashboards, job aggregators or AI agents — without LinkedIn accounts or proxy management.

FAQ

Questions developers ask

Does this require a LinkedIn login?

No. The guide uses ReefAPI's LinkedIn Jobs engine and a ReefAPI key; no LinkedIn account or cookies are required.

Why does my LinkedIn scraper keep getting blocked?

LinkedIn scraping needs rotating proxies and careful pacing to survive guest-page rate limits and IP bans. ReefAPI handles that for you and returns live JSON; blocked or failed calls are free.

What job fields come back?

The captured response includes job ids, titles, company names, locations, posting dates and canonical job URLs.

Can I track many searches?

Yes. Run one request per keyword and location, store seen job ids, and dedupe new results in your own database.