Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/borgius/jobspy-js/llms.txt

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

The jobspy command provides a comprehensive set of flags for scraping, filtering, and exporting job postings.

Command Structure

jobspy [flags]
All flags are optional. Without arguments, the CLI will error — you must specify at least -s/--site or use --profile, --init, --list-profiles, --describe, or --id.

Core Search Flags

-s, --site <sites...>

Job boards to scrape. Accepts one or more site keys separated by spaces. Valid keys: linkedin, indeed, glassdoor, google, google_careers, zip_recruiter, bayt, naukri, bdjobs Default: All sites (when omitted)
jobspy -s linkedin -q "react developer"

-q, --search-term <term>

Job search query. Used for all sites except Google Jobs (which uses --google-search-term by default). Example:
jobspy -s linkedin -q "senior frontend engineer react"

--google-search-term <term>

Override search term specifically for Google Jobs. Useful for custom queries like "jobs near [location]". Example:
jobspy -s google --google-search-term "software engineer jobs near San Francisco CA"

-l, --location <location>

Geographic location for the job search. Format varies by site but generally accepts city/state or city/country. Examples:
jobspy -s indeed -q "nurse" -l "Houston, TX"
jobspy -s linkedin -q "data scientist" -l "London, UK"
jobspy -s bayt -q "accountant" -l "Dubai, UAE"

-d, --distance <miles>

Search radius in miles from the specified location. Default: 50 Example:
jobspy -s indeed -q "mechanic" -l "Detroit, MI" -d 25

-n, --results <count>

Number of job results to fetch per site. Alias: --limit Default: 15 Example:
jobspy -s linkedin indeed -q "java developer" -n 50
# Fetches up to 50 jobs from LinkedIn + 50 from Indeed = 100 total

--offset <offset>

Pagination offset. Start scraping from the Nth result. Useful for batch scraping. Default: 0 Example:
jobspy -s linkedin -q "engineer" -n 50 --offset 0   # First batch
jobspy -s linkedin -q "engineer" -n 50 --offset 50  # Second batch
jobspy -s linkedin -q "engineer" -n 50 --offset 100 # Third batch

Filter Flags

-r, --remote

Filter for remote jobs only. Default: false (includes all locations) Example:
jobspy -s linkedin indeed -q "backend engineer" -r

-t, --job-type <type>

Filter by employment type. Valid values: fulltime, parttime, contract, internship Example:
jobspy -s glassdoor -q "marketing manager" -t fulltime
jobspy -s indeed -q "summer intern" -t internship

--easy-apply

Filter for jobs with “easy apply” or one-click application. Default: false Example:
jobspy -s linkedin -q "product manager" --easy-apply

--hours-old <hours>

Only include jobs posted within the last N hours. Example:
jobspy -s linkedin -q "react" --hours-old 24  # Last 24 hours only
jobspy -s indeed -q "nurse" --hours-old 72    # Last 3 days

-c, --country <country>

Country code for Indeed and Glassdoor regional domains. Default: usa Supported countries: usa, uk, canada, germany, france, spain, india, australia, brazil, and 60+ more. Example:
jobspy -s indeed -q "software developer" -c canada -l "Toronto"
jobspy -s glassdoor -q "data analyst" -c uk -l "London"

--linkedin-company-ids <ids...>

Filter LinkedIn results to specific companies by their LinkedIn company IDs. Example:
jobspy -s linkedin -q "engineer" --linkedin-company-ids 1441 162479
# 1441 = Google, 162479 = Microsoft

Output Flags

-o, --output <file>

Output file path. Format is automatically detected from extension:
  • .json → JSON array
  • .csv → CSV with headers
Default: Print formatted table to stdout Example:
jobspy -s linkedin -q "engineer" -o results.json
jobspy -s indeed glassdoor -q "analyst" -o jobs.csv

--format <format>

Format for job descriptions in the output. Valid values: markdown, html, plain Default: markdown Example:
jobspy -s linkedin -q "writer" --format html -o jobs.json
jobspy -s indeed -q "developer" --format plain -o results.csv

--enforce-annual-salary

Convert all salary values to annual equivalents. Hourly and monthly salaries are normalized. Default: false Example:
jobspy -s indeed -q "contractor" --enforce-annual-salary -o salaries.csv

Description Fetching

--linkedin-fetch-description

Fetch full job descriptions for LinkedIn postings. By default, only job previews are scraped. This flag makes an additional request per job to get the complete description. Default: false Trade-off: Slower but more complete data. Example:
jobspy -s linkedin -q "product designer" --linkedin-fetch-description -n 10

--indeed-fetch-description

Fetch full job pages for Indeed postings to extract descriptions from the detail view. Default: false Example:
jobspy -s indeed -q "nurse" --indeed-fetch-description -n 20

Single Job Fetching

--describe <jobId>

Fetch full details for a single LinkedIn job by ID or URL. Does not perform a search. Example:
jobspy --describe 4127292817
Returns JSON with full job details:
{
  "job_url": "https://www.linkedin.com/jobs/view/4127292817",
  "title": "Senior Software Engineer",
  "company": "Acme Corp",
  "location": "San Francisco, CA",
  "description": "# About the Role\n\nWe are seeking...",
  "job_type": ["fulltime"],
  "job_level": "mid-senior level",
  "company_industry": "Software Development",
  "job_url_direct": "https://apply.acme.com/apply"
}

