Every salary figure on these pages comes from this process. Last revised 2026-09-21.
The only input is the text of job postings published on Daybook.com, a job board for government relations, public policy, political and adjacent careers. Daybook does not collect salaries from employees, surveys or third-party datasets. Each posting contributes at most one observation to any figure.
Each posting's title, description and stated position level are read once by a language model (claude-haiku-4-5), which returns the minimum and maximum annual salary stated in the text, a confidence score from 0 to 1, a normalized job title and a list of required skills. Hourly rates are converted to annual pay at 2,080 hours per year. When a posting states a single figure it is used as both minimum and maximum. Extractions are stored once and are not re-run for the same posting.
An extraction becomes a salary observation only when all of the following hold:
Postings that do not state a salary still count toward "postings analyzed" but never toward any dollar figure. Every page states both numbers, for example "42 postings that disclosed salary (of 150 analyzed)".
Reports cover postings whose posting date falls within the last 12 months. The window is recomputed every night, so postings age out and figures can move without any new posting arriving. Each report records the exact window it was computed over, published as the dataset's temporal coverage.
Category reports group postings by the category the employer chose when posting. Job title reports group postings by the normalized title from extraction, within one category; spelling variants that reduce to the same slug share one report, and the most common spelling is shown. Up to 20 of the most common titles in a category are considered each night. Experience levels use the level the employer selected: entry, mid or senior. Internships are counted as postings analyzed but are not assigned to a level.
Median, 10th and 90th percentiles use the nearest-rank method: with n observations sorted ascending, the p-th percentile is the value at rank āp Ć nā. No interpolation is applied. The 10th and 90th percentiles are withheld when fewer than 10 observations exist, since with very few values they would simply be the smallest and largest. Averages are arithmetic means of the same observations.
Two independent gates apply, so a page can be live while its salary figures are withheld.
Page gate (is the report published at all?)
Salary gate (are dollar figures shown?)
A report that passes the page gate but not the salary gate stays published with its employers, titles, skills, locations and level mix, states how many postings disclosed pay, and makes no salary claim anywhere on the page or in its structured data. A report that fails the page gate is withdrawn: the page returns a 404 status, is marked not to be indexed, and is removed from the sitemap until the gate is met again.
Every report carries two dates. Published is the first day the report met its publication threshold. Modified is the last day any figure or list in the report changed. Reports are recomputed nightly, but a recompute that produces the same figures leaves both dates unchanged; the dates in the page's structured data, citation metadata and sitemap are these stored dates, not the date of your visit.
The short summary at the top of each report is written by a language model (claude-sonnet-4-6) from the report's own figures, and is rewritten only when those figures change. If generation fails, or the report's salary figures are withheld, a fixed template sentence built from the same counts is shown instead, so no model ever writes text for a page without figures. The structured question-and-answer text on job title pages is always the template sentence, so it can never disagree with the figures on the page.
To cite a report, use the published and modified dates shown on that page and link to its URL. Questions about the method can be sent through the contact page.