Google Jobs Scraper avatar

Google Jobs Scraper

Pricing

from $1.85 / 1,000 jobs

Go to Apify Store
Google Jobs Scraper

Google Jobs Scraper

Google Jobs scraper: job search by title and place, one row per job with the employer, place, salary, schedule, every board to apply on with its real link, Google's highlights and the full description. Filter by date posted, job type, remote, employer and job board. You pay only for jobs delivered.

Pricing

from $1.85 / 1,000 jobs

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Categories

Security

Limited permissions

Share

Scrape Google Jobs by job title and place and get one row per job: the employer, the place, the pay where Google shows it, the schedule, every board you can apply on with its real link, Google's highlights and the full description. Type a search such as "registered nurse" and a place such as "Chicago, IL", or paste a Google Jobs address from your browser. Pay comes back only where the posting shows it, which was about half the jobs in our tests.

InputJob searches and places, or Google Jobs addresses
OutputOne row per job: title, employer, place, pay, schedule, apply links, highlights, full description
Ceiling500 jobs per search, 10,000 per run
SpeedRoughly 13 to 31 jobs a minute on four test runs
Account neededNone from you
Price$1.85 per 1,000 jobs, the same on every plan. The free plan's $5 a month covers about 2,700

🔍 What Google Jobs Scraper does

Google Jobs gathers postings from job boards and from employers' own careers sites into one list. One posting often sits on six or eight boards at once, and Google shows them as a single job with every place to apply. This actor reads that list the way it appears on Google, for any search and place you give it, and returns each job with its detail: the description, the highlights Google picks out of it, and the apply links.

Google shows a search ten jobs at a time. When you ask for more, the run reads the same search again through Google's own date, job type and remote filters, until it has your number or no new jobs come back. A job that turns up twice is delivered and charged once.

Filters you set are checked on every row as well. Google treats a job type as a hint, so a part-time search still gets some full-time jobs back; those are left out and not charged.

📋 What data you get from each Google Jobs listing

What you getField
The job and who is hiringtitle, companyName, companyLogo
Where, with coordinates for the placelocation, latitude, longitude, workFromHome
The board Google found it onvia
When it was postedpostedAt, postedAtDate
SchedulescheduleType, jobTypes
Pay, as shown and as numberssalary, salaryMin, salaryMax, salaryCurrency, salaryPeriod
Google's tagshealthInsurance, dentalCoverage, paidTimeOff, retirementPlan, qualification, extensions
The textdescription, descriptionHtml (optional), jobHighlights, qualifications, responsibilities, benefits
Where to applyapplyOptions, applyLink, sourceUrl
The job on GooglejobId, googleJobsUrl, relatedLinks
The search that found itsearchQuery, searchLocation, country, language, googleDomain, position, scrapedAt

▶️ How to scrape Google Jobs

  1. Open Google Jobs Scraper and click Try for free.
  2. Type your searches into Job searches, one per line.
  3. Put a city or region in Place, and pick the Country.
  4. Set Jobs per search, and any filters you need under Filters.
  5. Click Start, then download the dataset as JSON, CSV or Excel, or read it from the API.

💰 How much does it cost to scrape Google Jobs?

$1.85 per 1,000 jobs, the same on the Free, Starter, Scale and Business plans. On the free plan, the $5 Apify gives you each month covers about 2,700 jobs.

You pay for jobs delivered to your dataset and nothing else. Jobs your filters leave out, a job already delivered by an earlier search in the same run, and every note row are free. The run also stops at the maximum cost you set for it.

📥 What you give it

