Districts API · Google Civic replacement
Google Civic Representatives replacement
Google retired the Civic Information API's Representatives endpoint on April 30, 2025, with no direct successor. /api/address/districtsis the working replacement: one street address in, congressional, state senate, state house, county, place, and school district out — plus the district a voter is actually in this November, in the states that redrew.
01One call, every layer
curl -s "https://api.revaddress.com/api/address/districts?streetAddress=1100+Congress+Ave&city=Austin&state=TX&ZIPCode=78701" \
-H "X-API-Key: rv_live_your_key_here"{
"matched_address": "1100 CONGRESS AVE, AUSTIN, TX, 78701",
"districts": {
"congressional": {
"district": "37",
"name": "Congressional District 37",
"vintage": "119",
"representative": { "name": "Lloyd Doggett", "party": "D", "url": "https://doggett.house.gov" }
},
"state_senate": { "district": "14", "name": "State Senate District 14", "vintage": "2024" },
"state_house": { "district": "49", "name": "State House District 49", "vintage": "2024" },
"county": { "name": "Travis County" },
"place": { "name": "Austin city" },
"school_district_unified": { "name": "Austin Independent School District" },
"congressional_2026": {
"district": "10",
"name": "Congressional District 10",
"status": "in_effect_under_challenge",
"status_as_of": "2026-08-20",
"note": "Texas PLANC2333 (89th Legislature, 2nd C.S., 2025); in effect for 2026 under a U.S. Supreme Court stay while the merits appeal continues. Seats on 2026-cycle lines are filled at the November 2026 election — no representative is matched to this district."
}
},
"senators": [
{ "name": "John Cornyn", "party": "R", "url": "https://www.cornyn.senate.gov" },
{ "name": "Ted Cruz", "party": "R", "url": "https://www.cruz.senate.gov" }
],
"source": "census_geocoder",
"note": "District assignment derives from U.S. Census Bureau TIGER/Line boundaries (Current vintage). Authoritative for outreach and mail targeting; confirm official precinct assignment with the local election office."
}Rows that Google Civic never returned are the point: the state's own enacted 2026 map, stamped with a litigation status, beside the seated congressional district — so a caller knows both who represents an address today and which line the seat is decided on this November.
02What comes back
181
districts redrawn across all ten 2026 redistricting states
6
district and jurisdiction layers per address — congressional, state senate, state house, county, place, school
3 credits
per call — no subscription required
- Congressional
- The seat, the member's name, party, and official site — House and Senate both. In the ten states that redrew for 2026, the 2026-line seat rides beside it with its litigation status.
- State senate & house
- Both chambers on every address, each with the sitting legislators: name, party, email and official page, as an array because multi-member districts exist.
- County, place & school district
- County and incorporated place by name, plus the unified, elementary, or secondary school district that actually serves the address — read from whichever of the three Census layers applies.
- Sourcing on every row
- Every district names its Census TIGER/Line vintage. A 2026-line row states its enacting statute and stays honest when a lookup fails upstream — no district is ever asserted as absent when the truth is that the call did not complete.
03Wire it into what you already run
n8n
Call it today with n8n's built-in HTTP Request node — GET the endpoint, add anX-API-Keyheader, and map the response straight into your workflow. Or install the community node: Settings → Community Nodes → n8n-nodes-revaddress(Validate, Districts and Profile as one node, the key held as a credential).
GET https://api.revaddress.com/api/address/districts?streetAddress={{$json.street}}&city={{$json.city}}&state={{$json.state}}&ZIPCode={{$json.zip}}
Header: X-API-Key: rv_live_your_key_hereGoogle Sheets
A custom function that turns any address column into a district and representative column, in place.
/**
* District lookup for one address cell.
* Usage: =REVADDRESS_DISTRICT("1100 Congress Ave, Austin, TX 78701")
* Set your key once: Project Settings → Script Properties → REVADDRESS_API_KEY
*/
function REVADDRESS_DISTRICT(address) {
const key = PropertiesService.getScriptProperties().getProperty('REVADDRESS_API_KEY');
const parts = String(address).split(',').map(function (p) { return p.trim(); });
const stateZip = (parts[2] || '').split(' ').filter(Boolean);
const qs = Object.entries({
streetAddress: parts[0] || '',
city: parts[1] || '',
state: stateZip[0] || '',
ZIPCode: stateZip[1] || '',
}).map(([k, v]) => k + '=' + encodeURIComponent(v)).join('&');
const res = UrlFetchApp.fetch(
'https://api.revaddress.com/api/address/districts?' + qs,
{ headers: { 'X-API-Key': key }, muteHttpExceptions: true }
);
const data = JSON.parse(res.getContentText());
const cd = data.districts && data.districts.congressional;
if (!cd) return data.message || data.error || 'No match';
const rep = cd.representative;
return 'CD-' + cd.district + (rep ? ' (' + rep.name + ', ' + rep.party + ')' : '');
}04Price
Each call is $0.003 (3 credits) — no subscription, no per-seat fee. The free grant on signup (1,000 credits, good for 30 days) covers more than 300 calls before anything is charged.
Replace the call Google turned off.
A free key covers hundreds of district lookups before anything is charged. Wire it in once.