Full-stack job search app:
- Frontend: React + TypeScript + Vite
- Backend: FastAPI + Uvicorn
- Job data source: SerpApi Google Jobs engine
Users can enter a job title and select one or more locations. The backend runs the scraper, writes results to google_jobs_combined.json, and the frontend displays the updated jobs list.
- Node.js (for the frontend)
- Python 3.10+ (recommended) for the backend
- A SerpApi API key (free/paid plans available)
- Create an account on SerpApi:
https://serpapi.com/ - Copy your API key from your dashboard
This app expects the key in an environment variable named SERPAPI_API_KEY.
From the project root:
python -m pip install -r backend/requirements.txtCreate backend/.env:
SERPAPI_API_KEY=YOUR_SERPAPI_KEY_HEREMake sure .env is ignored by git (already recommended):
backend/.env
.envcd backend
python -m uvicorn api:app --reload --host 0.0.0.0 --port 8000Backend endpoints:
GET /jobs: returns the jobs currently saved ingoogle_jobs_combined.jsonPOST /search: accepts{ "job_title": string, "locations": string[] }, runs the scraper, returns the new jobs list
From the project root:
npm install
npm run devThe frontend runs on http://localhost:5173 and calls the backend on http://localhost:8000.
Use:
python -m uvicorn api:app --reload --host 0.0.0.0 --port 8000Or reinstall backend deps:
python -m pip install -r backend/requirements.txtIf you see an error like “Missing SERPAPI_API_KEY”, create backend/.env and add your key:
SERPAPI_API_KEY=YOUR_SERPAPI_KEY_HERE- Scraping can take a little time depending on query/locations and pagination.
google_jobs_combined.jsonis written bybackend/scraper.pyand read bybackend/api.py.