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 bills.csv

Rows run by term, then by bill in the order the site lists them: HB, HR, HCR, CACR, SB, SR, SCR, HJR, SJR, then any other kind, each by its number counted as a number, so HB 103 comes before HB 1003. sponsors.csv and proceedings.csv order their bill column the same way.

bill + term is the key every other table refers to. A bill number alone is not a key: HB100 names a different bill in every biennium.

Columns term, year, bill, title, sponsor, committee, topic, status, outcome, passage, roll_calls, chapter, chip

33,717 rows7.7 MBDownload bills.csv
legislators.csv

The sitting roster, with district, contact details and committee seats.

More about legislators.csv

id is member_id in the vote and sponsor files. Only the sitting members are here.

Columns id, name, chamber, party, district, county, email, committees, bills_sponsored, recorded_votes

406 rows0.1 MBDownload 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 rollcalls.csv

passed is, wherever the record allows, the outcome the clerk recorded in the General Court's docket or its House or Senate Journal; outcome_source says where it came from: docket; docket, implied (the docket line implies the outcome rather than stating it, as a unanimous tally or an order to third reading does); journal; count, where the docket names an outcome its own tally does not allow under the threshold this site applies, so passed follows the members' votes and the vote's page says so; or rule, where the record names no outcome and the count decides it.

roll_call is year-body-number and is the key the vote files use. bill + term joins bills.csv.

Columns roll_call, term, year, body, number, date, bill, question, question_plain, yeas, nays, not_voting, passed, procedural, threshold_needed, threshold_rule, outcome_source

9,565 rows1.1 MBDownload 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 proceedings.csv

start_seconds and end_seconds are the moment in the recording the bill's page gives, and how_placed says how it was found: stated (the chair said it), floor_stated (opened by the clerk's reading of the committee report and closed by the chair's announcement of the result), floor_precise (a roll call's clock time), located (estimated from the captions; the page says approximate), whole_video (the recording is the proceeding) and floor_dated (the day's floor session, with a start only where the clerk's reading of the committee report was found). No moment was found for a floor_dated row with no start, nor for three other values: approximate, despite its name, is a recording in which the moment has not been found yet; consent is a bill adopted in a block on a consent calendar and never taken up on its own; and an empty how_placed is a proceeding with no recording matched to it. A meeting the docket gave notice of for a bill that was never introduced, or for a day after the bill was withdrawn, is not a row: the bill's own page says what the docket entered. scheduled_seconds is the meeting's called time minus the stream's start, which is the schedule and not a finding.

bill + term joins bills.csv. video_id is a YouTube id.

Columns term, bill, body, kind, date, time, committee, venue, video_id, video_title, start_seconds, end_seconds, how_placed, end_how, scheduled_seconds

105,476 rows11.4 MBDownload proceedings.csv
sponsors.csv

Who put their name to which bill, and who was prime.

More about sponsors.csv

Sponsoring is not voting and is not counted as one. source says where each name was read: the General Court's sponsor file or its bill status page for the current term; its sponsor record for 2023-2024, where each bill's printed sponsor line agrees with it; or the sponsor line printed on the bill's text, where the first name is taken as prime -- every term before 2023, and the 2023-2024 bills whose printed line and record disagree; or, on a bill of a term before 2023 that no other source names a sponsor for, the General Court's sponsor record again, which gives a chamber and no district, marks the prime itself on all but four resolutions (where the first name is taken as prime) and in 1999-2000 leaves co-sponsors off some bills that print them, so a list filled from it in that term may be short; or the House Journal, for the bills none of the General Court's lists carry, where the first name in its list of bills introduced is taken as prime. member_id is empty where this site has not matched the name to a member: a sponsor read off a bill's text before 1999, when the roll-call files it matches against begin, and a few after; a sponsor from the sponsor record carries the id its number votes under where any roll call was cast under it, in any term.

bill + term joins bills.csv; member_id joins legislators.csv for a sitting member, and a former member has no row there.

Columns term, bill, member_id, member, party, chamber, prime, role, source

129,481 rows9.0 MBDownload 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 votes-<term>.csv

Join to rollcalls.csv on roll_call.

roll_call joins rollcalls.csv; bill + term joins bills.csv; member_id joins legislators.csv for a sitting member, and a former member has no row there.

Columns roll_call, term, date, bill, question, member_id, member, party, chamber, vote

2,303,047 rows209.3 MBEach 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.

TermBills SponsorCommittee TopicPassage
1989-19901,632 all 96% all 100%
1991-19921,675 100% 96% all 100%
1993-19941,784 100% 97% all all
1995-19961,586 100% 97% all 100%
1997-19981,849 100% 99% all all
1999-20001,673 100% 98% all 100%
2001-20021,487 100% 99% all all
2003-20041,605 100% 99% all all
2005-20061,837 100% 99% all 100%
2007-20081,955 100% 99% all 100%
2009-20101,735 100% 99% all 100%
2011-20121,772 99% 99% all 100%
2013-20141,553 99% 99% all all
2015-20161,789 99% 98% all 100%
2017-20181,810 99% 99% all 100%
2019-20201,983 99% 99% all 100%
2021-20221,753 99% 98% all all
2023-20241,996 99% 99% all all
2025-20262,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 215
    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 406
    One member: what they sponsored and how they voted.
  • feed/committee/<code>.xml 37
    One committee: what it met on and what it reported.
  • feed/topic/<subject>.xml 43
    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 --local builds the whole site and asks the General Court for nothing. python3 preflight.py runs 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.

Open the directory