ts-jobspy is a job scraping library for JavaScript/TypeScript with the goal of aggregating jobs from popular job boards with one tool.
This is a TypeScript port of python-jobspy.
- Scrapes job postings from LinkedIn & Indeed concurrently
- Returns structured job data as an array of objects
- Proxies support to bypass blocking
- Works with both JavaScript and TypeScript
npm install ts-jobspy
# or
yarn add ts-jobspy
# or
pnpm add ts-jobspyNode.js version >= 20.0.0 required
import { scrapeJobs } from 'ts-jobspy';
import fs from 'fs';
const jobs = await scrapeJobs({
siteName: ['indeed', 'linkedin'],
searchTerm: 'software engineer',
location: 'San Francisco, CA',
resultsWanted: 20,
hoursOld: 72,
countryIndeed: 'USA',
// linkedinFetchDescription: true // gets more info such as description, direct job url (slower)
});
console.log(`Found ${jobs.length} jobs`);
fs.writeFileSync('jobs.json', JSON.stringify(jobs, null, 2));| site | company | title | location | datePosted | description | jobUrl | jobUrlDirect | salarySource | interval | minAmount | maxAmount | currency | isRemote |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| indeed | Adobe | Software Development Engineer | San Jose, CA, US | 2026-01-02 | Our Company Changing the world through digital experiences... |
https://www.indeed.com/viewjob?jk=17cf2... | https://careers.adobe.com/us/en/job/ADOBUSR1633... | direct_data | yearly | 139000 | 257550 | USD | false |
| Software Engineer, Infrastructure, User Personalization | Mountain View, CA | 2025-12-31 | Minimum qualifications: Bachelor's degree ... | https://www.linkedin.com/jobs/view/4326... | https://careers.google.com/jobs/results/10592... | description | yearly | 141000 | 202000 | USD | false | ||
| Twitch | Software Development Engineer | San Francisco, CA | 2026-01-01 | About Us Twitch is the world's biggest live streaming service... |
https://www.linkedin.com/jobs/view/4319... | null | description | yearly | 99500 | 200000 | USD | false |
Optional
βββ siteName (string | string[]):
β linkedin, indeed
β (default is all available)
β
βββ searchTerm (string)
β
βββ location (string)
β
βββ distance (number):
β in miles, default 50
β
βββ jobType (string):
β fulltime, parttime, internship, contract
β
βββ proxies (string | string[]):
β in format ['user:pass@host:port', 'localhost']
β each job board scraper will round robin through the proxies
β
βββ isRemote (boolean)
β
βββ resultsWanted (number):
β number of job results to retrieve for each site specified in 'siteName'
β
βββ easyApply (boolean):
β filters for jobs that are hosted on the job board site
β
βββ descriptionFormat (string):
β markdown, html (default is markdown)
β
βββ offset (number):
β starts the search from an offset
β
βββ hoursOld (number):
β filters jobs by the number of hours since the job was posted
β
βββ linkedinFetchDescription (boolean):
β fetches full description and direct job url for LinkedIn (slower)
β
βββ linkedinCompanyIds (number[]):
β searches for linkedin jobs with specific company ids
β
βββ countryIndeed (string):
β filters the country on Indeed (see supported countries below)
β
βββ enforceAnnualSalary (boolean):
β converts wages to annual salary
β
βββ caCert (string)
path to CA Certificate file for proxies
βββ Indeed limitations:
β Only one from this list can be used in a search:
β - hoursOld
β - jobType & isRemote
β - easyApply
β
βββ LinkedIn limitations:
- Rate limits at ~10th page. Proxies are recommended for large scrapes.
LinkedIn searches globally & uses only the location parameter.
Indeed supports most countries. The countryIndeed parameter is required. Use the location parameter to narrow down by city/state.
| Argentina | Australia | Austria | Bahrain |
| Belgium | Brazil | Canada | Chile |
| China | Colombia | Costa Rica | Czech Republic |
| Denmark | Ecuador | Egypt | Finland |
| France | Germany | Greece | Hong Kong |
| Hungary | India | Indonesia | Ireland |
| Israel | Italy | Japan | Kuwait |
| Luxembourg | Malaysia | Mexico | Morocco |
| Netherlands | New Zealand | Nigeria | Norway |
| Oman | Pakistan | Panama | Peru |
| Philippines | Poland | Portugal | Qatar |
| Romania | Saudi Arabia | Singapore | South Africa |
| South Korea | Spain | Sweden | Switzerland |
| Taiwan | Thailand | Turkey | Ukraine |
| United Arab Emirates | UK | USA | Uruguay |
| Venezuela | Vietnam |
- Indeed is the best scraper currently with minimal rate limiting.
- All job board endpoints are capped at around 1000 jobs on a given search.
- LinkedIn is the most restrictive and usually rate limits around the 10th page. Proxies are recommended.
Q: Why is Indeed giving unrelated roles? A: Indeed searches the description too.
- use
-to remove words - use
""for exact match
Example of a good Indeed query:
searchTerm: '"engineering intern" software summer (java OR python OR c++) 2025 -tax -marketing'Q: Received a response code 429? A: This indicates you have been rate limited. We recommend:
- Wait some time between scrapes (site-dependent)
- Try using the
proxiesparameter to rotate IP addresses
JobPost
βββ title
βββ company
βββ companyUrl
βββ jobUrl
βββ jobUrlDirect
βββ location
βββ isRemote
βββ description
βββ jobType: fulltime, parttime, internship, contract
βββ compensation
β βββ interval: yearly, monthly, weekly, daily, hourly
β βββ minAmount
β βββ maxAmount
β βββ currency
β βββ salarySource: direct_data, description (parsed from posting)
βββ datePosted
βββ emails
LinkedIn specific
βββ jobLevel
LinkedIn & Indeed specific
βββ companyIndustry
Indeed specific
βββ companyAddresses
βββ companyNumEmployees
βββ companyRevenue
βββ companyDescription
βββ companyLogo
Note: Only LinkedIn and Indeed scrapers are currently working. Support for Glassdoor, ZipRecruiter, Google, and other job boards is coming soon.
Future features planned:
- Glassdoor support - Scraper currently under maintenance
- ZipRecruiter support - US/Canada job board (under maintenance)
- Google Jobs support - Global job search (under maintenance)
- Additional job boards - Bayt, Naukri, BDJobs (under maintenance)
This package is a TypeScript port of python-jobspy.
TypeScript Port Author:
- Alpha Romer Coma (alpharomercoma@proton.me)
Original python-jobspy Authors:
- Cullen Watson (cullen@cullenwatson.com)
- Zachary Hampton (zachary@zacharysproducts.com)
MIT License - see LICENSE for details.