Skip to content

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

Request
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"
Response — captured live, 2026-08-25
{
  "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).

n8n HTTP Request node — method, URL, header
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_here

Google Sheets

A custom function that turns any address column into a district and representative column, in place.

Apps Script — REVADDRESS_DISTRICT()
/**
 * 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.

VendorPer lookupBasis
RevAddress$0.0033 credits per call, pay-as-you-go, US-hosted
Cicero$0.05965,000 credits for $298
Geocodio$0.0020$1 per 1,000 credits; address + congressional district = 2 credits

Vendor figures as of 2026-08-25, read from each vendor's own published pricing.

Replace the call Google turned off.

A free key covers hundreds of district lookups before anything is charged. Wire it in once.