---
title: "How to Scrape Google Jobs Listings (2026) | Scrape.ly"
description: "Scrape Google Jobs by role and city: title, company, source board, pay, highlights and apply links, with a real run, its cost and code for curl and Python."
url: https://scrape.ly/blog/scrape-google-jobs
markdown: https://scrape.ly/blog/scrape-google-jobs.md
---

[Tutorials](https://scrape.ly/blog/category/tutorials.md)

# How to Scrape Google Jobs Listings: Titles, Pay and Apply Links

Google Jobs pulls openings from LinkedIn, Indeed, ZipRecruiter and company career sites into one panel. Here is how to scrape Google Jobs by role and city and get each job as a row with company, source board, highlights and apply link, with a real run, its cost and code.

[Openrole Actor publisher on the Scrape.ly Store](https://scrape.ly/blog/author/openrole.md)

- Published

  Oct 23, 2026

- Reading time

  9 min read

![Pixel-art robot with an orange >\_ on its terminal head lifts a job card with a briefcase icon off a search results page headed by the Google G logo, where more job cards are listed, and drops it into a crate](https://scrape.ly/media/scrape-google-jobs.png?w=1080)

To scrape Google Jobs, send a role and a city to a scraper that opens Google's public Jobs panel and saves each listing as a row: title, company, location, the board Google credits (LinkedIn, Indeed, a careers site), posting age, schedule, highlights such as qualifications and benefits, and the apply links. The fastest way is the Google Jobs Scraper on Scrape.ly. It handles the browser Google insists on and costs $4 per 1,000 jobs, with no Google account or proxy of your own.

Because Google Jobs collects openings from many job boards and company sites, one search gives you a cross-board view of a market that no single board offers. This guide covers the no-code steps, the API (curl, Python, Node.js and AI agents over MCP), the cost and the pitfalls, all from a real run on 23 October 2026: software engineer jobs in San Francisco.

## What data you can get from Google Jobs

The [Google Jobs Scraper](https://scrape.ly/store/openrole/google-jobs-scraper.md) writes one row per job. These are the fields you'll use most:

| Field                                                     | What it holds                                                                         |
| --------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| `title`, `company_name`                                   | Job title and employer                                                                |
| `location`, `search_location`                             | The place on the listing ("San Francisco, CA", "Anywhere") and the place you searched |
| `via`                                                     | The source Google credits: LinkedIn, Indeed, ZipRecruiter, a company careers site     |
| `description`                                             | The job description text                                                              |
| `extensions`, `detected_extensions`                       | Tags such as "3 days ago", "Full-time", a salary range, "No degree mentioned"         |
| `job_highlights`                                          | Google's Qualifications, Benefits and Responsibilities lists                          |
| `apply_options`                                           | Where to apply, with links                                                            |
| `share_link`, `source_link`                               | Google's share link for the job and the source page                                   |
| `query`, `country`, `language`, `google_domain`           | The search context of the row                                                         |
| `total_jobs_found`, `pages_processed`, `search_timestamp` | Run details                                                                           |

Salary, highlights and apply links appear only when Google shows them for that listing.

## How to scrape Google Jobs without code

1. Open the [Actor's page](https://scrape.ly/store/openrole/google-jobs-scraper.md) in the Scrape.ly Store.
2. Pick a ready-made input. We used [Software engineer jobs in San Francisco, 10 jobs](https://scrape.ly/store/openrole/google-jobs-scraper/presets/search.md). Other presets cover [jobs from the last 24 hours](https://scrape.ly/store/openrole/google-jobs-scraper/presets/search-filters.md) and nursing jobs in Berlin.
3. Change the role and city to yours. This is the exact input of our run:

```json
{
  "query": "Software Engineer",
  "location": "San Francisco, CA",
  "maxResults": 10,
  "country": "us",
  "language": "en",
  "googleDomain": "google.com",
  "postedWithin": "any"
}
```

4. Click **Start**. Our run took 13 seconds; the publisher's tests put typical runs at 50 to 120 seconds, depending on how quickly Google lets a browser session through.
5. Export the jobs as JSON, CSV or Excel.

The fields that matter most:

- `query`: the role or keywords, as you'd type them into Google Jobs.
- `location`: a city gives the closest match. If a location search comes back thin, the run retries once with the city added to the query.
- `maxResults`: up to 100 jobs per run, about 10 per page.
- `country`, `language`, `googleDomain`: pick the market, for example `de`, `de` and `google.de` for Germany.
- `postedWithin`: `any`, `24h`, `3d`, `7d` or `30d`. Listings without a date stay in.
- `locationRadiusKm`: optional radius around the location.

Scrape.ly Store Google Jobs Scraper Public Google Jobs listings by role and city: company, source board, tags, highlights and apply links. The browser Google requires is handled for you. $4 per 1,000 jobs.

[Try it free](https://scrape.ly/store/openrole/google-jobs-scraper.md) [Browse the Store](https://scrape.ly/store.md)

## How to scrape Google Jobs with the API

Create an API token under **Settings → API & Integrations** and export it as `SCRAPELY_TOKEN`.

Our run finished in 13 seconds, so the synchronous endpoint returned the jobs in one request:

```shell
curl -X POST "https://api.scrape.ly/v2/actors/openrole~google-jobs-scraper/run-sync-get-dataset-items"
  -H "Authorization: Bearer $SCRAPELY_TOKEN"
  -H "Content-Type: application/json"
  -d '{"query": "Software Engineer", "location": "San Francisco, CA", "maxResults": 10, "country": "us", "postedWithin": "any"}'
```

The synchronous call waits up to 45 seconds and answers `408` if the run needs longer, while the run keeps going. Because Google sometimes takes a minute or two to let a session through, use the asynchronous flow (`/runs`, then wait, then read the dataset) for scheduled jobs; the [Actors API docs](https://scrape.ly/docs/api-actors.md) show it.

Python (`pip install scrapely-client-python`). `call()` waits however long the run takes. Google often puts the pay range in the Benefits highlights rather than in a tag, so this example checks both:

```python
import os
from scrapely_client import ScrapelyClient

client = ScrapelyClient(os.environ["SCRAPELY_TOKEN"], api_url="https://api.scrape.ly")

run = client.actor("openrole/google-jobs-scraper").call(
    run_input={"query": "Software Engineer", "location": "San Francisco, CA", "maxResults": 10, "country": "us"}
)
print(run.status)  # SUCCEEDED, FAILED, ABORTED or TIMED-OUT
for job in client.dataset(run.default_dataset_id).iterate_items():
    tags = job.get("detected_extensions") or {}
    pay = tags.get("salary") or next(
        (item for h in job.get("job_highlights") or [] for item in h["items"] if "$" in item), "")
    print(f'{job["company_name"][:22]:22} {job["via"][:16]:16} {tags.get("posted_at", ""):12} {pay[:60]}')
```

Node.js (`npm install scrapely-client`):

```javascript
import { ScrapelyClient } from 'scrapely-client';

const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN, baseUrl: 'https://api.scrape.ly' });

const run = await client.actor('openrole/google-jobs-scraper').call({
  query: 'Software Engineer',
  location: 'San Francisco, CA',
  maxResults: 10,
  country: 'us',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((j) => [j.title, j.company_name, j.via, (j.apply_options  []).map((a) => a.link)]));
```

For AI agents, add the Scrape.ly MCP server. In Cursor, put this in `~/.cursor/mcp.json`:

```json
{
  "mcpServers": {
    "scrapely": {
      "url": "https://api.scrape.ly/mcp",
      "headers": { "Authorization": "Bearer YOUR_TOKEN" }
    }
  }
}
```

In Claude Code, run `claude mcp add --transport http scrapely https://api.scrape.ly/mcp` and sign in with `/mcp`. Then ask: "Use scrapely to run openrole/google-jobs-scraper for Software Engineer in San Francisco, 10 jobs, and give me a table of title, company, source and pay." When a run needs more than 45 seconds, the agent polls `get-actor-run` and then reads the rows. The [Google Jobs API](https://scrape.ly/api/google-jobs-api.md) page shows the same Actor as an API product.

## A real run: software engineers in San Francisco

We ran the "Software engineer jobs in San Francisco, 10 jobs" preset on 23 October 2026. It returned 10 jobs in 13 seconds and was charged $0.0808. The first five rows:

| Title                                                            | Company  | Location                     | Via           | Tags                                                        | Apply via     |
| ---------------------------------------------------------------- | -------- | ---------------------------- | ------------- | ----------------------------------------------------------- | ------------- |
| Staff Software Engineer - Autonomous Verification Platform       | Uber     | San Francisco, CA (+1 other) | Jobs.uber.com | 3 days ago, Full-time                                       | Jobs.uber.com |
| Staff Software Engineer, Photos Create                           | Google   | San Francisco, CA            | LinkedIn      | 2 days ago, Full-time                                       | LinkedIn      |
| .NET Software Engineer                                           | Deloitte | San Francisco, CA            | Indeed        | 5 days ago, 80K–115K a year, Full-time, No degree mentioned | Indeed        |
| Senior Software Engineer — Employee Experience Engineering (EXE) | Block    | San Francisco, CA            | LinkedIn      | 2 days ago, Full-time                                       | LinkedIn      |
| Software Engineer II, Merchant Intel 5                           | Uber     | San Francisco, CA (+1 other) | Jobs.uber.com | 10 days ago, Full-time, No degree mentioned                 | Jobs.uber.com |

Employers and job boards are businesses, so nothing needed masking. What the full ten show:

- **Six sources in one search.** The ten jobs came via LinkedIn (3), Uber's careers site (3), Indeed, ZipRecruiter, Callings.ai and Intuitive Surgical's careers site. That cross-board view is the main reason to scrape Google Jobs instead of one board.
- **Pay hides in the highlights.** Only 3 of 10 rows had a salary tag, but 9 of 10 carried a pay range inside `job_highlights`, from Deloitte's "$80000 to $115000" to "$405,000—$485,000 USD" at Anthropic. Read both places.
- **Fresh listings.** Every job was 2 to 10 days old, and each tag says so ("2 days ago").
- **Structured highlights.** Nine of ten had Qualifications, Benefits and Responsibilities lists, which makes skills analysis a matter of reading arrays instead of parsing prose.
- **Remote shows up too.** Two jobs were listed as "Anywhere" and two as "San Francisco, CA (+1 other)", so filter on `location` if you need on-site roles only.

The log, without the platform's start-up lines:

```plaintext
20261023T03:01:20.064Z [Scrapely] Container started (setup 1.7 s)
20261023T03:01:21.602Z [scrapely.actor] INFO  query=Software Engineer location=San Francisco, CA country=us limit=10
20261023T03:01:22.462Z [scrapely.actor] INFO  page status=200 kind=challenge listings=0 profile=chrome146 proxied=True attempts=chrome146:challenge:200:92743
20261023T03:01:22.462Z [scrapely.actor] INFO  The jobs page needs a browser. Opening browser sessions.
20261023T03:01:30.687Z [scrapely.actor] INFO  browser sessions=1 exits=US listings=10
20261023T03:01:31.195Z [scrapely.actor] INFO  [Status message]: Saved 10 job listings.
20261023T03:01:31.878Z [Scrapely] Container state: status=exited exitCode=0 oomKilled=false
```

The third line is the reason DIY Google Jobs scrapers stall: a plain request gets Google's script challenge and zero listings. The Actor switched to a hosted browser on a US exit and had all ten jobs eight seconds later. You don't configure anything for it.

## What it costs

The Actor charges one event: $0.004 per job saved, which is $4 per 1,000. A search that saves no jobs has no result charge. Compute, browser time and proxy traffic are billed as platform usage on top.

For our run: 10 jobs × $0.004 = $0.04 in job fees. The run was charged $0.0808 in total: $0.039 of browser time (Google requires a real browser for this page), $0.0018 of compute and well under a cent of proxy traffic and storage. A full 100-job run costs $0.40 in job fees plus its browser time. The Free plan's $5 of monthly credit covers dozens of searches like ours, and a maximum charge per run stops a run before it goes over your limit.

## What to watch out for when scraping Google Jobs

- **Up to 100 jobs per run.** Google serves about 10 jobs per page, and each run collects up to 100 of them. For a whole market, split by city, keyword or posting window and run several searches in parallel.
- **Google's traffic checks.** Google shows a check to many browser exits. The Actor tries up to twelve fresh sessions, three at a time, preferring exits in the searched country. If all are checked, the run fails with a clear status instead of an empty "success". Spread your searches over time rather than starting many at once.
- **Some countries have no Google Jobs.** Australia, New Zealand, Ireland, South Korea, Poland, the Czech Republic, Turkey, Ukraine, Israel, Norway, Sweden, Finland and the Baltic states return no listings. Those runs stop before searching and are not charged.
- **Apply links follow the open listing.** Google loads apply options for the listing that is open, so the Actor keeps only links that belong to that job, and jobs from later pages often have just `share_link`. Use it to open the job on Google.
- **Pay is optional.** Salary tags, highlights and apply links appear only when Google shows them. Check `job_highlights` for a pay range when the tag is missing.
- **Personal data.** Job ads sometimes name a recruiter. Employers are businesses; a named recruiter is a person, so keep only what you need.

## Is it legal to scrape Google Jobs?

The Actor reads Google's public Jobs search, the same page any visitor sees, without signing in. The listings are job ads that employers published to attract applicants, and the rows hold business facts: titles, companies, locations and posted pay.

Google's [Terms of Service](https://policies.google.com/terms) refer to the robots.txt instructions on its pages for automated access, so read the current terms and check how they apply to your project before you start.

Responsible practice keeps the footprint small: set `maxResults` and a maximum charge per run so each job stays at a modest volume, and use the listings for research rather than republishing Google's pages. Privacy law applies to anyone named in a job ad: a recruiter's name or email is personal data under the GDPR and the CCPA, so collect only what you need. Our guide on [whether web scraping is legal](https://scrape.ly/blog/is-web-scraping-legal.md) covers the general rules. This is not legal advice; if Google Jobs data drives a commercial product, get legal advice for your use case.

## Why Scrape.ly for Google Jobs

- **There is no public API for the Jobs panel.** Google's job-search API, Cloud Talent Solution, is a search engine for [your own job content](https://cloud.google.com/talent-solution/job-search/docs): it indexes the jobs you upload and searches "your corpus of jobs". It doesn't return the listings Google shows in Search. The Actor does.
- **The browser is built in.** ScrapingBee's tutorial needs `custom_google`, `render_js` and a custom scrolling script to load the panel before parsing it. Here the Actor detects Google's challenge and opens a hosted browser itself, as the log shows.
- **Structured rows, not HTML.** Highlights arrive as arrays, apply options as title and link pairs, and tags as named fields (`posted_at`, `schedule_type`, `salary`), ready for a spreadsheet, a database or an LLM.
- **One API for every job source.** The same publisher maintains scrapers for the boards Google aggregates. Pair this run with our [Indeed guide](https://scrape.ly/blog/scrape-indeed.md), [LinkedIn jobs](https://scrape.ly/blog/scrape-linkedin-jobs.md) and the [Indeed Scraper](https://scrape.ly/store/openrole/indeed-scraper.md), or read the [job scraping guide](https://scrape.ly/blog/job-scraping.md) for the full workflow.

## FAQ

### Does Google have a Google Jobs API?

Not for the listings in Search. Google's Cloud Talent Solution is an API for searching job content you index yourself. To collect what Google Jobs shows for a role and city, use a scraper that reads the public panel, such as the Google Jobs Scraper.

### Can I scrape Google Jobs with Python?

Yes. Install `scrapely-client-python`, call `openrole/google-jobs-scraper` with a query and location, and iterate over the dataset, as in the example above. You don't need Selenium, a headless browser or a proxy pool.

### How many jobs can I get from one Google Jobs search?

Up to 100 per run, about 10 per page. Run several searches (other cities, keywords or posting windows) to go further.

### Can I get only jobs posted in the last 24 hours?

Yes. Set `postedWithin` to `24h`, or start from the [last-24-hours preset](https://scrape.ly/store/openrole/google-jobs-scraper/presets/search-filters.md). Listings without a date stay in, so check `detected_extensions.posted_at` too.

### How much does it cost to scrape Google Jobs?

$0.004 per job, so $4 per 1,000, plus browser and compute usage. Our 10-job run was charged $0.0808 in total.

Scrape.ly Store Scrape Google Jobs Run the San Francisco software engineer preset as-is, or type your own role, city and country. Up to 100 jobs per run at $4 per 1,000.

[Try it free](https://scrape.ly/store/openrole/google-jobs-scraper.md) [Browse the Store](https://scrape.ly/store.md)

About the author

[Openrole](https://scrape.ly/blog/author/openrole.md) Actor publisher on the Scrape.ly Store

Every open role, wherever it is posted: job boards, company ATS pages and freelance markets in dozens of countries. For recruiters, labour-market analysts and job aggregators. A Scrapely studio.

- [Website](https://scrape.ly/users/openrole.md)

Keep reading

## More in Tutorials

- [![Pixel-art robot with an orange >\_ on its terminal head pulls a review card with five red rating squares out of a shop front with a striped awning and the red Yelp burst logo on its sign, and drops it into a crate](https://scrape.ly/media/scrape-yelp-reviews.png?w=750)](https://scrape.ly/blog/scrape-yelp-reviews.md)
  ### [How to Scrape Yelp Reviews and Business Data](https://scrape.ly/blog/scrape-yelp-reviews.md)
  [Scrape Yelp reviews for any business URL: full text, stars, dates, photos, reactions and the owner's reply, with keyword, star and date filters. Plus business details from the same page. A real run, its cost, and code for curl, Python, Node.js and AI agents.](https://scrape.ly/blog/scrape-yelp-reviews.md)
- [![Pixel-art robot with an orange >\_ on its terminal head pulls a product card with a photo and a green price out of a shop front with a green-striped awning and the green Shopify bag logo on its sign, and drops it into a crate](https://scrape.ly/media/scrape-shopify-stores.png?w=750)](https://scrape.ly/blog/scrape-shopify-stores.md)
  ### [How to Scrape Any Shopify Store: Products, Prices and Variants](https://scrape.ly/blog/scrape-shopify-stores.md)
  [Scrape any public Shopify store from a store, collection or product URL and get one row per product with every variant, price, sale price, stock status, SKU, weight and image. A real run on Allbirds, its cost, and code for curl, Python, Node.js and AI agents.](https://scrape.ly/blog/scrape-shopify-stores.md)
- [![Pixel-art robot with an orange >\_ on its terminal head lifts a search result off a results page headed by the blue Bing logo and a search box, and drops it into a crate](https://scrape.ly/media/scrape-bing-search-results.png?w=750)](https://scrape.ly/blog/scrape-bing-search-results.md)
  ### [How to Scrape Bing Search Results: Rankings, Related Searches and News](https://scrape.ly/blog/scrape-bing-search-results.md)
  [Scrape Bing search results in any of 38 markets and get every results page as JSON: organic rankings with titles, URLs and dates, related searches, People Also Ask and the top news story. A real run, the cost per page, and code for curl, Python, Node.js and AI agents.](https://scrape.ly/blog/scrape-bing-search-results.md)

## The internet is full of data. Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

[Get Started Free](https://my.scrape.ly/register) [Chat with Support](mailto:support@scrape.ly?subject=Question%20about%20Scrape.ly\&body=Hi%2C%20I%20have%20a%20question%20about%20Scrape.ly.)

No credit card. No setup calls.
