{"_id":"@atharvh01/linkedin-jobs-api","_rev":"5-286ba18075278325645125662edbe63b","name":"@atharvh01/linkedin-jobs-api","dist-tags":{"latest":"2.1.0"},"versions":{"1.0.0":{"name":"@atharvh01/linkedin-jobs-api","version":"1.0.0","keywords":["linkedin","jobs","api","scraper","job-search","linkedin-jobs","job-api","careers","recruitment"],"author":{"url":"https://github.com/atharvhatwar","name":"Atharv Hatwar"},"license":"MIT","_id":"@atharvh01/linkedin-jobs-api@1.0.0","maintainers":[{"name":"atharvh01","email":"atharvhatwar02@gmail.com"}],"homepage":"https://github.com/atharvhatwar/linkedin-jobs-api#readme","bugs":{"url":"https://github.com/atharvhatwar/linkedin-jobs-api/issues"},"dist":{"shasum":"33b1f3052953f16f0ee7f468d724b8be1104db8b","tarball":"https://registry.npmjs.org/@atharvh01/linkedin-jobs-api/-/linkedin-jobs-api-1.0.0.tgz","fileCount":12,"integrity":"sha512-nyJv+Hwk1m6sd53U26X+XO6MyaLKpNfTE7wg5xtuLo+Xd8X3F2vnWtWrydG3+UtJp6pwuxJWEFcbiw+he8d46A==","signatures":[{"sig":"MEQCIEpPPhaYlC0MYpU9HR5KB+BfCnFNAvMqkRtyKRSYIWcvAiBlUO2HGGjEBBhP1+wtWjLXugYeFo2TMI2JdlVZjfBWQg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":12319},"main":"src/index.js","type":"module","engines":{"node":">=14.0.0"},"gitHead":"bedeccb04af95d609340b759e9a9539c1790c1c7","scripts":{"dev":"nodemon src/index.js","test":"node src/tests/apiTest.js","start":"node src/index.js","test:api":"node src/tests/apiTest.js"},"_npmUser":{"name":"atharvh01","email":"atharvhatwar02@gmail.com"},"repository":{"url":"git+https://github.com/atharvhatwar/linkedin-jobs-api.git","type":"git"},"_npmVersion":"10.5.2","description":"An unofficial LinkedIn Jobs API to fetch job listings with advanced filtering and rate limiting","directories":{},"_nodeVersion":"20.12.2","dependencies":{"cors":"^2.8.5","axios":"^1.6.2","dotenv":"^16.3.1","cheerio":"^1.0.0-rc.12","express":"^4.18.2","puppeteer":"^21.6.1","express-rate-limit":"^7.1.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nodemon":"^3.0.2"},"_npmOperationalInternal":{"tmp":"tmp/linkedin-jobs-api_1.0.0_1733416862798_0.342690606192956","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"@atharvh01/linkedin-jobs-api","version":"1.0.1","keywords":["linkedin","jobs","api","scraper","job-search","linkedin-jobs","job-api","careers","recruitment"],"author":{"url":"https://github.com/atharv01h","name":"Atharv Hatwar"},"license":"MIT","_id":"@atharvh01/linkedin-jobs-api@1.0.1","maintainers":[{"name":"atharvh01","email":"atharvhatwar02@gmail.com"}],"homepage":"https://github.com/atharv01h/linkedin-jobs-api#readme","bugs":{"url":"https://github.com/atharv01h/linkedin-jobs-api/issues"},"dist":{"shasum":"798df2f54c24a4a27f23ce1ff4efe89a2ecf7263","tarball":"https://registry.npmjs.org/@atharvh01/linkedin-jobs-api/-/linkedin-jobs-api-1.0.1.tgz","fileCount":12,"integrity":"sha512-R45BfS5uCrskaS6XMTB7Z1A+2BhoyJHftjQqsbk7CKZMUKty5ZbP9K2hNoXg9NFevdKJXhUkyLcRjgjOXRPVCA==","signatures":[{"sig":"MEYCIQCItfBocP/R5VVJuJBl+sDkLu2/S474ASfQsEJmpprLkAIhAM2OaQzG93DJhYAurLD2JDTW3t165qx/YB6d3Ib4BNew","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":12335},"main":"src/index.js","type":"module","engines":{"node":">=14.0.0"},"gitHead":"4c663b5ffbe4d82f20c92b98a4c8b6a103d16dc5","scripts":{"dev":"nodemon src/index.js","test":"node src/tests/apiTest.js","start":"node src/index.js","test:api":"node src/tests/apiTest.js"},"_npmUser":{"name":"atharvh01","email":"atharvhatwar02@gmail.com"},"repository":{"url":"git+https://github.com/atharv01h/linkedin-jobs-api.git","type":"git"},"_npmVersion":"10.5.2","description":"An unofficial LinkedIn Jobs API to fetch job listings with advanced filtering and rate limiting","directories":{},"_nodeVersion":"20.12.2","dependencies":{"cors":"^2.8.5","axios":"^1.6.2","dotenv":"^16.3.1","cheerio":"^1.0.0-rc.12","express":"^4.18.2","puppeteer":"^21.6.1","express-rate-limit":"^7.1.5","@atharvh01/linkedin-jobs-api":"^1.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nodemon":"^3.0.2"},"_npmOperationalInternal":{"tmp":"tmp/linkedin-jobs-api_1.0.1_1733418960521_0.7899831889099145","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"@atharvh01/linkedin-jobs-api","version":"2.0.0","_id":"@atharvh01/linkedin-jobs-api@2.0.0","maintainers":[{"name":"atharvh01","email":"atharvhatwar02@gmail.com"}],"dist":{"shasum":"4164deb6046b128de455314126e1969d402648af","tarball":"https://registry.npmjs.org/@atharvh01/linkedin-jobs-api/-/linkedin-jobs-api-2.0.0.tgz","fileCount":5,"integrity":"sha512-+Pq8/Y0zT6MkxerA9jSOvoDLDiYcBNwH8UGe2QcmJnyDQzuIA2sfBbW+e/4MOJIxBH4tmAaivgwjPDHXkn4uNw==","signatures":[{"sig":"MEUCIQCzYW5MgmhBkPC35Dud3bIpXSOwvi2kRArJPG+AyxUQGAIgasVSwfbUhF8YwzRZcn4DSLYdgSCavpSALIT9Lx9PI18=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6090},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"51512a682f0096f513a72d7d4822a713530f5e39","scripts":{"lint":"eslint \"src/**/*.ts\"","test":"jest","build":"tsc"},"_npmUser":{"name":"atharvh01","email":"atharvhatwar02@gmail.com"},"_npmVersion":"11.9.0","description":"Official JavaScript/TypeScript SDK for LinkedIn Jobs API","directories":{},"_nodeVersion":"24.14.0","dependencies":{"axios":"^1.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.1","typescript":"^5.3.3","@types/jest":"^29.5.11"},"_npmOperationalInternal":{"tmp":"tmp/linkedin-jobs-api_2.0.0_1785418883873_0.7729378645054801","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@atharvh01/linkedin-jobs-api","version":"2.0.1","_id":"@atharvh01/linkedin-jobs-api@2.0.1","maintainers":[{"name":"atharvh01","email":"atharvhatwar02@gmail.com"}],"dist":{"shasum":"83befa2529cd6daeae48e18e09e8cf4e6ad67e1d","tarball":"https://registry.npmjs.org/@atharvh01/linkedin-jobs-api/-/linkedin-jobs-api-2.0.1.tgz","fileCount":6,"integrity":"sha512-6f0dUgnkeSWt+sCDKjdpAMW6cV+qEKG5Mbxo9Al2PM1z23eplB3sA6jWhTn1EKloGV4ORurcWbEjgHsTxdTOZA==","signatures":[{"sig":"MEUCIEArtEYDV3dIE2Y5oo9eKmKIxvjOmzlaHgr7Xj58HJ6tAiEA0yUT1yKCN82RBU4IK9pubirYJp7lRBR4ApuZkIymWX4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10181},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"51512a682f0096f513a72d7d4822a713530f5e39","scripts":{"lint":"eslint \"src/**/*.ts\"","test":"jest","build":"tsc"},"_npmUser":{"name":"atharvh01","email":"atharvhatwar02@gmail.com"},"_npmVersion":"11.9.0","description":"Official JavaScript/TypeScript SDK for LinkedIn Jobs API","directories":{},"_nodeVersion":"24.14.0","dependencies":{"axios":"^1.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","ts-jest":"^29.1.1","typescript":"^5.3.3","@types/jest":"^29.5.11"},"_npmOperationalInternal":{"tmp":"tmp/linkedin-jobs-api_2.0.1_1785418987596_0.5678868796942187","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@atharvh01/linkedin-jobs-api","version":"2.1.0","description":"Official JavaScript/TypeScript SDK for LinkedIn Jobs API","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest","lint":"eslint \"src/**/*.ts\""},"dependencies":{"axios":"^1.6.2"},"devDependencies":{"@types/jest":"^29.5.11","jest":"^29.7.0","ts-jest":"^29.1.1","typescript":"^5.3.3"},"publishConfig":{"access":"public"},"gitHead":"971dea1692734c55750629e3577e88b626f4b6ef","_id":"@atharvh01/linkedin-jobs-api@2.1.0","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-+JZvdnuv+XE3F5y3Mirb3ibee+fklX1UxkY9IUnh23pFBGNbJbHJycCjDCuKE2Kv9tf8tks/x4pUDnIOZyg03A==","shasum":"d003ab1ca83bc9654552dffa623713cf0d6dd08c","tarball":"https://registry.npmjs.org/@atharvh01/linkedin-jobs-api/-/linkedin-jobs-api-2.1.0.tgz","fileCount":6,"unpackedSize":17861,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEWmhNqNk3vDpHS1HKi7QkiYr+0zratF8rFKRGKj1ElzAiAX8Bng5XfEUsL/dQccO9d7cEctE/AtK1K6y45MOeBX6Q=="}]},"_npmUser":{"name":"atharvh01","email":"atharvhatwar02@gmail.com"},"directories":{},"maintainers":[{"name":"atharvh01","email":"atharvhatwar02@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/linkedin-jobs-api_2.1.0_1788365891266_0.14514235964491196"},"_hasShrinkwrap":false}},"time":{"created":"2024-12-05T16:41:02.544Z","modified":"2026-09-02T16:18:11.574Z","1.0.0":"2024-12-05T16:41:02.975Z","1.0.1":"2024-12-05T17:16:00.713Z","2.0.0":"2026-07-30T13:41:24.012Z","2.0.1":"2026-07-30T13:43:07.743Z","2.1.0":"2026-09-02T16:18:11.410Z"},"description":"Official JavaScript/TypeScript SDK for LinkedIn Jobs API","maintainers":[{"name":"atharvh01","email":"atharvhatwar02@gmail.com"}],"readme":"# LinkedIn Jobs API - Modernized 🚀\r\n\r\n![License](https://img.shields.io/badge/License-MIT-blue.svg)\r\n![Node.js](https://img.shields.io/badge/Node.js-v18%2B-green.svg)\r\n![TypeScript](https://img.shields.io/badge/TypeScript-Strict-blue)\r\n\r\nA production-grade, enterprise-ready, open-source REST API and multi-language SDK platform to fetch job listings from LinkedIn without requiring authentication.\r\n\r\n## Disclaimer ⚠️\r\n**This is an unofficial API.** LinkedIn frequently updates its layout, selectors, and anti-bot measures. This scraper uses advanced stealth techniques (via Puppeteer) but may occasionally experience limitations. Some features (like fetching complete individual job descriptions) may have limited data availability compared to a logged-in session. Use responsibly and within legal and ethical boundaries.\r\n\r\n## Features ✨\r\n- **RESTful API**: Clean, well-documented endpoints.\r\n- **Robust Scraper**: Built with `puppeteer-extra-plugin-stealth` for evasion.\r\n- **Rate Limiting & Security**: Protected by Helmet and Express Rate Limiters.\r\n- **Multi-Language SDKs**: Native clients for **JavaScript**, **Python**, and **Java**.\r\n- **Pagination & Filtering**: Search by keywords, location, and date.\r\n- **OpenAPI / Swagger**: Auto-generated interactive API docs.\r\n- **Docker Ready**: Designed for containerized deployments.\r\n\r\n---\r\n\r\n## Architecture 🏗️\r\n\r\nThis repository is structured as a monorepo containing the backend service and multiple SDKs:\r\n\r\n- `backend/` - The core REST API and Puppeteer Scraper engine (TypeScript, Express).\r\n- `sdk-javascript/` - Official JavaScript/TypeScript SDK for the npm ecosystem.\r\n- `sdk-python/` - Official Python SDK (`requests` based).\r\n- `sdk-java/` - Official Java SDK (Java 17, `HttpClient`).\r\n\r\n---\r\n\r\n## Quick Start 🚦\r\n\r\n### 1. Run the Backend API\r\n\r\nMake sure you have Node.js 18+ installed.\r\n\r\n```bash\r\n# Install dependencies\r\nnpm install\r\n\r\n# Run the development server\r\nnpm run dev --workspace=backend\r\n```\r\n\r\nThe API will start on `http://localhost:3000`.\r\nVisit the **Swagger Docs** at: `http://localhost:3000/api/v1/docs`\r\n\r\n---\r\n\r\n## SDK Usage Examples 💻\r\n\r\n### JavaScript / TypeScript\r\n\r\n```typescript\r\nimport { LinkedInJobsClient } from '@atharvh01/linkedin-jobs-api';\r\n\r\nconst client = new LinkedInJobsClient({ baseURL: 'http://localhost:3000/api/v1' });\r\n\r\nasync function search() {\r\n  const response = await client.searchJobs({\r\n    keywords: 'Software Engineer',\r\n    location: 'Remote',\r\n    dateSincePosted: 'past_24h'\r\n  });\r\n  \r\n  console.log(`Found ${response.metadata.count} jobs!`);\r\n  console.log(response.jobs);\r\n}\r\n```\r\n\r\n### Python\r\n\r\n```python\r\nfrom linkedin_jobs_api import LinkedInJobsClient\r\n\r\nclient = LinkedInJobsClient(base_url=\"http://localhost:3000/api/v1\")\r\n\r\nresponse = client.search_jobs(\r\n    keywords=\"Data Scientist\",\r\n    location=\"New York\",\r\n    date_since_posted=\"past_week\"\r\n)\r\n\r\nprint(f\"Found {response['metadata']['count']} jobs!\")\r\nfor job in response['jobs']:\r\n    print(job['title'], job['company'])\r\n```\r\n\r\n### Java\r\n\r\n```java\r\nimport com.linkedin.jobs.api.LinkedInJobsClient;\r\nimport com.fasterxml.jackson.databind.JsonNode;\r\n\r\npublic class Main {\r\n    public static void main(String[] args) throws Exception {\r\n        LinkedInJobsClient client = LinkedInJobsClient.builder()\r\n                .baseUrl(\"http://localhost:3000/api/v1\")\r\n                .build();\r\n                \r\n        JsonNode response = client.searchJobs(\"Backend Developer\", \"San Francisco\", \"past_month\", 1);\r\n        System.out.println(\"Jobs found: \" + response.get(\"metadata\").get(\"count\").asInt());\r\n    }\r\n}\r\n```\r\n\r\n---\r\n\r\n## API Endpoints 📡\r\n\r\n### `GET /api/v1/jobs/search`\r\n\r\n| Parameter | Type | Required | Description |\r\n|-----------|------|----------|-------------|\r\n| `keywords` | string | No | Search keywords (e.g. \"developer\") |\r\n| `location` | string | No | Location (e.g. \"London\") |\r\n| `dateSincePosted` | string | No | `past_24h`, `past_week`, or `past_month` |\r\n| `page` | integer | No | Pagination offset (default 1) |\r\n\r\n---\r\n\r\n## Contributing 🤝\r\nContributions are welcome! Please check `CONTRIBUTING.md` for guidelines.\r\n\r\n## License 📜\r\nMIT License - see LICENSE file for details.\r\n","readmeFilename":"README.md"}