Cite this page
Granite Record indexes the General Court’s record; it is not that record. Where a citation allows only one source, cite the General Court — every page here links to what it is drawn from. The date below is the day the page was read.
- MLA
- “The data.” Granite Record, https://graniterecord.org/data. Accessed 24 Oct. 2026.
- APA
- Granite Record. (n.d.). The data. Retrieved 24 Oct. 2026, from https://graniterecord.org/data
- Chicago
- Granite Record. “The data.” Accessed 24 Oct. 2026. https://graniterecord.org/data.
- BibTeX
@misc{data, title = {The data}, howpublished = {Granite Record}, url = {https://graniterecord.org/data}, note = {Accessed 24 Oct. 2026} }
The Data
The bills, roll calls, member votes, sponsors, hearings and sitting legislators behind this site are free to download as spreadsheets, built from the General Court's own records: 2,581,692 rows across 19 tables, as CSV. The code that builds them is public under the MIT License.
On this page
Downloads
These are built from the same files the pages are drawn from, by the same run, so a download and a page cannot disagree. They are rebuilt whenever the site is. Every file is CSV, UTF-8, with a header row.
| File | What it holds | Rows | Size | Download |
|---|---|---|---|---|
bills.csv | Every bill of every term: title, sponsor, committee, outcome, how far it got, and the chapter of the laws it became. More about | 33,717 rows | 7.7 MB | Download bills.csv |
legislators.csv | The sitting roster, with district, contact details and committee seats. More about | 406 rows | 0.1 MB | Download legislators.csv |
rollcalls.csv | Every roll call in the General Court's roll-call files, which begin in 1999: the question in the record's words and in plain English, the tally, and what it needed to carry where that was more than a majority. More about | 9,565 rows | 1.1 MB | Download rollcalls.csv |
proceedings.csv | Every hearing, executive session and floor debate on record, and the recording it is on where there is one. More about | 105,476 rows | 11.4 MB | Download proceedings.csv |
sponsors.csv | Who put their name to which bill, and who was prime. More about | 129,481 rows | 9.0 MB | Download sponsors.csv |
Votes by Termvotes-<term>.csv | How every member voted on every roll call of each term. One file a term, 14 in all, from 1999-2000 to 2025-2026. More about | 2,303,047 rows | 209.3 MB | Each term below |
| ||||
What’s Covered
Every bill back to 1989 has a title, a status and an outcome. The other columns are filled wherever this site has read them from the record, and the table below counts how far that reaches in each term. An empty cell has one of three reasons. The record may leave it empty: a rules or memorial resolution names no sponsor, and a resolution that neither chamber referred has no committee. The document that would fill it may not be here, or may be here in a version that does not name it — mostly the text of older resolutions and petitions, which is where sponsors before 2023 are read from, and a few budget bills and bills of 1993-1994 whose saved page is not the bill as introduced. Or the record gives it and this site does not read it from there yet, as with some committee referrals the docket records.
| Term | Bills | Sponsor | Committee | Topic | Passage |
|---|---|---|---|---|---|
| 1989-1990 | 1,632 | all | 96% | all | 100% |
| 1991-1992 | 1,675 | 100% | 96% | all | 100% |
| 1993-1994 | 1,784 | 100% | 97% | all | all |
| 1995-1996 | 1,586 | 100% | 97% | all | 100% |
| 1997-1998 | 1,849 | 100% | 99% | all | all |
| 1999-2000 | 1,673 | 100% | 98% | all | 100% |
| 2001-2002 | 1,487 | 100% | 99% | all | all |
| 2003-2004 | 1,605 | 100% | 99% | all | all |
| 2005-2006 | 1,837 | 100% | 99% | all | 100% |
| 2007-2008 | 1,955 | 100% | 99% | all | 100% |
| 2009-2010 | 1,735 | 100% | 99% | all | 100% |
| 2011-2012 | 1,772 | 99% | 99% | all | 100% |
| 2013-2014 | 1,553 | 99% | 99% | all | all |
| 2015-2016 | 1,789 | 99% | 98% | all | 100% |
| 2017-2018 | 1,810 | 99% | 99% | all | 100% |
| 2019-2020 | 1,983 | 99% | 99% | all | 100% |
| 2021-2022 | 1,753 | 99% | 98% | all | all |
| 2023-2024 | 1,996 | 99% | 99% | all | all |
| 2025-2026 | 2,243 | 99% | 100% | 99% | 100% |
Before You Start
A bill number is not a key. HB100 names a different bill in every
biennium, so every table carries a term and
the pair bill + term is what joins
them. Getting this wrong silently merges two centuries of different
bills, which is a mistake this project has made and fixed.
The status, outcome and chip columns
The status, outcome and
chip columns in bills.csv say where a bill stands in
three ways. status is how it stands or how it ended, in
full: Killed, Died on the table, Vetoed, override
failed, In committee. outcome is the kind of
that status: active for a bill still moving,
law, done, veto,
study for interim study, and adopted for a
resolution adopted or a constitutional amendment both chambers passed.
chip is the word the bill's card and the bill
search's Status filter show: Became Law, Died, Interim Study,
Tabled, Vetoed or Withdrawn. Tabled is a bill on the table while its
session still has days to sit, and Vetoed a veto whose override vote
is still to come; once the session has ended either is Died, and a
veto both chambers overrode is Became Law. A bill still moving has its
stage there instead, and an adopted resolution, a constitutional
amendment's ballot, a bill only proposed for a special session, one
the House did not introduce and one awaiting the governor have their
own words. Each row of /idx/<term>.json and of a
committee's file carries the same
word as chip, beside its status.
chip is the last column, so every column before it is
where it was before it was added.
The passage column
The passage column in bills.csv is
where the bill started, H or S, then one
character per stop in the order it travelled: the chamber it started
in, the other chamber, the Governor and the statute book.
p passed, x stopped there, h is
there now, - has not reached it. So a Senate bill reads
Senate first. A House or Senate resolution, which only its own chamber
adopts, has three characters rather than five; a concurrent or joint
resolution goes to both chambers and has five. The column is empty
where the docket does not record enough of the bill's journey to
draw it, or records one its outcome contradicts.
The rail field
The rail field of a row of
/idx/<term>.json is the rail the bill's card
draws: one entry a stop, in the order the bill travelled, each the
stop's letter — I introduced, H,
S, G the Governor, L the statute
book, V the voters — with its mark as in
passage, except that a chamber where the bill was held for
interim study is s where passage has
x, and one where it lies on the table while the session
still sits is t where passage has
h; then the day and a word or two of how it went
where there are any. The card draws the day under each stop; the words
are what its rail says to a reader who hears the page. It is not in
bills.csv.
A constitutional amendment's ballot
A constitutional amendment's ballot. What the
voters made of an amendment both chambers sent them is the
docket's word where it records one, and otherwise
ballot_results.json's, a file in the repository that
no script writes: the Secretary of State's count of the statewide Yes and No votes on each of the 17 the voters have decided, with where it is printed and the day it was read, and Ballotpedia's figures beside each as a cross-check; for the one still to go to the voters, Ballotpedia's listing of the question. An amendment needs two thirds of the votes cast on it,
so the status says ratified or not ratified by that
measure and not by a majority, and a bill's own page shows the two
counts beside it.
The chapter column
The chapter column is the chapter of
that year's session laws the bill became: the bill's status page
where the General Court gives one, and otherwise the docket's law
line — “1, special session” for a special session's
own numbering. It is empty for a bill that did not become law, and for
a few laws whose chapter this site could not take from the docket: it
gives none, gives one number to two bills in a year — one of them
a typing error the docket cannot say which — or writes it in a
form not yet read.
A blank cell is usually an answer
A blank cell is usually an answer. In
proceedings.csv a sitting with no start_seconds has no
moment in a recording to point at. Most have no recording to link at
all, and nearly all of those are older than the General Court's
YouTube channels, which begin in May 2020; a bill passed on a consent
calendar was adopted in a block and never taken up on its own; the rest
have a recording in which the moment has not been found yet, and
how_placed says which. In bills.csv,
roll_calls counts the roll calls on the bill itself, where
each member's vote is recorded by name, and leaves out procedural
ones such as suspending the rules. It counts from the General
Court's roll-call files, which begin in 1999, so a bill from before
then has none here, even where the docket gives a roll call's tally
and the printed journals name who voted. A later bill with none was
decided by a voice or division vote, which records no individual
member, or has no floor vote on record.
Using It
The record itself is the State of New Hampshire's and is public. This site adds the parsing, the joining and the plain-English summaries. Use it for whatever you like; a link back to graniterecord.org helps somebody check your working, which is the point of publishing the whole thing rather than a chart of it.
Found something that looks wrong? The page for that bill links the General Court's own record so the two can be compared, and its Report a problem button tells us.
How the Record Is Built
What Is Taken from the Record and What Is Generated
Dates, sponsors, vote tallies, committee assignments and hearing times are taken directly from the official record. Committee reports are reproduced as filed, in the committee's own words.
Plain-language summaries of a bill's progress are generated from those records by software, not written by hand. Most timestamps are not estimates: they are the moment the chair or the clerk opened the item, found by matching what they said against the recording's captions. The player opens two seconds before that, which is enough not to clip the first word. Where no boundary was heard, the site either shows a start marked approximate or links the recording with no time at all — it does not guess.
Related bills are found by comparing the text of bills and their amendments. A bill is listed only where most of its language is shared, and an amendment only where the docket records what became of it, so a real connection can be missed but a weak one is not shown.
How Much of This Is Timed, and How Well
The record here holds 105,267 occasions on which a bill was taken up — hearings, executive sessions, work sessions and floor debates — across 33,077 bills. What the site can say about each one depends almost entirely on whether there is a recording of it to link.
For 82,348 of them, there is no recording to offer. The recordings this site links are on the General Court's YouTube channels, which begin in May 2020; 81,545 of these meetings happened before that, which is 77% of the whole record, and the other 803 are meetings since then that no recording has been matched to. Most carry the date, the committee and the room, and nothing to play.
20,939 have a recording. On 14,253 of them — 68% — the page opens the recording at the moment the bill was taken up. On the other 6,686 it links the recording and says plainly that the moment has not been established, rather than guessing one. A further 1,980 were decided on a consent calendar: the committee's report adopted in a block, never read out and never debated, so there is no moment in the recording to find.
Where the moment is claimed, it usually comes from someone saying so. Most of these are the chair or the clerk opening the item, matched against the recording's captions; some are a roll call's own clock time from the General Court's record, which involves no speech recognition at all; the rest are inferred from where the bill is discussed, and those are the ones marked approximate. Only that word separates an inferred start from a quoted one.
The timing is checked against 63 proceedings that a person timed by watching the recording, across 34 recordings. Of these it places 44: the median is out by 1 second, and 38 of 44 are within a minute. 2 are more than ten minutes out — the worst by 88 minutes — and that is not imprecision but a proceeding placed somewhere else, which is a different fault and is being worked through. The remaining 19 carry no time at all rather than a guessed one. Opening each recording at its scheduled time instead — the obvious method, and the one this replaced — would be out by 15 minutes at the median. Last measured September 17, 2026.
Speech recognition is worst at exactly the things that matter most — names, numbers and organizations. Check the recording before quoting anything.
Privacy in Detail
Page views are counted: how many there are, and which pages. That is Cloudflare Web Analytics, which runs on the pages this site is served from. It sets no cookies, it does not follow anyone between sites, and it does not build a profile of a reader — what comes back is a count per page, with the country, browser and referrer of the visit in aggregate. Nobody here can tell one reader from another, and nothing about what you read is stored against you.
Nothing else is collected. There are no accounts, no email addresses and no advertising. The feeds need no subscription, so nothing knows who takes them. Search runs in your own browser against files this site serves. When a search takes you to a results page — the bill search, the record search or the legislator list — your words travel in that page’s address. This site’s server receives them, as it receives any address, and the page-view count may record that address like any other. The typefaces come from Google Fonts, so Google sees a request for them when a page opens. Video is embedded from YouTube’s no-cookie address, which still means YouTube sees a request when a player is opened — a player only loads if you press play.
One thing a reader sends deliberately is feedback, through the form linked in the footer. That is a Google form, and what you put in it goes to Google and to us.
The other is a report, from the button marked Report a problem on bill, committee and legislator pages. A report holds the page and the record it is about, the tab that was open, the kind of problem chosen from a list, what you wrote, the time it arrived and which build of the site you were reading. Nothing in it identifies you — no IP address, no cookie, no email address — which is also why we cannot reply to one. It is read only to check the page against the official record and fix what is wrong, and it is deleted after a week.
For Developers
The Manifest
data/manifest.json lists
every table with its rows, byte size and column names, so a script can
discover what is here in one request instead of guessing from
filenames. The site's own JSON is served from this origin too and is
open to cross-origin requests: idx/<term>.json, each
term's bills as the bill list and the search read them, which the
manifest lists with their addresses and sizes;
legislators.json; and
rollcalls_index.json. Every
term's file together is every bill. One file of all of them,
index.json, was retired on October 5, 2026, when it had grown to nine
tenths of the largest file this site's host will serve; the same
bills are bills.csv above, in one table.
Feeds
Following a bill takes no account and no email address: every feed below is a fixed address, rebuilt whenever the site is. 703 of them are published.
feed/all.xml
Every action on every bill, newest first.feed/hearings.xml
Hearings, work sessions and executive sessions as they are scheduled.feed/bill/<year>/<number>.xml
One bill. Written for a bill still moving; a bill that concludes gets a last item saying how it ended, and then the feed retires.feed/legislator/<name>.xml
One member: what they sponsored and how they voted.feed/committee/<code>.xml
One committee: what it met on and what it reported.feed/topic/<subject>.xml
One subject, across every bill filed under it.
Read the Code
Every script that fetches, parses and builds this site is public, so a figure here can be traced to the line that produced it.
granite-record on GitHub — MIT licensed. The logo and icons are not in it: they are used under license from their owners.
- What a clone gets
- 215 files carry a version stamp the build refuses to let drift, and 907 checks run over the whole of it with no network and nothing fetched. The roll-call history as the General Court published it, and the handful of files a person made by hand — the timings taken with a stopwatch, the corrections, the offices filled in from official sources, the voters' counts on the constitutional amendments.
- What it does not
- The rest of the record — the dockets, the database dump, the saved bill pages, the calendars and the journals — which is the General Court's and changes as it does; the caption files this site reads timestamps out of, about 20 GB, and the audio of a few dozen recordings transcribed here, about 15 GB; and the built site, which one run regenerates. All of it can be fetched or built again, and a repository carrying it would be unusable.
- Rebuilding it
- A fresh clone has almost nothing to build from; the README says how
to fetch the record, and how gently. With the record on disk,
python3 build_all.py --localbuilds the whole site and asks the General Court for nothing.python3 preflight.pyruns the checks, and most of them need no record at all.
The Whole Record as Lists
Every bill, legislator, committee and town as a plain link: no JavaScript, no search box, nothing to load. It is the version of this site that works anywhere, and it is what a crawler follows.