agentsclimarketplace

Apify google jobs scraper

Skill johnisanerd/claude-skill-google-jobs-scraper/apify-google-jobs-scraper

Claude/agent skill: scrape Google Jobs listings billed per delivered result, with employer and board exclusion filters. Installs via npx skills add.

Install
npx -y skills add johnisanerd/claude-skill-google-jobs-scraper --skill apify-google-jobs-scraper

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

3 things to look at

  • 18 days oldThe repository was created 18 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Run a google jobs scraper that bills per listing, not per page, with the Apify Google Jobs Scraper API Pay Per Result Actor (johnvc/google-jobs-scraper---pay-per-result). Give a job title plus an optional location and get one flat row per opening with title, company_name, location, via (source platform), full description, job_highlights, detected_extensions (posted_at, schedule_type), apply_options direct links, source_link, and job_id. Built-in company_filter and via_filter drop unwanted employers or job boards before you pay for them. Use when the user asks for a google jobs scraper, wants to scrape Google Jobs openings for a role or city, needs a job listings dataset with predictable cost, or wants to exclude staffing agencies from the results. Pay-per-result billing, MCP-ready for Claude and other AI agents.

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

8.0 KB, as published. Nobody here has run it

Google Jobs Scraper With Per-Result Billing

A Google Jobs scraper that charges for every listing it hands you and nothing else. Give it a role and a location, get one flat row per opening, and know the bill before the run starts because the math is results times price.

When to use this skill

  • The user asks for a "google jobs scraper" or wants to scrape Google Jobs openings.
  • They want listings for a role, company, city, or country as a flat dataset.
  • They want cost that scales with rows delivered rather than pages fetched.
  • They want to exclude specific employers or job boards from the output.

Not for: salary analytics (there is no numeric salary field), LinkedIn-only listings (use the LinkedIn Jobs API), or employer reviews (use the Glassdoor Reviews API).

What you get (one flat row per listing)

Verified on a live run:

  • title and job_title (identical strings, so pick either one)
  • company_name, location, via (the platform hosting the listing, such as LinkedIn or a company careers site)
  • description (full posting text, often 1,500 characters or more)
  • job_highlights (array of {title, items} blocks such as Qualifications, Responsibilities, Benefits)
  • extensions (raw tag strings such as "22 hours ago", "Full-time")
  • detected_extensions (posted_at and schedule_type on every row, plus work_from_home and qualifications when present on that listing)
  • apply_options (array of {title, link} direct apply links, one per hosting platform)
  • source_link (canonical link to the posting), share_link (Google Jobs permalink), job_id (dedupe key)
  • Echoed run context on every row: query, country, language, google_domain, search_timestamp, total_jobs_found, pages_processed

Every row carries its own search context, so you can merge several runs into one table and still tell where each listing came from.

Prerequisites

The Actor

Run it with the Apify CLI

Scrape a role in a city, capped at 10 listings:

apify actors call "johnvc/google-jobs-scraper---pay-per-result" -i '{"query":"software engineer","location":"Austin, TX","country":"us","language":"en","num_results":10}' \
  --json \
  --user-agent apify-awesome-skills/apify-google-jobs-scraper \
  2>/dev/null

Scrape a country-wide search on a local Google domain, skipping two job boards:

apify actors call "johnvc/google-jobs-scraper---pay-per-result" -i '{"query":"data analyst","location":"United Kingdom","country":"uk","google_domain":"google.co.uk","language":"en","num_results":50,"via_filter_list":["Indeed","ZipRecruiter"]}' \
  --json \
  --user-agent apify-awesome-skills/apify-google-jobs-scraper \
  2>/dev/null

Every call carries the three flags this repo expects: --json (or --format json), --user-agent apify-awesome-skills/apify-google-jobs-scraper, and 2>/dev/null.

Run it from Claude or another AI agent (MCP)

The Actor is MCP-ready. Add the hosted server URL:

https://mcp.apify.com/?tools=actors,docs,johnvc/google-jobs-scraper---pay-per-result

Then ask, for example: "Scrape Google Jobs for 20 warehouse supervisor openings near Columbus and give me the apply links." MCP setup docs: https://docs.apify.com/platform/integrations/mcp

Workflow

  1. Build the query. query is the only required field, and it takes a job title, skill, or company name. Add location (city, state, or country) to narrow it.
  2. Set localization. Send country and language explicitly. Google Jobs returns nothing when neither is supplied, and the Actor has to guess from google_domain and log a warning.
  3. Cap the volume. num_results is the direct cost lever here because you pay per row. The minimum accepted value is 10; the maximum is 1000.
  4. Filter before you pay. company_filter_list and via_filter_list drop matching rows during collection, so excluded listings never reach the dataset and never get billed.
  5. Estimate cost, then confirm with the user if the run is large. See references/gotchas.md.
  6. Run the Actor and read the dataset. Dedupe across runs on job_id.

Inputs

  • query (string, required): job title, skill, or company
  • location (string): city, state, or country. Empty plus a country value falls back to the country name
  • country (enum: None, us, ca, uk, de, fr, au, jp, in, br, mx)
  • language (enum, 100 plus codes, default None)
  • google_domain (enum, default google.com)
  • num_results (integer 10 to 1000, default 100): the billing lever
  • max_pagination (integer 0 to 100, default 0 = unlimited)
  • company_filter (string, comma separated) or company_filter_list (array): exclude employers
  • company_filter_regex (boolean, default false): treat the company filters as regular expressions
  • via_filter (string) or via_filter_list (array): exclude source platforms
  • include_lrad (boolean) plus lrad_value (string, miles): radius search
  • max_delay (integer 0 to 10, default 1): seconds between requests
  • output_file (string): custom filename for the saved results file

Cost

Billing is per result in the default dataset. Ten listings cost ten result charges, one hundred listings cost one hundred. Live per-result prices and confirmation thresholds are in references/gotchas.md.

Honest limits

  • No numeric salary field and no experience-level field. Pay figures sometimes appear inside job_highlights Benefits text, but that is free text you would have to parse yourself, not a structured field.
  • posted_at is a relative string such as "22 hours ago", so freshness filtering happens on your side after the run.
  • pages_processed came back as 0 on the verified run, so treat it as unreliable and count dataset rows instead.
  • Google Jobs inventory varies by region and query, so num_results is a cap and not a guarantee.
  • Company and source filters are case sensitive unless you turn on company_filter_regex.

Troubleshooting

  • No results: send country and language explicitly, then broaden the query or drop the location.
  • Fewer rows than num_results: normal, Google had fewer listings for that query.
  • Insufficient funds: the Actor writes a single error row explaining the shortfall instead of failing silently. Add funds or lower num_results.

See references/gotchas.md for cost guardrails and error recovery, and references/actor-index.md for the Actor routing table.

Related job-data Actors

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.