How to scrape Google Jobs listings from their source boards

Last updated

Google Jobs is an aggregator, not a job board: it indexes postings that employers and boards like Indeed, LinkedIn and Glassdoor publish with JobPosting structured data, and shows a trimmed card for each. The same postings come from those source boards with fuller fields, so the way to scrape Google Jobs is to sweep the boards directly. Datapika's job board scraper on Apify does that in one run at $0.005 per job, returning salary, company rating, employee count and the full description per row. It has 27,458 runs and 2,471 users, with 381 active in the last 30 days.

Why is Google Jobs an aggregator rather than a job board?

Google Jobs does not host postings. Employers and job sites mark up their own pages with JobPosting structured data, ping Google through the Indexing API so Googlebot crawls them sooner, and Google folds the results into the jobs panel in Search. Google's own documentation recommends the Indexing API over sitemaps for job posting URLs for that reason. Every card in that panel therefore points back to an origin: an Indeed listing, a LinkedIn listing, a Glassdoor listing, or a company careers page. The card typically shows title, company, location and a posting age, sometimes a pay figure, and then hands you off to the source to read the rest. That is why scraping Google Jobs is a detour. The source board holds the full description, the direct apply link, company size, revenue and rating, and a salary field flagged as board data rather than guessed from text. Datapika's scraper reads those boards directly and merges duplicates into one row, which is the coverage Google Jobs advertises with the fields it hides.

  • Postings enter Google Jobs through JobPosting structured data on the employer's or board's own page (Google Search Central docs)
  • Google recommends the Indexing API over sitemaps for job URLs so new postings are crawled sooner
  • Each Google Jobs card links out to Indeed, LinkedIn, Glassdoor, ZipRecruiter or a careers page for the full posting
  • Google documents no read API for its jobs panel; Cloud Talent Solution is a separate product for building search over job content you upload
  • Datapika returns the source rows with salary_source, company_rating, company_num_employees and job_url_direct
  • Duplicates across boards are merged, so a job Google would show once still lands as one row

How do you set up a Google Jobs style sweep in Datapika?

Start with searchTerm, which is required, or searchTerms with up to 5 queries that run in sequence and merge, each row tagged with matched_search_term. Add a location such as New York, London or Remote; distance defaults to 50 miles around it. Choose sites. The default list is linkedin, indeed, glassdoor, zip_recruiter, bayt and naukri, which are the six boards currently returning results, and google stays selectable if you want to include it. If you do include it, put the exact phrase from the Google Jobs search box into googleSearchTerm; that input affects only the Google board. Set countryIndeed for Indeed and Glassdoor when the market is outside the US, for example uk, canada, australia, germany, france, india, singapore or uae. Then narrow with hoursOld (24 for a daily pull, 168 for weekly), isRemote, jobType (fulltime, parttime, contract, internship, temporary) and easyApply. maxResults defaults to 20 per board per term and caps at 100, so total rows are bounded by maxResults times boards times terms before deduplication.

  • searchTerm is required; searchTerms accepts up to 5 queries merged as an OR search
  • sites default: linkedin, indeed, glassdoor, zip_recruiter, bayt, naukri; add google explicitly
  • googleSearchTerm: paste the phrase from the Google Jobs UI, applies to the Google board only
  • countryIndeed steers Indeed and Glassdoor; LinkedIn is global
  • hoursOld, isRemote, jobType, easyApply, distance and offset narrow or page the results
  • maxResults 1 to 100 per board per term, default 20

What Google Jobs quirks should you know before running it?

Google is the odd board in the list, and four behaviors matter. First, Google Jobs has no country switch of its own in this scraper; countryIndeed steers Indeed and Glassdoor, while Google follows the location string and the phrase you pass in googleSearchTerm. Second, that phrase should be copied verbatim from the Google Jobs search box, which the scraper's notes list as the query format that works best for that board. Third, since Google aggregates the other boards, any row it returns is likely to collide with an Indeed, LinkedIn or Glassdoor row for the same posting; the scraper deduplicates, so the merged row carries the richer source fields and Google adds little on its own. Fourth, google is off the default sites list since v1.0.49 (2026-08-03), so a default run never waits on it; the FAQ below covers why and what to run instead. Google accepts the shared filters isRemote, jobType and hoursOld, as the scraper's remote full-time last-24-hours example, which lists google among its sites, shows.

  • No country input for Google; countryIndeed applies to Indeed and Glassdoor only
  • googleSearchTerm should be the exact phrase from the Google Jobs search box
  • Rows from Google usually duplicate a source board row and are merged by the deduplicator
  • Removed from the default sites list in v1.0.49 (2026-08-03), still selectable
  • Shared filters isRemote, jobType and hoursOld apply to the Google board
  • LinkedIn, one of Google's sources, rate-limits around 100 results per IP, so residential proxy is the default

