Citizens Count APIcitizenscount.org ↗
Access NH candidate profiles, election results, bill details, elected officials by town, and voter guides from Citizens Count via a structured REST API.
What is the Citizens Count API?
The Citizens Count NH API exposes 15 endpoints covering New Hampshire political data including candidate profiles, election results, bill tracking, and elected officials by town. Use get_candidate_profile to pull a candidate's party affiliation and policy positions by slug, or get_elected_officials_by_town to retrieve every representative at the federal, state, and local level for a specific NH municipality.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/b478096f-c6b1-4653-9c31-f53541f97170/get_candidate_list' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace citizenscount-org-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Citizens Count NH — research NH political data, bills, and elections."""
from parse_apis.citizens_count_api import CitizensCount, NotFound
client = CitizensCount()
# List topics and drill into one for related bills
topic = client.topics.list(limit=3).first()
if topic:
detail = client.topics.get(slug=topic.slug)
print(detail.title, detail.content[:80])
# Search for content across the site
for result in client.searchresults.search(query="marijuana", limit=3):
print(result.title, result.url)
# Browse bills filtered by topic, then get full detail on one
bill_summary = client.billsummaries.list(topic="guns", limit=1).first()
if bill_summary:
bill = bill_summary.details()
print(bill.title, bill.summary)
# Look up representatives for a specific town via sub-resource
town = client.town(slug="sullivan/acworth")
for rep in town.representatives.list(limit=5):
print(rep.name, rep.office)
# Get election results via constructible Election sub-resource
election = client.election(slug="2026-nh-house-special-election-ossipee-tuftonboro-and-wolfeboro-0")
for result in election.results.list(limit=3):
print(result.candidate, result.party, result.votes)
# Typed error handling for a missing candidate
try:
client.candidates.get(slug="nonexistent-person-xyz")
except NotFound as exc:
print(f"not found: {exc.slug}")
print("exercised: topics.list / topics.get / searchresults.search / billsummaries.list / bill.details / town.representatives.list / election.results.list / candidates.get")Retrieve the full A-Z list of candidate and officeholder profiles from Citizens Count NH. Returns all candidates with their names, slugs, and profile URLs. No pagination — all candidates returned in a single request.
No input parameters required.
{
"type": "object",
"fields": {
"total": "integer total number of candidates",
"candidates": "array of candidate summary objects with name, slug, and url"
},
"sample": {
"data": {
"total": 3625,
"candidates": [
{
"url": "https://www.citizenscount.org/candidate/kimberly-abare",
"name": "Kimberly Abare",
"slug": "kimberly-abare"
},
{
"url": "https://www.citizenscount.org/candidate/daryl-abbas",
"name": "Daryl A. Abbas",
"slug": "daryl-abbas"
}
]
},
"status": "success"
}
}About the Citizens Count API
Candidate and Official Data
The get_candidate_list endpoint returns the full A-Z roster of candidates and officeholders — name, slug, and profile URL — in a single request with no pagination. Pass a slug to get_candidate_profile to retrieve that person's party affiliation, current office, and an array of policy position objects, each containing an issue label, stance, and description. get_elected_officials_by_town accepts a town_slug in county/town format (e.g. sullivan/acworth) and returns representatives across all government levels for that location. Use get_nh_towns_list to enumerate all valid town slugs before querying by town.
Bills and Policy Topics
get_bills_list returns up to 25 bill summaries per page (0-indexed) and accepts an optional topic filter using slugs drawn from get_topics_list — for example guns or marijuana. Each bill object includes a bill number, status, and short description. get_bill_detail goes deeper: pass a bill slug like hb-609-2025 to receive the full summary, title, sponsor information, and a became_law field indicating final disposition. get_topic_detail returns the topic's description text plus an array of related bill titles for cross-referencing legislation to policy areas.
Elections and Results
get_elections_list returns every election tracked by Citizens Count — past and upcoming — with names and slugs. Feed a slug to get_election_results to get race-level results: candidate name, party, vote count, and percentage for each race in that election. This makes it straightforward to build historical win/loss records or compare margin data across election cycles.
Articles, Search, and Voter Information
search_site accepts a keyword or phrase and returns matching content across all Citizens Count content types — articles, issues, and candidate pages — with title, URL, and a text snippet per result. get_articles_list paginates the site's discussion and news feed; get_article_detail accepts a path slug beginning with /news/ or /issues/ and returns the full article body, publication date, and URL. get_voter_information returns a structured voter education guide with article titles and URLs covering registration, voting procedures, and candidate research.
The Citizens Count API is a managed, monitored endpoint for citizenscount.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when citizenscount.org changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official citizenscount.org API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a ward-level constituent tool that maps any NH address to its full set of elected representatives using get_elected_officials_by_town.
- Track the legislative status of NH bills filtered by policy topic, using get_bills_list with a topic slug and get_bill_detail for full summaries.
- Generate candidate comparison pages by pulling policy position arrays from get_candidate_profile for two or more slugs.
- Display live and historical NH election results by race, candidate, and vote percentage using get_election_results.
- Populate a policy topic hub with related legislation by combining get_topic_detail and get_bill_detail.
- Power a site-wide political search feature using search_site to surface candidates, bills, and news articles in one query.
- Curate voter education content for a civic app using the structured article list returned by get_voter_information.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.