agentsclimarketplace

Apify bulk job listings export

Skill johnisanerd/claude-skill-bulk-job-listings-export/apify-bulk-job-listings-export

Claude/agent skill: bulk export job listings to CSV, Excel, Sheets, or JSON with quotable per-row cost. Installs via npx skills add.

Install
npx -y skills add johnisanerd/claude-skill-bulk-job-listings-export --skill apify-bulk-job-listings-export

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

  • 19 days oldThe repository was created 19 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

Export Google Jobs listings to CSV, Excel, Sheets, or JSON in bulk with the Apify Google Jobs Scraper API Pay Per Result Actor (johnvc/google-jobs-scraper---pay-per-result). Output is already flat, one row per opening, so a dataset export drops straight into a spreadsheet or a database load with no reshaping. Covers multi-query batches, exclusion filters that shrink the file and the bill together, and job_id dedupe across runs. Use when the user wants to export google jobs to csv, download job listings as a spreadsheet, build or backfill a job board, load openings into a warehouse or ATS, or bulk export job postings for many roles and cities at a known cost. 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.9 KB, ~2.0k tokens by cl100k_base, as published. Nobody here has run it

Bulk Job Listings Export With a Cost You Can Budget

Pull Google Jobs openings in bulk and hand back a file. The Actor writes flat rows, so CSV, Excel, Sheets, and JSON exports come out clean, and because billing is per result the invoice equals the row count.

When to use this skill

  • The user wants to export Google Jobs listings to CSV, Excel, Google Sheets, or JSON.
  • They are seeding or backfilling a job board, an ATS, a warehouse table, or a research dataset.
  • They need many roles or many cities in one deliverable file.
  • They need to quote a data-pull cost up front, before anyone approves the run.

Not for: a live low-latency search endpoint inside an app, salary analytics (there is no numeric salary field), or LinkedIn-only listings (use the LinkedIn Jobs API).

Why per-result billing matters for bulk work

Bulk exports are where page-based pricing gets unpredictable, because a page that returns three listings costs the same as a page that returns ten. Here you pay for delivered rows. A 500-row export costs 500 result charges whether Google served them across 50 tidy pages or 80 ragged ones, so the estimate you give before the run is the number on the invoice after it.

What lands in the file (one flat row per listing)

Verified on a live run:

title, job_title (same string as title), company_name, location, via (hosting platform), description (full posting text), job_highlights (array of {title, items} blocks such as Qualifications, Responsibilities, Benefits), extensions (raw tags 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), apply_options (array of {title, link} direct apply links), source_link, share_link, job_id, and the echoed run context query, country, language, google_domain, search_timestamp, total_jobs_found, pages_processed.

The echoed context is what makes multi-query batches work. Concatenate 12 runs into one table and each row still says which query and market produced it.

For CSV and Excel, the nested columns (job_highlights, apply_options, extensions, detected_extensions) flatten into bracketed sub-columns. Pick a dataset view or select fields when you want a narrow, human-readable sheet. See references/gotchas.md.

Prerequisites

The Actor

Run it with the Apify CLI

One export batch, staffing agencies and aggregators excluded:

apify actors call "johnvc/google-jobs-scraper---pay-per-result" -i '{"query":"registered nurse","location":"Dallas, TX","country":"us","language":"en","num_results":200,"via_filter_list":["ZipRecruiter","Indeed"]}' \
  --json \
  --user-agent apify-awesome-skills/apify-bulk-job-listings-export \
  2>/dev/null

Pull the dataset down as JSON for a database load:

apify datasets get-items DATASET_ID --format json --user-agent apify-awesome-skills/apify-bulk-job-listings-export 2>/dev/null > job_listings.json

For a spreadsheet handoff, ask the dataset export endpoint for CSV directly:

curl -sG "https://api.apify.com/v2/datasets/DATASET_ID/items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  --data-urlencode "format=csv" \
  > job_listings.csv

Swap format=csv for format=xlsx when the user wants Excel.

Every call carries the three flags this repo expects: --json (or --format json), --user-agent apify-awesome-skills/apify-bulk-job-listings-export, 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: "Export 300 medical assistant openings across Phoenix, Tucson, and Mesa to one CSV, and skip listings from staffing agencies." MCP setup docs: https://docs.apify.com/platform/integrations/mcp