{
"queries": ["registered nurse", "nurse practitioner"],
"location": "Chicago, IL",
"country": "US",
"datePosted": "week",
"jobTypes": ["FULLTIME"],
"maxResultsPerSearch": 50
}
FieldDefaultWhat it is
queriesnoneWhat you would type into Google's job search, one per line. Up to 100. With no searches and no addresses, the run searches "software engineer".
locationnoneA city, region or country, typed the way you would type it: Austin, TX, London.
locationsnoneMore places. Every search runs in each, up to 50 places and 200 searches a run.
countryUSThe country whose Google Jobs you search. Two letters.
languageenThe language of Google's page: en, de, es, pt-BR. Tags and dates come back in it.
googleDomaingoogle.comSuch as google.co.uk. Most runs set the country instead.
startUrlsnoneGoogle Jobs addresses from your browser (the Jobs tab, with udm=8). Their words and filters are kept.
locationUulenoneSearch as someone in a place, by Google's own name for it: Chicago,Illinois,United States.
datePostedanytoday, 3days, week or month.
jobTypesnoneFULLTIME, PARTTIME, CONTRACTOR, INTERN. Jobs of other types are left out and not charged.
remoteOnlyfalseOnly jobs marked work from home, or listed as Anywhere.
radiusKmnoneHow far around the place to look, 1 to 1,000 km. Google takes it as a guide.
includeCompaniesnoneKeep only these employers. Part of a name works; /pattern/ is a regular expression.
excludeCompaniesnoneLeave these employers out.
excludeVianoneLeave out jobs listed through these boards, such as Indeed.
maxResultsPerSearch30Jobs for each search in each place, 1 to 500.
maxResults1000Jobs for the whole run, 1 to 10,000.
includeUnfilteredResultsfalseAlso read each search with Google's similar-results filter off. A few more jobs, sometimes.
includeDescriptionHtmlfalseAdds descriptionHtml. The plain description is always there.
csvFriendlyOutputfalseLists become single text cells, one job per spreadsheet line.
outputFieldsnoneKeep only these fields in each row, such as title, companyName, applyLink.
outputFileNamenoneAlso save the jobs as one JSON file of that name in the run's key-value store.
requestDelaySeconds0A pause before each extra request to Google, 0 to 10.

📤 What you get back

A real row from a test run on 3 November 2026, with the long fields cut short and a few left out:

{
"ok": true,
"jobId": "wHGzXyfDoycOwhPkAAAAAA==",
"title": "Warehouse Associate/Material Handler",
"companyName": "Motor Controls, Inc.",
"location": "Dallas, TX",
"latitude": 32.7766642,
"longitude": -96.7969879,
"via": "Indeed",
"postedAt": "10 days ago",
"postedAtDate": "2026-10-24",
"scheduleType": "Full-time",
"jobTypes": ["FULLTIME"],
"workFromHome": false,
"salary": "$19 an hour",
"salaryMin": 19,
"salaryMax": 19,
"salaryCurrency": "USD",
"salaryPeriod": "hour",
"healthInsurance": true,
"dentalCoverage": true,
"paidTimeOff": true,
"qualification": "No Degree Mentioned",
"description": "Skills can be taught. Pride in your work, a strong attitude, and being a dependable teammate are harder to find...",
"qualifications": ["Previous forklift operating experience required"],
"benefits": ["Medical, Dental, and Vision coverage (including a free HSA plan option)", "Quarterly performance bonus"],
"applyOptions": [
{ "title": "Indeed", "link": "https://www.indeed.com/viewjob?jk=77a37262eae1a926&utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic" },
{ "title": "Motor Controls Inc. Career Site", "link": "https://careers.motorcontrols.com/jobs/725718-warehouse-associate-material-handler?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic" }
],
"searchQuery": "warehouse associate",
"searchLocation": "Dallas, TX",
"position": 7,
"scrapedAt": "2026-11-03T08:17:35.350Z"
}
FieldHow to read it
jobIdGoogle's own id for the listing. The same job keeps it across searches and days, so it is the key to diff on.
postedAt, postedAtDateGoogle gives an age ("10 days ago"); postedAtDate is the day that age points to, from when the run read it. Both are null when Google shows no age.
salaryAs Google shows it. salaryMin and salaryMax are equal for a single figure, and all five pay fields are null when the posting shows no pay.
latitude, longitudeThe centre of the place Google names, which can be a city, a region or a whole country. null for Anywhere.
applyOptionsEvery board and careers site Google lists for the job, with each posting's own address.
scheduleTypeGoogle's words, in the page's language. jobTypes turns them into codes, two for "Full-time and Contractor".

