GovSalaries Public Employee Salary Scraper avatar

GovSalaries Public Employee Salary Scraper

Pricing

from $0.80 / 1,000 record scrapeds

Go to Apify Store
GovSalaries Public Employee Salary Scraper

GovSalaries Public Employee Salary Scraper

Nationwide database of actual US public-employee pay — every state and employer type: cities, counties, school districts, universities, colleges, hospitals, police and fire departments. Filter by state, category, employer or job title; add pay and benefits detail per record.

Pricing

from $0.80 / 1,000 record scrapeds

Rating

0.0

(0)

Developer

BowTiedRaccoon

BowTiedRaccoon

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Scrape public-employee pay records from GovSalaries, the nationwide database of actual US government payroll. Returns employee name, year, job title, employer, state, and category across every US state and nine employer types — cities, counties, school districts, colleges, universities, hospitals, fire departments, and police.


GovSalaries Scraper Features

  • Covers all 50 states plus DC and federal employers — one actor, every jurisdiction
  • Filters by state, employer category, a specific employer, job title text, or year
  • Returns the full pay breakdown as an opt-in — regular pay, other pay, total pay, benefits, and total compensation
  • Pulls employer aggregates too: headcount, average annual wage, median annual wage
  • Pure HTTP scraping — no browser required
  • Supports resuming a stopped run without re-paying for records you already have

Who Uses Public Payroll Data?

  • Journalists and watchdog groups — pull salary history for any agency, any state, without filing a records request
  • Union negotiators — benchmark police, fire, and teacher pay against comparable jurisdictions
  • Compensation and relocation researchers — school-district and university pay are the highest-volume slices, and now they're queryable
  • Policy researchers — track public payroll spend across categories and geography
  • Recruiters and HR teams — check what a public-sector role actually pays before making an offer

How GovSalaries Scraper Works

  1. Pick a scope — one or more states, one or more employer categories, a single employer, or leave it open for everything.
  2. The scraper walks GovSalaries' own category and employer indexes to find matching roster pages, then reads name, year, job title, and employer off each one.
  3. Set includePay to true and each row also gets a follow-up fetch for the pay breakdown and employer aggregates — one extra request per record, billed as an add-on.
  4. Records stream out until maxItems is reached or the scope is exhausted.

Input

{
"states": ["CA"],
"categories": ["school-district"],
"includePay": true,
"maxItems": 100
}
FieldTypeDefaultDescription
statesarrayall statesUS state/territory codes to include (e.g. CA, TX, DC, FD for federal). Leave empty for all.
categoriesarrayall categoriesEmployer types to include: city, county, state, school-district, college, university, fire-protection, police, hospital. Leave empty for all.
agencystringLimit results to one employer by name or URL slug. Requires at least one selected state.
jobTitleQuerystringOnly return rows whose job title contains this text.
yearintegerOnly return rows from one calendar year.
includePaybooleanfalseAdd regular pay, other pay, total pay, benefits, and total compensation to each row.
maxItemsinteger15Maximum number of records to return.
resumeCursorstringCursor from a previous run's Output. Continues a stopped crawl without re-charging for records already delivered.

A second example, pulling every record for a single employer with the full pay breakdown:

{
"states": ["CA"],
"agency": "gilroy-unified",
"includePay": true,
"maxItems": 500
}

GovSalaries Scraper Output Fields

Without includePay (the default — fast, roster-only):

{
"employee_name": "Paul Winslow",
"year": 2024,
"job_title": "Assistant Superintendent HR",
"agency": "Gilroy Unified",
"state": "CA",
"category": "school-district",
"profile_url": "https://govsalaries.com/paul-winslow-213465883"
}

With includePay: true, the same row also carries the pay breakdown and employer aggregates:

{
"employee_name": "Paul Winslow",
"year": 2024,
"job_title": "Assistant Superintendent HR",
"agency": "Gilroy Unified",
"state": "CA",
"category": "school-district",
"profile_url": "https://govsalaries.com/paul-winslow-213465883",
"total_compensation": 305010,
"regular_pay": 238377,
"other_pay": 17334,
"total_pay": 255711,
"benefits": 49299,
"location": "Santa Clara County",
"pay_plan": null,
"employer_employees_number": 1538,
"employer_average_annual_wage": 87722,
"employer_median_annual_wage": 69535
}
FieldTypeDescription
employee_namestringEmployee's full name
yearnumberCalendar year the record covers
job_titlestringJob title as listed (some agencies don't publish this — expect N/A)
agencystringEmployer name
statestringTwo-letter state code (or FD for federal)
categorystringEmployer type — see the categories input field for the full list
profile_urlstringLink to the employee's detail page on GovSalaries
total_compensationnumberTotal compensation, includePay only
regular_paynumberRegular pay, includePay only
other_paynumberOther pay, includePay only
total_paynumberTotal pay (regular + other), includePay only
benefitsnumberBenefits value, includePay only
locationstringCounty, includePay only
pay_planstringPay plan, when published — includePay only
employer_employees_numbernumberEmployer's total headcount, includePay only
employer_average_annual_wagenumberEmployer's average annual wage, includePay only
employer_median_annual_wagenumberEmployer's median annual wage, includePay only

Resuming a large crawl

Every run emits a resumeCursor in its Output. If a large crawl stops before it finishes — because it hit maxItems, your spend cap (maxTotalChargeUsd), or was aborted — start a new run with the same input plus that resumeCursor to continue from where it left off. The crawl resumes from the queued work the previous run didn't reach.

  • You are not re-charged for records the earlier run already delivered.
  • Resume within your account's run-retention window — on the free tier, roughly your 10 most recent runs. Once the source run is pruned, its resumeCursor is no longer valid.
  • resumeCursor is opaque — supply it unmodified.

FAQ

How do I scrape GovSalaries?

Run this actor with a state, a category, or an employer — or leave the filters empty and let maxItems bound the run. GovSalaries Scraper handles the pagination and employer discovery for you.

What data can I get from GovSalaries?

Employee name, year, job title, employer, state, and category on every run. Add includePay: true for the full pay breakdown — regular pay, other pay, total pay, benefits, total compensation — plus employer headcount and wage averages.

Can I filter by state or employer type?

Yes. states and categories both take multiple values, so you can pull, say, school districts in California and Texas in one run. agency narrows to a single employer, and jobTitleQuery filters by title text.

How much does GovSalaries Scraper cost to run?

Roster records (name, year, title, employer) are priced at the standard per-record rate. The pay breakdown is a separate add-on charge per record, only billed when includePay is set — you're not paying for data you didn't ask for.

Does GovSalaries Scraper need proxies?

No setup on your end. The actor handles its own access — you just configure the input and run it.

What job titles show up as "N/A"?

Some agencies don't publish job titles for every record — GovSalaries lists those rows as N/A, and the scraper returns exactly what the source shows rather than guessing.


Need More Features?

Need custom fields, filters, or a different target site? File an issue or get in touch.

Why Use GovSalaries Scraper?

  • National coverage — every state, every employer level, one actor. Most public-pay sources cover a single state.
  • Real payroll, not advertised pay — this is what public employees are actually paid, not a job listing's salary range.
  • Pay data on demand — the roster is free to browse; the full pay breakdown is a per-record add-on, so you only pay for what you use.