Free, open-source civic engagement tools for Arizona advocacy groups. Find your legislators, track bills, and help your community participate in the political process.
No frameworks. No build step. Just HTML, CSS, and JS you can drop into any website.
| Tool | Status | Description |
|---|---|---|
| Cactus Watch | Live | Real-time bill tracker for the Arizona Legislature with a free public API |
| District Finder | Live | Interactive map — find your Senator and Representatives by address or district |
Cactus Watch tracks every bill in the Arizona Legislature and serves the data through a free, public API. Updated daily at 6:00 AM Arizona time.
- Every bill from the current session — House, Senate, resolutions, memorials, joint resolutions
- Sponsors and cosponsors with party affiliation
- Committee votes — which committees acted, how they voted
- Floor votes — how every individual legislator voted on every bill
- Bill status — from introduction through committee, floor votes, and governor action
- Deadline-based dead bill detection — bills that miss procedural deadlines are automatically marked dead, with resurrection when activity resumes
- Strike-everything amendments — flags bills whose content has been replaced via striker amendments
- Plain-language overviews — scraped from azleg.gov fact sheets for bills with upcoming hearings
- RTS (Request to Speak) agendas — upcoming committee hearings with direct links to submit testimony
- Organization recommendations — curated positions from advocacy orgs (CEBV, Secular AZ, SOS Arizona)
- Search and filter — by chamber, status, sponsor, bill type, keyword, active/inactive, or upcoming hearing
No API key needed. Just fetch and go.
# Get all bills
curl "https://cactus.watch/api/bills"
# Search for education bills
curl "https://cactus.watch/api/bills?search=education"
# House bills that passed committee
curl "https://cactus.watch/api/bills?chamber=H&status=passed_committee"
# Only active bills (excludes dead, vetoed, signed, held)
curl "https://cactus.watch/api/bills?status=__active__"
# Bills with upcoming hearings
curl "https://cactus.watch/api/bills?hearing=1"
# Full detail on a specific bill (sponsors, votes, RTS agendas, org recommendations)
curl "https://cactus.watch/api/bills/HB2839"
# Upcoming committee hearings with bill data
curl "https://cactus.watch/api/hearings"
# RTS agenda items for a specific bill
curl "https://cactus.watch/api/rts/HB2839"
# Organization bill recommendations
curl "https://cactus.watch/api/orgs"
# Session metadata and bill count summary
curl "https://cactus.watch/api/meta"
# Bills that changed since a date (for syncing)
curl "https://cactus.watch/api/bills/sync?since=2026-03-01"| Filter | Values | Example |
|---|---|---|
| Chamber | H (House), S (Senate) |
?chamber=H |
| Status | introduced, in_committee, passed_committee, on_floor, passed_house, passed_senate, passed_both, to_governor, signed, vetoed, dead, held, __active__, __inactive__ |
?status=signed |
| Type | bill, memorial, resolution, concurrent_resolution, joint_resolution |
?type=bill |
| Sponsor | Any name (partial match) | ?sponsor=Smith |
| Search | Keywords in title, number, or description | ?search=water+rights |
| Hearing | 1 to show only bills with upcoming hearings |
?hearing=1 |
| Sort | number, updated_at, date_introduced, status, sponsor |
?sort=date_introduced&order=asc |
| Pagination | page (default 1), limit (default 50, max 200) |
?page=2&limit=100 |
Full API documentation: Wiki — API Reference
Interactive map of Arizona's 30 legislative districts. Search by address or click the map to find your Senator and Representatives.
Paste this into your HTML:
<iframe
src="https://az-civic-tools.github.io/az-civic-tools/tools/district-finder/district-finder.html"
width="100%"
height="900"
frameborder="0"
style="border: none;"
></iframe>That's it. Works on any website.
git clone https://github.com/az-civic-tools/az-civic-tools.git
cd az-civic-tools/tools/district-finder- Edit
themes/default.cssto change colors, fonts, and spacing - Edit
data/legislators.jsonto update legislator information - Deploy to any static host (GitHub Pages, Cloudflare Pages, Netlify, etc.)
<link rel="stylesheet" href="path/to/themes/default.css">
<link rel="stylesheet" href="path/to/district-finder.css">
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css">
<div id="my-district-finder"></div>
<script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
<script src="path/to/district-finder.js"></script>
<script>
AZDistrictFinder.init({
container: '#my-district-finder',
dataUrl: 'path/to/legislators.json',
geojsonUrl: 'path/to/az-districts.geojson',
source: 'My Organization',
sourceUrl: 'https://myorg.org'
});
</script>?district=7— Pre-select a district on load?source=My+Org— Set the copy-markdown attribution
Override CSS custom properties (all prefixed --df-) to match your brand:
:root {
--df-font-heading: 'Your Font', sans-serif;
--df-color-primary: #2E5090;
--df-color-accent: #E8A317;
}More guides: Wiki — Customizing Colors & Fonts
- Bill data: Arizona State Legislature — scraped daily via azleg.gov API
- District boundaries: Arizona Independent Redistricting Commission (effective 2022)
- Legislator information: Arizona State Legislature
- Address geocoding: OpenStreetMap Nominatim
See CONTRIBUTING.md for guidelines. We welcome data corrections, new themes, bug fixes, and new tools.
Visit the Wiki for detailed technical docs:
MIT — Use it however you want. No attribution required.