DEV Community

Omar Khandji
Omar Khandji

Posted on

Google Jobs to Google Sheets every morning: a recruiter's no-code-ish pipeline

If you recruit, you probably open Google Jobs every morning, search the same three or four roles in the same cities, and copy what looks new into a spreadsheet. It works, but it is 30 minutes a day of copy-paste, and Google only shows 10 jobs per page.

Here is the short version: call one API with your searches, get one clean row per posting (salary as numbers, posted date, every apply link), and push the rows into Google Sheets on a schedule. Below is the Python version and the no-code version.

The answer first

I built a Google Jobs Scraper on Apify. Google Jobs merges LinkedIn, Indeed, Glassdoor, ZipRecruiter and company career pages, so one search covers all of them. You give it job titles and locations, and it returns deduplicated rows.

Working Python snippet

from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("om_kh/google-jobs-scraper").call(run_input={
    "queries": ["registered nurse", "physical therapist"],
    "locations": ["Houston", "Dallas"],
    "maxJobsPerSearch": 100,
    "postedWithin": "today",
    "onlyWithSalary": True,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], job["companyName"], job.get("salary"), job["applyUrl"])
Enter fullscreen mode Exit fullscreen mode

The useful inputs for a daily recruiting feed:

  • postedWithin: today, 3days, week or month. Use today for a morning run so you only see new postings.
  • scheduleType: Full-time, Part-time, Contractor, Internship or Temporary.
  • onlyWithSalary: keep only postings that show a pay range.
  • radiusKm: a hint to Google to search around each location (1 to 300 km).
  • maxJobsPerSearch: 1 to 140. Google shows 10 per page, so the Actor runs several filter variants in parallel to go further.

What the output looks like

One row per posting. This is a real example from a Chicago search (lists and description shortened):

{
  "title": "Data Analyst II",
  "companyName": "Shirley Ryan AbilityLab",
  "location": "Chicago, IL",
  "via": "Built In Chicago",
  "postedAt": "2026-09-14",
  "scheduleType": "Full-time",
  "salary": "71.2K–124K a year",
  "salaryMin": 71200.0,
  "salaryMax": 124000.0,
  "salaryPeriod": "year",
  "applyUrl": "https://builtin.com/job/…",
  "applyLinks": [
    {"source": "builtin.com", "url": "https://builtin.com/job/…"},
    {"source": "linkedin.com", "url": "https://www.linkedin.com/jobs/view/…"}
  ],
  "experienceYears": 1,
  "skills": ["Workday"]
}
Enter fullscreen mode Exit fullscreen mode

Salary comes parsed into salaryMin, salaryMax and salaryPeriod, so you can sort and filter in a sheet instead of reading text. experienceYears, skills, visaSponsorship and education are read from the description by plain rules (no AI); they stay empty when the text does not say. Each row also keeps Google's raw tags (extensions), a googleUrl that reopens the job on Google, and the country and language of the search.

Run it on a schedule with Make or n8n

You do not need to host any Python. In Make or n8n, use the Apify module/node and build three steps:

  1. Run an Actor: pick om_kh/google-jobs-scraper and paste your input JSON. Schedule the scenario every morning.
  2. Get Dataset Items: use the default dataset of the run from step 1.
  3. Google Sheets: Add a Row: map title, companyName, location, salary, postedAt and applyUrl to columns.

Every morning you open the sheet and the new postings are already there, with the direct LinkedIn or Indeed link on each row.

Pricing

$2.50 per 1,000 jobs on paid Apify plans (down to $2 on the largest plans), $3 on the free plan, no start fee. Searches Google cannot answer are reported in the run summary and not charged, and you can set maxTotalChargeUsd as a hard cap.

Limits

Google Jobs holds a few hundred postings per search at most, so for full coverage split by city or by more specific titles. Salary only appears when the employer or the board publishes it. It reads public search results; use the data in line with the laws and terms that apply to you.

MCP

AI agents can call it through https://mcp.apify.com as om_kh/google-jobs-scraper, so an assistant can run a search and summarize the results for you.

More Actors and guides: https://omarkhandji-commits.github.io/apify-actor-catalogue/guides/

Disclosure: I built this Actor.

Top comments (0)