DEV Community

krammer liu
krammer liu

Posted on

How to get Google Jobs listings as JSON with Python (with salary data)

When you search "data engineer jobs in Austin" on Google, you get the job panel: postings from LinkedIn, Indeed, company career pages and many smaller boards, merged in one list. This is Google Jobs (also called Google for Jobs).

It is a very good data source. The problem: Google does not offer an API for it. (Google Cloud Talent Solution is a different product. It searches your own job postings, not Google's.)

So the usual options are:

  1. Scrape it yourself. Google blocks automated requests fast. You need proxies, retries, and parsing code that you fix every time Google changes the page.
  2. Use a SERP API subscription. It works, but most plans are monthly subscriptions, and you get the raw text: "$150K–$200K a year", "3 days ago". You still parse it.
  3. Use a ready-made scraper and pay per use. This is what this post shows.

The 10-line version

I built a Google Jobs Scraper on Apify. You give it search queries and locations; it returns one JSON item per job posting.

pip install apify-client
export APIFY_TOKEN=<your token>   # free account: Apify Console > Settings > API & Integrations
Enter fullscreen mode Exit fullscreen mode
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("krammer/google-jobs-scraper").call(run_input={
    "queries": ["data engineer"],
    "locations": ["Austin, TX"],
    "country": "us",           # us, gb, in, de
    "datePosted": "7d",        # any, 24h, 3d, 7d, 30d
    "maxResultsPerSearch": 50, # 1 to 200
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], "|", job["company"], "|", job["salaryMin"], job["salaryMax"])
Enter fullscreen mode Exit fullscreen mode

What you get back

One item per posting (abridged, company name replaced):

{
  "job_id": "RtLv7vlPTbn2E40SAAAAAA==",
  "title": "Staff Software Engineer - Card Technology",
  "company": "Example Corp",
  "location": "New York, NY (+3 others)",
  "description": "Example Corp is hiring a Staff Software Engineer ...",
  "apply_options": [{ "title": "Example Corp Careers", "link": "https://careers.example.com/jobs/12345" }],
  "salary": "$150K–$200K a year",
  "posted": "3 days ago",
  "salaryMin": 150000,
  "salaryMax": 200000,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "postedDate": "2026-11-05",
  "jobTypes": ["FULLTIME"],
  "workMode": null
}
Enter fullscreen mode Exit fullscreen mode

The raw Google text is kept (salary, posted), and the Actor also parses it into fields you can sort and filter on: salaryMin, salaryMax, salaryCurrency, salaryPeriod, postedDate, jobTypes and workMode (remote or hybrid). Postings that do not show a salary on Google have null there.

Three things to build with it

The full scripts are in this repo: krammer0/google-jobs-scraper-examples. search_jobs() below is the 10-line call above, wrapped in a function (common.py).

1. Compare salaries across cities

Search one role in several cities and take the median of the yearly ranges:

from statistics import median

jobs = search_jobs(["data engineer"], ["New York, NY", "Austin, TX", "Seattle, WA"])
yearly = [j for j in jobs if j["salaryPeriod"] == "year" and j["salaryCurrency"] == "USD"
          and j["salaryMin"] is not None and j["salaryMax"] is not None]
for city in {j["searchLocation"] for j in yearly}:
    js = [j for j in yearly if j["searchLocation"] == city]
    print(city, len(js), median(j["salaryMin"] for j in js), median(j["salaryMax"] for j in js))
Enter fullscreen mode Exit fullscreen mode

2. Find the companies that are hiring

Recruiters and sales teams use this to see who is hiring for what, and where:

from collections import Counter

jobs = search_jobs(["registered nurse"], ["Chicago, IL"])
for company, count in Counter(j["company"] for j in jobs).most_common(20):
    print(count, company)
Enter fullscreen mode Exit fullscreen mode

3. Daily job alerts without duplicates

Run with datePosted: "24h" once a day and keep the job_id values you have already seen:

fresh = [j for j in search_jobs(["python developer"], ["London"], country="gb", datePosted="24h")
         if j["job_id"] not in seen]
Enter fullscreen mode Exit fullscreen mode

You can schedule the run in Apify Console, or call it from cron, n8n or an AI agent (the Actor works with the Apify MCP server).

What it costs

You pay per Google results page (up to 10 jobs): $0.028 to $0.09 per page, depending on your Apify plan. Searches that return nothing are free. For example, 50 jobs is about 5 pages, so $0.45 or less on the Free plan, and Apify's free plan includes monthly credit to try it.

Supported countries right now: United States, United Kingdom, India and Germany.

Links

If you need another country or another field, leave a comment.

Top comments (0)