Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/speedyapply/JobSpy/llms.txt

Use this file to discover all available pages before exploring further.

Installation issues

If you see an ImportError when running from jobspy import scrape_jobs, check that you are using Python 3.10 or higher:
python --version
If your version is below 3.10, upgrade Python before reinstalling JobSpy.
If Python cannot find the jobspy module, reinstall the package:
pip install -U python-jobspy
Make sure you are installing into the same Python environment your script is using.

No results returned

Verify that each value in site_name matches one of the accepted strings exactly:
Sitesite_name value
LinkedInlinkedin
Indeedindeed
ZipRecruiterzip_recruiter
Glassdoorglassdoor
Google Jobsgoogle
Baytbayt
Naukrinaukri
BDJobsbdjobs
Any typo or incorrect casing will cause that site to be skipped silently.
Google Jobs ignores search_term. You must use google_search_term instead:
jobs = scrape_jobs(
    site_name="google",
    google_search_term="software engineer jobs near San Francisco, CA since yesterday",
)
See the Google Jobs: no results section below for full details.
Bayt only supports search_term. Location filtering is not available for Bayt. If you are passing a location parameter, it will be ignored.
Confirm your machine has internet access and that the job board’s domain is reachable. If you are behind a firewall or corporate proxy, configure the proxies parameter accordingly.

Rate limiting (429 errors)

A 429 response means the job board has blocked your IP for sending too many requests. You need to slow down your requests or rotate your IP address using proxies.
LinkedIn is the most restrictive job board and typically rate limits around the 10th page of results with a single IP. For any scrape that goes beyond a small number of results, using proxies is strongly recommended.
jobs = scrape_jobs(
    site_name="linkedin",
    search_term="data engineer",
    proxies=["user:pass@host:port"],
)
Indeed currently has minimal rate limiting. For large scrapes, add a delay between subsequent calls to reduce the chance of being blocked.
ZipRecruiter and Glassdoor have moderate rate limiting. Add delays between requests and consider using proxies for high-volume scraping.
Pass a list of proxy strings to the proxies parameter. Each scraper will round-robin through the list:
jobs = scrape_jobs(
    site_name=["linkedin", "indeed"],
    search_term="software engineer",
    proxies=["user:pass@host:port", "localhost"],
)
If your proxies use a custom SSL certificate, provide the path with ca_cert:
jobs = scrape_jobs(
    site_name="linkedin",
    search_term="software engineer",
    proxies=["user:pass@host:port"],
    ca_cert="/path/to/cert.pem",
)

Empty or missing fields

Several fields are only populated by specific job boards:
  • job_level — LinkedIn only
  • company_industry — LinkedIn and Indeed only
  • company_addresses, company_num_employees, company_revenue, company_description, company_logo — Indeed only
  • skills, experience_range, company_rating, company_reviews_count, vacancy_count, work_from_home_type — Naukri only
If you are not scraping the relevant board, these columns will be None.
Compensation data is only populated when the job posting includes salary information. Many postings do not list a salary, so min_amount, max_amount, and interval may be None.For US-based results, JobSpy will attempt to parse salary figures from the description text when structured compensation data is unavailable.
Some job boards return truncated descriptions by default. For LinkedIn, you can fetch the full description by enabling linkedin_fetch_description:
jobs = scrape_jobs(
    site_name="linkedin",
    search_term="software engineer",
    linkedin_fetch_description=True,
)
linkedin_fetch_description=True makes an additional HTTP request for each job result, increasing total request count by O(n). Use it sparingly to avoid rate limiting.

Indeed search returning unrelated results

Indeed searches both the job title and the full description text. A broad search_term will match any posting that mentions your keywords anywhere in the listing.
Use precise query syntax to narrow results:
  • -word excludes postings that mention that word
  • "phrase" requires an exact match
  • (term1 OR term2) matches either alternative
search_term='"engineering intern" software summer (java OR python OR c++) 2025 -tax -marketing'

LinkedIn limitations

LinkedIn typically blocks requests around the 10th page of results when using a single IP. Use the proxies parameter to rotate IP addresses and extend how many results you can retrieve.
The LinkedIn easy apply filter no longer works reliably. Passing easy_apply=True for LinkedIn will not consistently return only easy apply listings.
On LinkedIn, you can only use one of the following per search:
  • hours_old
  • easy_apply
Using both in the same call will not behave as expected.
Setting linkedin_fetch_description=True fetches the full description and direct job URL for each result. This increases the total number of HTTP requests by O(n), where n is the number of jobs returned. Only enable this when you specifically need full descriptions or direct URLs.

Google Jobs: no results

Google Jobs does not use the search_term parameter. You must use google_search_term or you will get no results.
Google Jobs requires syntax that exactly matches what Google’s own search interface produces. To get the right query:
  1. Open Google Jobs in your browser.
  2. Search for the role you want and apply any filters (location, date posted, etc.).
  3. Copy the exact text shown in the Google Jobs search box.
  4. Pass that string as google_search_term.
jobs = scrape_jobs(
    site_name="google",
    google_search_term="software engineer jobs near San Francisco, CA since yesterday",
)
google_search_term is the only parameter used for filtering Google Jobs results. Parameters like location, hours_old, and job_type are ignored for this site.

Build docs developers (and LLMs) love