Workflow

  1. Scope the deliverable with the user. Which roles, which markets, how many rows per combination, and what file format at the end.
  2. Turn that into one input per query and market pair. query plus location plus country plus language. Send country and language explicitly, since Google Jobs returns nothing when neither is supplied.
  3. Price the batch before running. Total rows times the live per-result price. Present the number and get approval when it is large. See references/gotchas.md.
  4. Trim the file and the bill together. company_filter_list and via_filter_list exclude rows during collection, so they never reach the dataset and never get charged.
  5. Run the batch. Keep runs separate per query and market so a failure costs you one slice instead of the whole export.
  6. Export and merge. Pull each dataset as CSV or JSON, concatenate, then dedupe on job_id. The same posting can appear in overlapping city searches.
  7. Deliver. Hand over the file, or load it into the job board, warehouse, or ATS. For a recurring refresh, wrap the same inputs in an Apify Schedule.

Inputs

  • query (string, required): role, skill, or company
  • location (string): city, state, or country
  • country (enum: None, us, ca, uk, de, fr, au, jp, in, br, mx) and language (enum, 100 plus codes)
  • google_domain (enum, default google.com)
  • num_results (integer 10 to 1000, default 100): rows per run, and the cost lever
  • max_pagination (integer 0 to 100, default 0 = unlimited)
  • company_filter or company_filter_list: exclude employers
  • company_filter_regex (boolean, default false): treat company filters as regular expressions
  • via_filter or via_filter_list: exclude source platforms
  • include_lrad (boolean) plus lrad_value (string, miles): radius search
  • output_file (string): custom filename for the saved results file

Cost

Billing is per result in the default dataset, so a bulk export costs rows times the per-result price. A 1,000-row export is 1,000 charges. Multi-query batches add up across runs, so total the whole batch before you start. Live prices are in references/gotchas.md.

Honest limits

  • Hard ceiling of 1,000 results per run. Larger exports mean several runs, split by query or market.
  • No numeric salary field and no experience-level field. Compensation sometimes sits in free text inside a job_highlights Benefits block.
  • posted_at is a relative string such as "22 hours ago", so convert it to timestamps after export if the file needs real dates.
  • pages_processed came back as 0 on the verified run. Do not put it in a report; count rows.
  • Overlapping city or radius searches return duplicate postings. Dedupe on job_id before delivering.
  • This is a batch export, not a streaming feed. Freshness is the age of your last run.

Troubleshooting

  • Empty export: confirm country and language were sent, then broaden the query or widen the location.
  • Row count below num_results: expected, Google had fewer listings. You were billed only for delivered rows.
  • CSV columns look exploded: the nested fields expand into sub-columns. Select a narrower field set or use a dataset view.
  • A single row describing insufficient funds: account balance was below the estimated row count. Add funds or lower num_results.

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

Related job-data Actors

What ships with it: 2 files

6.5 KB alongside SKILL.md

references/

Gives 0 of the 12 instructions most pdf office docs skills give in ~2.0k tokens

Counted across 636 of the 690 authors here whose files we hold, read 2026-08-07

  • extract text using pdfplumberin 89 of 636, across 23 files
  • create PDFs using reportlabin 83 of 636, across 16 files
  • read forms.md to fill out pdf formsin 80 of 636, across 13 files
  • OCR scanned PDFs using pytesseractin 77 of 636, across 10 files
  • merge or split PDFs using qpdfin 70 of 636, across 3 files
  • use excel formulas instead of hardcoded calculated valuesin 68 of 636, across 13 files
  • unpack edit xml and repack existing documentsin 63 of 636, across 8 files
  • document sources for hardcoded valuesin 61 of 636, across 9 files
  • write minimal python code without unnecessary commentsin 59 of 636, across 7 files
  • run the recalculation script after adding or modifying formulasin 59 of 636, across 7 files
  • fix all identified formula errors and recalculatein 58 of 636, across 6 files
  • format years as text stringsin 57 of 636, across 5 files

Said here and by no other author read

  • send country and language explicitly
  • price the batch before running
  • get approval when cost is large
  • exclude rows during collection using filters
  • keep runs separate per query and market
  • pull each dataset as CSV or JSON

Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.

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.