Overview
The main entry point for jobspy-js. Scrapes one or more job boards concurrently and returns a unified, flattened result set. All sites are scraped in parallel viaPromise.allSettled. If one site fails, the others still return results. Results are sorted by site name (alphabetical), then by date_posted descending (newest first).
Signature
Parameters
Configuration object for the scraping operation. All fields are optional.
ScrapeJobsParams Properties
Job boards to scrape. Accepts enum values, string keys, or arrays. Site names are normalized —
"ziprecruiter", "zip_recruiter", and "zip-recruiter" all work.Supported sites: linkedin, indeed, glassdoor, google, google_careers, zip_recruiter, bayt, naukri, bdjobsJob title or search query (e.g.
"software engineer", "react developer")Overrides
search_term for the Google scraper only. Useful for customizing Google’s broader search syntax.Job location (e.g.
"San Francisco, CA", "London", "Remote")Search radius in miles from the specified location
Filter for remote jobs only
Filter by employment type. Valid values:
"fulltime""parttime""contract""internship""temporary"
Filter for easy-apply jobs (supported on LinkedIn, Indeed, Glassdoor)
Maximum number of results per site. Total results may be up to
results_wanted * number_of_sites.Country for Indeed and Glassdoor regional domains. See Country Support for the full list of 60+ supported countries.
Proxy server(s) for rotating requests. Accepts formats:
"host:port""user:pass@host:port""http://host:port""socks5://host:port"
Format for job descriptions. Valid values:
"markdown"— converts HTML to Markdown"html"— preserves original HTML"plain"— strips all markup
Fetch full job descriptions from LinkedIn. Requires an extra HTTP request per job (slower).
Visit the Indeed job page or direct link to scrape the full description
Filter LinkedIn results to specific company IDs. Example:
[1441, 1035] for Google and Microsoft.Skip the first N results (pagination offset)
Only return jobs posted within the last N hours
Convert all salary figures to annual equivalents (hourly × 2080, monthly × 12, etc.)
Logging verbosity level:
0— errors only1— warnings2— all logs
Enable authenticated scraping fallback when anonymous access is blocked (e.g. LinkedIn 429s). Can also be set via
JOBSPY_CREDS=1 environment variable.Pre-built credentials object. Takes precedence over individual credential fields below.
LinkedIn username/email. Also reads from
LINKEDIN_USERNAME environment variable.LinkedIn password. Also reads from
LINKEDIN_PASSWORD environment variable.Indeed username/email. Also reads from
INDEED_USERNAME environment variable.Indeed password. Also reads from
INDEED_PASSWORD environment variable.Glassdoor username/email. Also reads from
GLASSDOOR_USERNAME environment variable.Glassdoor password. Also reads from
GLASSDOOR_PASSWORD environment variable.ZipRecruiter username/email. Also reads from
ZIPRECRUITER_USERNAME environment variable.ZipRecruiter password. Also reads from
ZIPRECRUITER_PASSWORD environment variable.Bayt username/email. Also reads from
BAYT_USERNAME environment variable.Bayt password. Also reads from
BAYT_PASSWORD environment variable.Naukri username/email. Also reads from
NAUKRI_USERNAME environment variable.Naukri password. Also reads from
NAUKRI_PASSWORD environment variable.BDJobs username/email. Also reads from
BDJOBS_USERNAME environment variable.BDJobs password. Also reads from
BDJOBS_PASSWORD environment variable.Named profile for deduplication tracking. When set, jobspy tracks seen job URLs and filters duplicates across runs.
Path to custom state file for profile tracking. Defaults to
jobspy.json in current directory.Skip deduplication filtering (state is still updated for next run)
Return Value
Array of job postings. Each job is a flat record with all nested structures expanded to top-level fields.
Total number of jobs scraped across all sites before deduplication
Number of new jobs after deduplication filtering (equals
totalScraped when not using profiles)FlatJobRecord Fields
Each job in thejobs array contains:
Unique job ID with site prefix (e.g.
"li-123", "in-abc")Source site key (e.g.
"linkedin", "indeed")Canonical job URL on the board
Direct employer/ATS URL (LinkedIn, Indeed, ZipRecruiter)
Job title
Company name
Formatted as
"City, State, Country"ISO date
"YYYY-MM-DD"Comma-separated employment types (e.g.
"fulltime, contract")How salary was obtained:
"direct_data" or "description"Pay interval:
"yearly", "monthly", "weekly", "daily", or "hourly"Minimum salary/pay amount
Maximum salary/pay amount
Currency code (e.g.
"USD", "EUR")Whether the job is remote
Seniority level (e.g.
"mid-senior level") — LinkedIn onlyJob function category — LinkedIn only
E.g.
"sponsored" — LinkedIn, IndeedComma-separated emails extracted from description
Full job description (format per
description_format parameter)Industry classification — LinkedIn, Indeed
Company page on the job board — LinkedIn, Glassdoor
Company logo URL — Indeed, Naukri
Company’s own website URL — LinkedIn, Indeed
Company address(es) — Indeed
Employee count range — Indeed
Revenue range — Indeed
Company description text — Indeed
Comma-separated skill tags — Naukri
Required experience (e.g.
"3-5 years") — NaukriCompany rating (e.g.
4.2) — NaukriNumber of company reviews — Naukri
Number of open positions — Naukri
"Remote", "Hybrid", or "Work from office" — NaukriExamples
Basic Search
Remote Jobs with Salary Filter
With Credentials
With Profile Deduplication
International Search
LinkedIn Company Filter
Recent Jobs Only
Error Handling
scrapeJobs() uses Promise.allSettled internally, so individual scraper failures don’t crash the entire call. Failed scrapers are silently skipped — you’ll receive results from whichever sites succeeded.
verbose: 2 to see detailed logs from each scraper:
Related
- fetchLinkedInJob() - Fetch details for a single LinkedIn job
- fetchJobDetails() - Fetch details for any job by ID
- Types Reference - Full type definitions
