OrbTop

GovSalaries Public Employee Salary Scraper

JOBSBUSINESS

GovSalaries Public Employee Salary Scraper

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
}
Field Type Default Description
states array all states US state/territory codes to include (e.g. CA, TX, DC, FD for federal). Leave empty for all.
categories array all categories Employer types to include: city, county, state, school-district, college, university, fire-protection, police, hospital. Leave empty for all.
agency string Limit results to one employer by name or URL slug. Requires at least one selected state.
jobTitleQuery string Only return rows whose job title contains this text.
year integer Only return rows from one calendar year.
includePay boolean false Add regular pay, other pay, total pay, benefits, and total compensation to each row.
maxItems integer 15 Maximum number of records to return.
resumeCursor string Cursor 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
}
Field Type Description
employee_name string Employee's full name
year number Calendar year the record covers
job_title string Job title as listed (some agencies don't publish this — expect N/A)
agency string Employer name
state string Two-letter state code (or FD for federal)
category string Employer type — see the categories input field for the full list
profile_url string Link to the employee's detail page on GovSalaries
total_compensation number Total compensation, includePay only
regular_pay number Regular pay, includePay only
other_pay number Other pay, includePay only
total_pay number Total pay (regular + other), includePay only
benefits number Benefits value, includePay only
location string County, includePay only
pay_plan string Pay plan, when published — includePay only
employer_employees_number number Employer's total headcount, includePay only
employer_average_annual_wage number Employer's average annual wage, includePay only
employer_median_annual_wage number Employer'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.