Which boards reproduce Google Jobs coverage for a given market?

Google Jobs is only as wide as its feeders, so pick the ones that match your market; the full board list lives at datapika.com/scrape. For the United States, run indeed, linkedin, glassdoor and zip_recruiter together; Indeed is the board the scraper's notes rate most reliable with no rate limiting, so it is the anchor for large pulls. For the UK, Canada, Australia, Germany, France, Singapore or the UAE, keep linkedin and set countryIndeed so Indeed and Glassdoor query the local site. For India, add naukri, which returns skills, experience_range, vacancy_count and work_from_home_type that no Google card shows. For the Gulf, add bayt, which supports searchTerm only. Speed differs by board: Indeed and LinkedIn rows land 5 to 20 seconds after start, while Glassdoor, ZipRecruiter, Bayt and Naukri go through a real browser and take 1 to 3 minutes. One run tops out at 100 results per board per term across 5 terms, or 4,000 rows over 8 boards, with offset for paging beyond that.

  • US: indeed, linkedin, glassdoor, zip_recruiter; ZipRecruiter covers the US and Canada only
  • UK, Canada, Australia, Germany, France, India, Singapore, UAE: set countryIndeed for Indeed and Glassdoor
  • India: naukri adds skills, experience_range, vacancy_count and work_from_home_type
  • Middle East: bayt, searchTerm filter only
  • Indeed and LinkedIn rows arrive in 5 to 20 seconds; browser-based boards take 1 to 3 minutes
  • Ceiling per run: 100 per board per term, 5 terms, 4,000 rows; page with offset

How do developers and AI agents call the scraper instead of a Google Jobs API?

There is no endpoint to query Google's jobs panel, so the scraper stands in for one. From the Apify Console you fill the form, run it, and download the dataset as JSON, CSV, Excel, XML or RSS. From code, POST the input to api.apify.com/v2/acts/openclawai~job-board-scraper/runs with your token and read the default dataset, or call run-sync-get-dataset-items to get the rows back in a single request. Python users install apify-client and call client.actor('openclawai/job-board-scraper').call(run_input=...), then list_items on the returned dataset id; Node users do the same with npm i apify-client. For agents, add https://mcp.apify.com/?tools=fetch-actor-details,openclawai/job-board-scraper to Claude, ChatGPT, Cursor or any MCP client and the assistant can run a search and reason over the rows. Zapier, Make and n8n connect through the Apify app for scheduled pushes to Sheets, Airtable, Slack or a CRM, and a webhook on run finish triggers downstream processing. The listing shows 27,458 runs and a 5.0 rating from 3 reviews.

  • Console: form in, dataset out as JSON, CSV, Excel, XML or RSS
  • REST: POST /v2/acts/openclawai~job-board-scraper/runs, or run-sync-get-dataset-items for one call
  • Python and Node: apify-client with actor id openclawai/job-board-scraper
  • MCP: https://mcp.apify.com/?tools=fetch-actor-details,openclawai/job-board-scraper
  • Zapier, Make, n8n and webhooks for schedules and downstream pushes
Field coverage for the google board versus the source boards, from the scraper's field list (google currently returns no rows)
FieldPopulated on Google Jobs?Notes
id, title, company, location, job_urlYes, when Google returns rowsCore fields on every board; same shape on Indeed, LinkedIn and Glassdoor rows
siteYesValue is google for rows the Google board produced
job_url_directWhen availableDirect apply link; the documented Indeed sample points at careers.jpmorgan.com
date_posted, job_type, is_remoteYesFilters hoursOld, jobType and isRemote apply to the Google board
job_levelNoLinkedIn only
company_countryNoIndeed only
company_rating, company_reviews_countNot documented for GooglePopulated on Indeed and Glassdoor rows; Naukri also returns company_rating
company_num_employees, company_employees_label, company_revenue, company_revenue_label, company_industryNot documented for GoogleBoard-provided company profile; the Indeed sample shows 10,000+ employees and more than $10B revenue
salary_min, salary_max, salary_currency, salary_intervalWhen the posting lists paysalary_source is direct_data for board figures or description when parsed from text; enforceAnnualSalary normalizes intervals
description, emailsYesMarkdown by default or HTML via descriptionFormat; emails are extracted from the text
skills, experience_range, vacancy_count, work_from_home_typeNoNaukri only
search_term, matched_search_term, scraped_atYesEvery row; matched_search_term identifies which of up to 5 queries found it

