jobspy.json file and run them with a single command. Each profile stores all search parameters, eliminating the need to repeat long CLI flags.
Creating a Config File
Generate a starterjobspy.json with sample profiles:
Running a Profile
Run a profile by name:frontend profile config.
Output:
Listing Profiles
View all profiles and their last run times:Overriding Profile Settings
CLI flags always take priority over profile config. Use a profile as a base and override specific options:Profile Config Options
All profile keys usesnake_case (matching the SDK parameter names). Here’s the complete reference:
| Key | Type | Description | Default |
|---|---|---|---|
site | string[] | Job boards to scrape | all sites |
search_term | string | Search query | — |
google_search_term | string | Override search term for Google Jobs | — |
location | string | Job location | — |
distance | number | Search radius in miles | 50 |
remote | boolean | Filter for remote jobs | false |
job_type | string | Employment type (fulltime, parttime, contract, internship) | — |
easy_apply | boolean | Easy apply filter | false |
results | number | Results per site | 15 |
country | string | Country for Indeed/Glassdoor | usa |
proxies | string[] | Proxy servers (user:pass@host:port) | — |
format | string | Description format (markdown, html, plain) | markdown |
linkedin_fetch_description | boolean | Fetch full LinkedIn descriptions | false |
indeed_fetch_description | boolean | Fetch full Indeed descriptions | false |
linkedin_company_ids | number[] | LinkedIn company IDs to filter | — |
offset | number | Pagination offset | 0 |
hours_old | number | Max age of postings in hours | — |
enforce_annual_salary | boolean | Normalize salaries to annual | false |
verbose | number | Log verbosity (0-2) | 0 |
output | string | Output file path (.json or .csv) | stdout |
| Credentials | |||
creds | boolean | Enable credential fallback | false |
linkedin_username | string | LinkedIn username/email | — |
linkedin_password | string | LinkedIn password | — |
indeed_username | string | Indeed username/email | — |
indeed_password | string | Indeed password | — |
glassdoor_username | string | Glassdoor username/email | — |
glassdoor_password | string | Glassdoor password | — |
ziprecruiter_username | string | ZipRecruiter username/email | — |
ziprecruiter_password | string | ZipRecruiter password | — |
bayt_username | string | Bayt username/email | — |
bayt_password | string | Bayt password | — |
naukri_username | string | Naukri username/email | — |
naukri_password | string | Naukri password | — |
Adding Custom Profiles
Editjobspy.json and add a new profile under config.profiles:
Profile Name Conventions
Profile names:- Are case-sensitive (
Frontend≠frontend) - Can include hyphens, underscores, and alphanumerics
- Cannot contain spaces (use hyphens or underscores)
frontend, backend-remote, data_analyst_nyc
Invalid: my profile, front end
Ad-Hoc Profiles
You can use--profile with a name that doesn’t exist in config.profiles. This creates a state entry for deduplication tracking without requiring a config definition:
my-search will now appear in --list-profiles and track dedup state on subsequent runs.
Credential Management in Profiles
Profiles can store credentials for authenticated scraping fallback. However, prefer environment variables over storing passwords injobspy.json.
Method 1: Environment Variables (Recommended)
Method 2: Inline in Profile (Not Recommended)
jobspy.json, ensure the file is not committed to version control. Add it to .gitignore.
State Section
Thestate section of jobspy.json is managed automatically. It stores deduplication data for each profile. See Deduplication for details.
Do not edit state manually. It is updated automatically after each profile run.
Example state after two runs:
File Location
The CLI looks forjobspy.json in this order:
- Current directory
- Git repository root (if inside a git repo, walks up to
.gitdirectory)
--init creates one in the current directory.
To use a custom path, set the JOBSPY_CONFIG environment variable:
Example Workflows
Daily Job Scraping with Dedup
jobspy.json:Multi-Region Job Search
jobspy.json:Full-Time vs Contract Tracking
Related Pages
Deduplication
How JobSpy tracks and filters previously seen jobs
Commands
Complete CLI flag reference
