Google's Jobs tab aggregates Indeed, LinkedIn, Glassdoor and company career pages into one list, but it has no export and no API. I built a small Apify Actor that reads it and gives you one clean row per job. Here is how to get a CSV out of it in five minutes.
1. Run a search
Open https://apify.com/vibermacher/google-jobs, sign in (a free Apify account comes with monthly credit), and fill in:
-
query:
registered nurse -
location:
Houston,Texas,United States(City,Region,Country is the most precise form) -
country:
us(alsogb,ca,in)
Click Start. Rows appear in the Output tab as they are read, about 30 per search. Or start from a ready-made example and change nothing: registered nurse, Houston, software engineer, New York, data analyst, London, software developer, Toronto, software engineer, Bengaluru.
2. Export
Output tab → Export → CSV (or JSON, Excel). Every row has the title, company, parsed location, posted date as YYYY-MM-DD, the salary split into salary_min, salary_max, salary_currency and salary_period, the employment type, every apply link with its board, the full description and Google's own job id for deduping.
3. Or call it from code
curl -X POST "https://api.apify.com/v2/acts/vibermacher~google-jobs/run-sync-get-dataset-items?format=csv" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query":"registered nurse","location":"Houston,Texas,United States","country":"us"}' \
-o jobs.csv
Pass searches (a list of query/location/country objects) to run several searches in one call; a job two searches both find comes back once.
What it costs and where it stops
USD 0.004 per row, charged as rows are written, plus a small start fee. Set a maximum charge on the run and it stops cleanly at it. Honest limits: about 30 jobs per search (Google's infinite scroll is not available through the proxy), four countries, no job-type filter in the input (filter on employment_type in the output). Salaries are exactly what Google shows; when Google's own label does not fit the amount, the row says so instead of guessing.
If a run is blocked it fails and says so rather than returning empty "successes", and you only pay for rows written.
Top comments (0)