🧾 Reading the output

Every row has ok. A job is ok: true and is charged. A note row is ok: false with diagnostics: true, an errorCode and an error that says what happened and what to change; note rows are never charged. Filter on ok == true and you have your jobs.

CodeWhat it means
NO_RESULTSGoogle lists no jobs for that search, or none passed your filters. The row says which.
NOT_SERVEDThat search was not served this run. Re-run it later.
BAD_INPUTA field could not be used, named in field. Nothing was searched.
TIME_LIMITThe run stopped before its time limit to keep what it found. Give it more time.
COST_LIMITThe run reached the maximum cost you set. Raise it to get more.
UNEXPECTED_ERRORSomething broke inside the run. Jobs before it are kept, and the row carries a reference to quote.

The key-value store's SUMMARY record says, per search, how many Google pages were read, how many jobs Google listed, how many were delivered, repeated or left out by each filter, and why the search ended.

💡 What people use it for

  • A recruiter's weekly sweep of one role across ten cities, diffed on jobId to see what opened since last week.
  • Pay research: every posting for a title in a region, with salaryMin, salaryMax and salaryPeriod ready to chart.
  • A staffing agency's map of a market: which employers are hiring for which roles, and on which boards.
  • A job alert of your own, run daily with Posted within set to the past 24 hours.

From a search to the employers' full boards, in two runs:

  1. Run this one on a role and a city and keep the companyName and applyOptions columns.
  2. Paste the employers into Career Site Jobs Scraper to get every open role on their own careers sites.

🚧 What it does not do

  • It lists what Google lists for a search. A very broad search does not return every job in a country. Split it by place or by title.
  • Pay, posting age and tags appear only where Google shows them.
  • It does not open the boards. Descriptions and apply links are the ones Google carries; a closed posting can still show on Google for a while.
  • Remote jobs often have no place, because the posting names none.
  • It is not an official Google tool. Dami's Studio is independent and is not affiliated with or endorsed by Google, or by any other company named on this page.

🧭 Which job scraper do you need?

If you wantUse
Jobs from every board at once, the way Google Jobs lists themThis one
Open jobs at companies you name, read from their own hiring systemCareer Site Jobs Scraper
Whole Greenhouse, Lever or Ashby boardsMulti-ATS Jobs Scraper
Public LinkedIn jobs by keyword and locationLinkedIn Jobs Scraper
US jobs with salary from ZipRecruiterZipRecruiter Scraper
Remote jobs, with the region the employer hires fromRemotive Jobs Scraper
Ordinary Google search results for a keywordGoogle Search Results Scraper

❓ Questions people ask

Do I need a Google account to scrape Google Jobs?

No. The run reads Google Jobs the way a signed-out visitor sees it, and there is no account or cookie field.

Why don't I see the same jobs in my browser?

Google tailors Jobs to the place and language it thinks you are in. Open a private window, set the same country and language, and search the same words with the place in them. Google's list also moves a little from one minute to the next.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has code for Python, JavaScript and the CLI. MCP clients like Claude and ChatGPT use https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/google-jobs-scraper. Both bill your Apify account at the same price.

The listings are public and are read the way a signed-out visitor sees them, with no account and nothing private. Job postings can name people, such as a recruiter, and GDPR and similar laws apply to personal data, so keep only what you need, and mind the rules on cold contact if you use any contact details. Google's own terms still apply to what you do with the data. Apify's write-up on the legality of web scraping is a fair starting point. We are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page with the run ID and the search that misbehaved. The note rows and the SUMMARY record usually explain it on their own.