Powerful job scraping API that aggregates jobs from LinkedIn, Indeed, Glassdoor, Google Jobs, ZipRecruiter, and more. Search millions of jobs in seconds.
π Live API: https://jobscrape-actor.vercel.app
π API Documentation: https://jobscrape-actor.vercel.app/docs
- π Multi-Platform Support - Scrape from 8+ major job boards simultaneously
- π Fast & Reliable - Built on FastAPI for high performance
- π Multiple Formats - Export results as JSON, CSV, or Excel
- π Advanced Filtering - Filter by location, remote, job type, salary, and more
- π Global Coverage - Support for 40+ countries
- π Rich Data - Get job titles, descriptions, salaries, companies, and more
- π CORS Enabled - Ready for frontend integration
- π Interactive Docs - Swagger UI for easy API exploration
| Platform | Description |
|---|---|
| Professional network with quality job postings | |
| Indeed | Large job aggregator with extensive listings |
| ZipRecruiter | US/Canada focused job board |
| Glassdoor | Jobs with company reviews and salary data |
| Google Jobs | Aggregated job listings from Google |
| Bayt | Middle East focused job portal |
| Naukri | India's leading job portal |
| BDJobs | Bangladesh job portal |
curl -X POST "https://jobscrape-actor.vercel.app/api/scrape" \
-H "Content-Type: application/json" \
-d '{
"site_name": ["indeed", "linkedin"],
"search_term": "python developer",
"location": "San Francisco, CA",
"results_wanted": 20
}'import requests
response = requests.post(
"https://jobscrape-actor.vercel.app/api/scrape",
json={
"site_name": ["indeed", "linkedin", "glassdoor"],
"search_term": "software engineer",
"location": "New York, NY",
"results_wanted": 50,
"hours_old": 72,
"job_type": "fulltime"
}
)
jobs = response.json()
print(f"Found {jobs['total_results']} jobs")
# Access job details
for job in jobs['jobs']:
print(f"{job['title']} at {job['company']}")const response = await fetch('https://jobscrape-actor.vercel.app/api/scrape', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
site_name: ['indeed', 'linkedin'],
search_term: 'react developer',
location: 'Remote',
results_wanted: 30,
is_remote: true
})
});
const data = await response.json();
console.log(`Found ${data.total_results} jobs!`);| Endpoint | Method | Description |
|---|---|---|
/api/scrape |
POST | Main job scraping endpoint with full options |
/api/scrape/simple |
GET | Simplified endpoint for quick searches |
/api/sites |
GET | List all supported job sites |
/api/countries |
GET | List all supported countries |
/api/examples |
GET | Get example API requests |
/api/health |
GET | API health check |
/docs |
GET | Interactive API documentation (Swagger UI) |
# Simple search - just use URL parameters
https://jobscrape-actor.vercel.app/api/scrape/simple?search_term=developer&site_name=indeed&results_wanted=5| Parameter | Type | Default | Description |
|---|---|---|---|
site_name |
array | all | Job sites to scrape (e.g., ["indeed", "linkedin"]) |
search_term |
string | null | Job search term (e.g., "software engineer") |
location |
string | null | Job location (e.g., "San Francisco, CA") |
results_wanted |
integer | 20 | Number of results per site (1-100) |
is_remote |
boolean | false | Filter for remote jobs only |
job_type |
string | null | Job type: fulltime, parttime, internship, contract |
distance |
integer | 50 | Search radius in miles (0-200) |
hours_old |
integer | null | Filter jobs posted within N hours |
| Parameter | Type | Default | Description |
|---|---|---|---|
country_indeed |
string | "USA" | Country for Indeed/Glassdoor searches |
easy_apply |
boolean | null | Filter for easy apply jobs (LinkedIn) |
linkedin_company_ids |
array | null | Filter by specific LinkedIn company IDs |
description_format |
string | "markdown" | Format: markdown or html |
enforce_annual_salary |
boolean | false | Convert all salaries to annual format |
output_format |
string | "json" | Output format: json, csv, or excel |
offset |
integer | 0 | Pagination offset |
{
"success": true,
"message": "Successfully scraped 42 jobs",
"total_results": 42,
"timestamp": "2025-10-09T12:00:00.000Z",
"search_parameters": {
"site_name": ["indeed", "linkedin"],
"search_term": "python developer",
"location": "San Francisco, CA"
},
"jobs": [
{
"site": "indeed",
"title": "Senior Python Developer",
"company": "Tech Corp",
"location": "San Francisco, CA",
"job_type": "fulltime",
"date_posted": "2025-10-08",
"salary_source": "indeed",
"interval": "yearly",
"min_amount": 120000,
"max_amount": 160000,
"currency": "USD",
"is_remote": false,
"job_url": "https://...",
"description": "We are looking for...",
"benefits": "Health insurance, 401k, Remote work options",
"company_url": "https://www.techcorp.com",
"company_industry": "Technology",
"company_num_employees": "1000-5000"
}
]
}USA, Canada, UK, Australia, India, Germany, France, Spain, Italy, Netherlands, Belgium, Switzerland, Austria, Sweden, Norway, Denmark, Finland, Ireland, Poland, Brazil, Mexico, Argentina, Chile, Colombia, Singapore, Hong Kong, Japan, South Korea, UAE, Saudi Arabia, Egypt, South Africa, New Zealand, Philippines, Malaysia, Indonesia, Thailand, Vietnam, Pakistan, Bangladesh, Turkey, Israel
Integrate JobSpy API as a tool for AI agents to search and analyze job market data:
from langchain.tools import Tool
from langchain.agents import initialize_agent
import requests
def search_jobs(query: str) -> str:
"""Search for jobs using JobSpy API"""
response = requests.post(
"https://jobscrape-actor.vercel.app/api/scrape",
json={
"search_term": query,
"results_wanted": 10,
"site_name": ["indeed", "linkedin"]
}
)
return response.json()
job_search_tool = Tool(
name="JobSearch",
func=search_jobs,
description="Search for job listings across multiple platforms"
)
# Add to your LangChain agent
agent = initialize_agent([job_search_tool], llm, agent="zero-shot-react-description")Create powerful job search automation workflows:
- HTTP Request Node β JobSpy API
- Filter Node β Filter by salary/requirements
- Slack/Email Node β Send notifications
- Google Sheets Node β Save results
N8N Configuration:
{
"method": "POST",
"url": "https://jobscrape-actor.vercel.app/api/scrape",
"body": {
"site_name": ["indeed", "linkedin"],
"search_term": "{{ $json.job_title }}",
"location": "{{ $json.location }}",
"results_wanted": 50
}
}Build real-time job market dashboards with:
- Streamlit - Quick data visualization
- Tableau - Advanced analytics
- Power BI - Business intelligence
- Grafana - Monitoring job trends
Create personalized job alert systems:
# Schedule this with cron/celery
def daily_job_alert():
jobs = search_jobs("senior python developer", remote=True)
new_jobs = filter_new_jobs(jobs)
if new_jobs:
send_email_notification(new_jobs)Integrate with recruitment platforms:
- Bullhorn
- Greenhouse
- Lever
- Workable
Build job search applications:
- React Native mobile apps
- Chrome extensions for job tracking
- Progressive Web Apps (PWA)
Perfect for:
- Job market research
- Salary trend analysis
- Skills demand analysis
- Company hiring patterns
- Geographic job distribution
Help students and job seekers:
- Career path recommendations
- Market demand analysis
- Skill gap identification
- Salary expectations
Connect with 5000+ apps:
- Trigger job searches based on events
- Auto-apply to matching positions
- Send Slack notifications for new jobs
- Update Airtable with job data
Monitor competitor hiring:
- Track companies hiring patterns
- Analyze job requirements
- Identify market trends
- Plan competitive strategies
- Python 3.8+
- pip
# Clone the repository
git clone https://github.com/Amon20044/jobscraper-actor.git
cd jobscraper-actor
# Install dependencies
pip install -r requirements.txt
# Run the server
uvicorn main:app --reload --port 5001The API will be available at http://localhost:5001
fastapi
uvicorn[standard]
pandas
openpyxl
python-jobspy
python-multipart
pydantic- Fork this repository
- Import to Vercel
- Deploy automatically
- Railway - One-click deploy
- Render - Free tier available
- Heroku - Classic PaaS
- AWS Lambda - Serverless
- Google Cloud Run - Container-based
- Docker - Containerized deployment
response = requests.post(
"https://jobscrape-actor.vercel.app/api/scrape",
json={
"search_term": "python developer",
"is_remote": True,
"hours_old": 24,
"results_wanted": 50,
"site_name": ["indeed", "linkedin", "zip_recruiter"]
}
)response = requests.post(
"https://jobscrape-actor.vercel.app/api/scrape",
json={
"search_term": "data scientist",
"location": "New York, NY",
"enforce_annual_salary": True,
"results_wanted": 100,
"output_format": "csv" # Export to CSV for analysis
}
)response = requests.post(
"https://jobscrape-actor.vercel.app/api/scrape",
json={
"site_name": ["naukri", "indeed"],
"search_term": "software engineer",
"location": "Bangalore",
"country_indeed": "India",
"results_wanted": 30
}
)Contributions are welcome! Feel free to:
- Report bugs
- Suggest features
- Submit pull requests
- Improve documentation
This project is licensed under the MIT License - see the LICENSE file for details.
- Built with python-jobspy by @cullenwatson
- Powered by FastAPI
- Deployed on Vercel
Amon Sharma
- GitHub: @Amon20044
- LinkedIn: Amon Sharma
If you find this project useful, please consider:
- β Starring the repository
- π΄ Forking and contributing
- π Reporting issues
- π’ Sharing with others
- π Website: https://jobscrape-actor.vercel.app
- π Documentation: https://jobscrape-actor.vercel.app/docs
- π Issues: GitHub Issues
Made with β€οΈ by Amon Sharma