Job listings are some of the most useful public data on the web, and some of the most annoying to collect. Google Jobs aggregates postings from every major board into one panel, but there is no endpoint to read it. I'll walk through the DIY route, where it breaks, and the shortcut: the Google Jobs Scraper (pay per result) on Apify, which turns a search query into one clean JSON record per listing and bills only for the jobs it returns.
Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.
Does Google Jobs have an API?
Not for reading. Google's Cloud Talent Solution powers search on your own career site, and the Jobs Indexing API pushes your listings into Google. Neither lets you query Google Jobs and pull other companies' postings out, which is what a job board, a recruiter, or a labor-market study actually needs. So a Google Jobs API in practice means a scraper you call like an API: send a query and a location, get structured listings back.
What the Google Jobs scraper returns
The Google Jobs scraper returns one normalized JSON record per listing: job title, employer, location, the full job description, grouped highlights, apply links, and posting metadata.
| Field | Example | Notes |
|---|---|---|
| job title | "Senior Data Scientist" | As shown on the job card |
| employer | "Mount Sinai Health System" | Company posting the role |
| location | "New York, NY" | Geographic location |
| description | full text | Complete posting, not a teaser |
| highlights | qualifications, responsibilities, benefits | Grouped sections |
| apply links | direct application URLs | Plus the source that listed the job |
Each record also carries posting metadata (detected posted date, schedule type, experience level) and a stable job identifier for de-duplication, plus per-search context like total matches and pages processed.
Who this is for
Job board builders backfilling a niche or regional board, recruiters routing new postings into an ATS or an alerts channel, labor-market researchers measuring hiring demand by role and city, and sales teams hunting for companies that are actively hiring.
The manual way, and where it breaks
You can script the jobs panel yourself: build the search URL, render it in a headless browser, and parse the job cards. The first run feels great. Then the pagination tokens change shape, half your requests hit consent walls or blocks, and the card markup drifts until your selectors return empty strings. Full descriptions load on click, so you are automating two layers of rendering, not one. I have watched this exact project eat a sprint that was budgeted at an afternoon.
The faster way: run the Google Jobs scraper
Apify Console
- Open the Google Jobs Scraper and click Try for free.
- Set
queryand, if you want,locationandnum_results. - Run it and download the dataset as JSON, CSV, or Excel.
REST
curl -X POST "https://api.apify.com/v2/acts/johnvc~google-jobs-scraper---pay-per-result/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "query": "Data Scientist", "location": "New York, NY", "num_results": 20 }'
Run endpoint reference: the Apify API docs. A saved, runnable version of this call lives in the task Export Google Jobs results by API.
Get Google Jobs listings in Python
import json
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("johnvc/google-jobs-scraper---pay-per-result").call(
run_input={
"query": "Software Engineer",
"location": "Austin, TX",
"num_results": 20,
}
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(f"{len(items)} listings")
print(json.dumps(items[0], indent=2))
The first record shows you the full shape: title, employer, location, description, highlights, and the apply links your pipeline probably cares about most.
Backfill a job board with Google Jobs
Per-result billing fits backfills, since cost tracks exactly how many listings you keep. The task Backfill a job board with Google Jobs shows the pattern, including the stable job identifier you dedupe on.
Export Google Jobs listings to CSV
For a hiring report or a quick market scan, skip the code entirely. Export Google Jobs listings to CSV runs a search and hands you a spreadsheet.
Search one role in one city
Narrow searches are where the location targeting earns its keep. Find data scientist jobs in New York and Find software engineer jobs in Austin are the same recipe pointed at two markets.
Track remote roles
Remote listings work as a query term, no special mode needed. Find remote nursing jobs by API shows it for healthcare, a category where remote postings move fast.
Use it from Claude and other MCP clients
Apify exposes the Actor through the Model Context Protocol, so Claude, Claude Code, and Cursor can run a live job search mid-conversation and answer "which hospitals in New York are hiring data scientists right now" with actual listings. You can read more about Claude and Claude Code at claude.ai.
FAQ about scraping Google Jobs
How does a Google Jobs scraper work if there is no official API?
It reads the public jobs panel the way a browser does, then normalizes each job card into a JSON record. You send a query, a location, and a result cap; the scraper handles pagination and rate control.
How much does the Google Jobs scraper cost per result?
It bills per job returned rather than a monthly rental, and my job-board write-up pegs the rate at about $0.013 per job. num_results and max_pagination cap spend before a run starts, and new Apify accounts include free platform credit for testing.
Is this scraper the same as the Google Jobs Indexing API?
No, they point in opposite directions. The Indexing API submits your own listings into Google's index; the scraper reads listings out of Google Jobs search results. If you run a job board, you may end up using both.
What are the limits of this Google Jobs scraper?
It returns what Google Jobs shows for your query and location, so coverage follows Google's own aggregation. Posted dates are detected from the card rather than guaranteed, and company or source filters match case-sensitively unless you enable regex mode. Very broad searches paginate roughly ten results at a time, which is why the rate control exists.
Can Claude use this scraper over MCP?
Yes. Connect the Apify MCP server to Claude, Claude Code, or Cursor and the scraper appears as a callable tool that runs live searches from a prompt.
Can I schedule the scraper for a daily feed of new postings?
Yes, and that is the standard setup for boards and alerting. Save your search as a task, attach an Apify schedule, and dedupe on the job identifier so each run only adds genuinely new listings. Start from the Google Jobs Scraper.
More from Truffle Pig Data
I've written about the job-board angle in more depth: Job Postings API for Job Boards: Backfill Listings at $0.013 per Job on Medium, the same story on LinkedIn, and How to backfill a job board with Google Jobs data on Peerlist.
Wrapping up
There is no official way to read Google Jobs, but the listings are still one search away as structured JSON, billed per result. Start with the Google Jobs Scraper (pay per result) and point it at the roles you track.
Top comments (0)