How to do it

  1. 1.Open https://apify.com/openclawai/job-board-scraper, enter a searchTerm (or up to 5 searchTerms) and a location, and leave sites on the six-board default; add google explicitly only if you want to test it, with the Google Jobs phrase in googleSearchTerm.
  2. 2.Set countryIndeed for a non-US market, then add hoursOld 24 for a daily feed and isRemote or jobType as needed; keep maxResults at 20 for a first pass and raise it to 100 once the rows look right.
  3. 3.Run it. Indeed and LinkedIn rows land within 5 to 20 seconds; the browser-based boards follow in 1 to 3 minutes, deduplicated against each other.
  4. 4.Export JSON, CSV or Excel, read the dataset through the API, or attach the MCP URL to your agent and schedule the same input daily.
Run a search

Questions, answered

Does Google Jobs have an official API?

No. Google offers no API that reads the jobs panel in Search. Its Search Central documentation covers only the inbound side: employers add JobPosting structured data and call the Indexing API so Googlebot picks up postings sooner. Cloud Talent Solution is a separate Google Cloud product that builds search over job content you upload to it, not a feed of what Google shows searchers. That leaves reading the source boards directly, which is what this page describes and what the scraper does.

Why does the google board currently return no results?

Because of platform-side changes on Google's end that stopped the board returning rows. The v1.0.49 release on 2026-08-03 removed google from the default sites list so default runs no longer wait on it, and the site notes say it will resume when the platform stabilizes. It stays selectable in the meantime. Since Google only indexes postings that already live on Indeed, LinkedIn, Glassdoor and the other boards, sweeping those sources returns the same jobs with more fields, so nothing is lost while Google is dark.

Do I pay twice when Google Jobs and Indeed return the same posting?

No. The deduplicator merges a job seen on several boards into a single row, and billing counts only rows delivered to the dataset, so a run costing $5 per 1,000 jobs never charges for the Indeed copy and the Google copy separately. A run that finds nothing costs nothing beyond Apify's small start fee. To keep repeat runs cheap, set hoursOld so each pull only fetches postings newer than the last one, and cap spend with a maximum total charge in Console.

Does googleSearchTerm replace searchTerm?

No. searchTerm (or the searchTerms array) is required and drives every board. googleSearchTerm is an optional override applied to the Google board only, and the documentation recommends copying it straight from the Google Jobs search box because that phrasing produces the best results there. Because it is scoped to Google, it has no effect on the six default boards, so it can sit in a saved input while google stays deselected and come into play only when you add google back to sites.

Which boards should I select to replace a Google Jobs sweep for my country?

Match the feeders to the market. LinkedIn is global. Indeed and Glassdoor follow countryIndeed, which accepts usa, uk, canada, australia, germany, france, india, singapore, uae and most other countries. ZipRecruiter covers the US and Canada, Naukri covers India and Bayt the Middle East. A US sweep is indeed, linkedin, glassdoor and zip_recruiter; a UK sweep is linkedin plus indeed and glassdoor with countryIndeed set to uk; an India sweep adds naukri for its skills and experience fields.

Can an AI agent use this scraper as a Google Jobs API?

Yes. Add https://mcp.apify.com/?tools=fetch-actor-details,openclawai/job-board-scraper to Claude, ChatGPT, Cursor or another MCP client and the agent gets a tool that takes searchTerm, location, sites and filters and returns typed rows. A prompt like 'find remote senior React jobs posted in the last 24 hours and list companies with salary ranges' maps to hoursOld 24 and isRemote true across linkedin and indeed. The same input works over the Apify REST API for scheduled runs.

Keep reading