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.
npx -y skills add johnisanerd/claude-skill-bulk-job-listings-export --skill apify-bulk-job-listings-exportAssembled 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
- Apify account (sign up at https://apify.com?fpr=9n7kx3&fp_sid=skillrepo).
- Authentication via
apify login, or anAPIFY_TOKENenvironment variable (Apify Console, Settings, Integrations).
The Actor
- Store page: https://apify.com/johnvc/google-jobs-scraper---pay-per-result?fpr=9n7kx3&fp_sid=skillrepo
- Actor ID:
johnvc/google-jobs-scraper---pay-per-result - Pricing: pay per result delivered to the dataset (see
references/gotchas.md).
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
- Scope the deliverable with the user. Which roles, which markets, how many rows per combination, and what file format at the end.
- Turn that into one input per query and market pair.
querypluslocationpluscountrypluslanguage. Sendcountryandlanguageexplicitly, since Google Jobs returns nothing when neither is supplied. - 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. - Trim the file and the bill together.
company_filter_listandvia_filter_listexclude rows during collection, so they never reach the dataset and never get charged. - Run the batch. Keep runs separate per query and market so a failure costs you one slice instead of the whole export.
- 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. - 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 companylocation(string): city, state, or countrycountry(enum: None, us, ca, uk, de, fr, au, jp, in, br, mx) andlanguage(enum, 100 plus codes)google_domain(enum, defaultgoogle.com)num_results(integer 10 to 1000, default 100): rows per run, and the cost levermax_pagination(integer 0 to 100, default 0 = unlimited)company_filterorcompany_filter_list: exclude employerscompany_filter_regex(boolean, default false): treat company filters as regular expressionsvia_filterorvia_filter_list: exclude source platformsinclude_lrad(boolean) pluslrad_value(string, miles): radius searchoutput_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_highlightsBenefits block. posted_atis a relative string such as "22 hours ago", so convert it to timestamps after export if the file needs real dates.pages_processedcame 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_idbefore delivering. - This is a batch export, not a streaming feed. Freshness is the age of your last run.
Troubleshooting
- Empty export: confirm
countryandlanguagewere 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
- Google Jobs Scraper, pay per page edition: https://apify.com/johnvc/Google-Jobs-Scraper?fpr=9n7kx3&fp_sid=skillrepo
- LinkedIn Jobs API: https://apify.com/johnvc/linkedin-jobs-api?fpr=9n7kx3&fp_sid=skillrepo
- Glassdoor Reviews API: https://apify.com/johnvc/glassdoor-reviews-api?fpr=9n7kx3&fp_sid=skillrepo
What ships with it: 2 files
6.5 KB alongside SKILL.md
references/
- actor-index.md1.8 KB
- gotchas.md4.7 KB
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.