--id <jobId> (requires -s/--site)

Fetch full job details by ID for any supported site. Example:
jobspy -s indeed --id fdde406379455a1e

Proxy Configuration

-p, --proxies <proxies...>

One or more proxy servers. Format: user:pass@host:port or http://user:pass@host:port Proxies are rotated across requests for rate limit mitigation. Example:
jobspy -s google -q "engineer" -p "user:pass@proxy.example.com:8080"

Authentication / Credentials

--creds

Enable credential fallback. When anonymous scraping is blocked (e.g., LinkedIn 429 rate limit), the scraper will attempt authenticated scraping using stored credentials. Default: false Equivalent: JOBSPY_CREDS=1 environment variable Example:
jobspy -s linkedin -q "engineer" --creds
Credentials are loaded from:
  1. CLI flags (--linkedin-username, --linkedin-password, etc.)
  2. Profile config (jobspy.json)
  3. Environment variables (LINKEDIN_USERNAME, LINKEDIN_PASSWORD, etc.)

Per-Provider Credential Flags

FlagEnvironment VariableDescription
--linkedin-usernameLINKEDIN_USERNAMELinkedIn email/username
--linkedin-passwordLINKEDIN_PASSWORDLinkedIn password
--indeed-usernameINDEED_USERNAMEIndeed email/username
--indeed-passwordINDEED_PASSWORDIndeed password
--glassdoor-usernameGLASSDOOR_USERNAMEGlassdoor email/username
--glassdoor-passwordGLASSDOOR_PASSWORDGlassdoor password
--ziprecruiter-usernameZIPRECRUITER_USERNAMEZipRecruiter email/username
--ziprecruiter-passwordZIPRECRUITER_PASSWORDZipRecruiter password
--bayt-usernameBAYT_USERNAMEBayt email/username
--bayt-passwordBAYT_PASSWORDBayt password
--naukri-usernameNAUKRI_USERNAMENaukri email/username
--naukri-passwordNAUKRI_PASSWORDNaukri password
Example:
jobspy -s linkedin -q "engineer" --creds \
  --linkedin-username me@email.com \
  --linkedin-password "mypassword"
Security note: Prefer environment variables over CLI flags to avoid exposing credentials in shell history.
export LINKEDIN_USERNAME="me@email.com"
export LINKEDIN_PASSWORD="mypassword"
jobspy -s linkedin -q "engineer" --creds

Config Profile Flags

--profile <name>

Run a named profile from jobspy.json. See Config Profiles for details. Example:
jobspy --profile frontend
jobspy --profile backend -n 10  # Override results count

--init

Generate a jobspy.json config file with two sample profiles (frontend and backend). Example:
jobspy --init
# Created /path/to/jobspy.json

--list-profiles

List all profiles in jobspy.json with their last run time and settings. Example:
jobspy --list-profiles
Output:
Profiles in /home/user/project/jobspy.json:
  frontend             last run: 3/5/2026, 9:15:00 AM  sites: linkedin, indeed  term: react frontend developer
  backend              last run: 3/4/2026, 2:30:00 PM  sites: linkedin, indeed  term: node.js backend engineer
  devops               last run: never  sites: linkedin  term: devops engineer

--all

Skip deduplication filtering for this run. All jobs are returned, but state is still updated for future runs. Use case: Re-fetch all jobs without losing dedup history. Example:
jobspy --profile frontend --all

Logging and Verbosity

-v, --verbose <level>

Control log output verbosity.
  • 0 — Errors only (default)
  • 1 — Warnings + errors
  • 2 — All logs (info, debug, warnings, errors)
Example:
jobspy -s linkedin -q "engineer" -v 2

Advanced Examples

Batch Scraping with Pagination

for i in {0..200..50}; do
  jobspy -s linkedin -q "data scientist" --offset $i -n 50 -o "batch-$i.json"
  sleep 5
done

Multi-Site with Filters

jobspy -s linkedin indeed glassdoor \
  -q "senior backend engineer" \
  -l "San Francisco, CA" \
  -d 30 \
  -r \
  -t fulltime \
  --hours-old 48 \
  --enforce-annual-salary \
  -n 100 \
  -o sf-backend-jobs.csv

Credential Fallback with Environment Variables

export JOBSPY_CREDS=1
export LINKEDIN_USERNAME="me@email.com"
export LINKEDIN_PASSWORD="secret"
export INDEED_USERNAME="me@email.com"
export INDEED_PASSWORD="secret"

jobspy -s linkedin indeed -q "react developer" -n 50 -o jobs.json

Google Jobs with Proxy

jobspy -s google \
  --google-search-term "software engineer jobs near New York NY" \
  -n 20 \
  -p "user:pass@residential-proxy.com:8080" \
  -o google-jobs.json

Exit Codes

CodeMeaning
0Success
1Error (scraping failed, invalid arguments, etc.)

Config Profiles

Define reusable search profiles with jobspy.json

Deduplication

Track and filter previously seen jobs