Who holds office at a US address, with the page we read it from.

The Rallybase API returns the officials for a US address: federal and state for any address in the 50 states and DC, county and city where we hold them, each row naming its source page. Works with your own code. A connector for Claude reads federal, state, county and city officials, bills and elections.

An example

Levels
One call answers federal, state, county, city, school and other local officials for the point, where we hold them. A level with no rows says why.
Each official
A stable id, the office and the name, the public page the row was read from, and the day it was read or the reason no day is held.
Also in the answer
The districts the point is in, the governing bodies there with the law that sets them up, and which cities there have a roster we hold.

Look up who represents a street address

Every level for one address: federal, state, county, city and school. The address is URL-encoded and sent in the x-geocode-address header, never in the URL: a URL is cached and logged. We resolve it to a point and do not store it. Coordinates work the same way in the x-rb-lat and x-rb-lng headers. The address below is a placeholder.

# -i prints the status and headers: on a 429, Retry-After says how long to wait. Do not loop or retry blindly.
curl --fail-with-body -sS -i "https://rallybase.org/api/v2/lookup" \
  -H "Authorization: Bearer $RALLYBASE_KEY" \
  -H "x-geocode-address: 1600%20Example%20St%2C%20Austin%2C%20TX"
The full example request and answer

A real request and the shape of its answer. $RALLYBASE_KEY stands for your key; the name and the page in the answer are placeholders.

curl "https://rallybase.org/api/v2/lookup" \
  -H "Authorization: Bearer $RALLYBASE_KEY" \
  -H "x-geocode-address: 1600%20Example%20St%2C%20Austin%2C%20TX"

{
  "license": "Data licensed under the Rallybase API Terms: use, display and analysis in your own product or research; no resale or redistribution as a dataset or competing service; attribution with source links when shown publicly.",
  "snapshot": {
    "id": "snap-example",
    "built_at": "2026-10-28T06:00:00.000Z"
  },
  "freshness": "weekly snapshot",
  "county": {
    "fips": "48453",
    "name": "Travis",
    "state": "TX"
  },
  "officials": [
    {
      "id": "federal-rep-X000001",
      "level": "federal",
      "office": null,
      "office_label": "U.S. Representative, TX-37",
      "name": "Alex Example",
      "jurisdiction": "U.S. House of Representatives",
      "ocd_id": "ocd-division/country:us/state:tx/cd:37",
      "district_key": null,
      "party": "Example Party",
      "phone": "202-555-0100",
      "email": null,
      "website": "https://example.house.gov",
      "source_url": "https://www.example.gov/members",
      "read_at": null,
      "read_basis": "not held — officials.last_synced is a sync or load time, not a read date (see recorded)",
      "recorded_on": "2026-10-27",
      "attribution": null
    },
    {
      "id": "state-ocd-person/00000000-0000-0000-0000-000000000000",
      "level": "state",
      "office": null,
      "office_label": "State Senator, District 14",
      "name": "Sam Example",
      "jurisdiction": "TX Senate",
      "ocd_id": "ocd-division/country:us/state:tx/sldu:14",
      "district_key": null,
      "party": "Example Party",
      "phone": "512-555-0100",
      "email": "sam.example@example.gov",
      "website": "https://www.example.gov/senate/14",
      "source_url": "https://www.example.gov/senate",
      "read_at": null,
      "read_basis": "not held — officials.last_synced is a sync or load time, not a read date (see recorded)",
      "recorded_on": "2026-10-27",
      "attribution": null
    },
    {
      "id": "county-official-48453-county_judge",
      "level": "county",
      "office": "county_judge",
      "office_label": "County Judge",
      "name": "Jane Example",
      "jurisdiction": "Travis County, TX",
      "ocd_id": "ocd-division/country:us/state:tx/county:travis",
      "district_key": null,
      "party": null,
      "phone": null,
      "email": null,
      "website": null,
      "source_url": "https://www.example.gov/county-judge",
      "read_at": "2026-10-20",
      "read_basis": "rb.county_official.fetched_at",
      "recorded_on": null,
      "attribution": null
    },
    {
      "id": "place-official-4805000-mayor-citywide-pat-example",
      "level": "place",
      "office": null,
      "office_label": "Mayor",
      "name": "Pat Example",
      "jurisdiction": "Austin City Council",
      "ocd_id": null,
      "district_key": "place_geoid:4805000",
      "party": null,
      "phone": null,
      "email": null,
      "website": null,
      "source_url": "https://www.example.gov/council",
      "read_at": "2026-10-21",
      "read_basis": "last_verified_on: a person re-read the city page",
      "recorded_on": null,
      "attribution": null
    }
  ],
  "point": {
    "read_at": "2026-10-28T14:03:11.000Z",
    "districts": [
      {
        "name": "Congressional District 37",
        "level": "federal",
        "state": "TX",
        "census_geoid": "4837"
      },
      {
        "name": "State Senate District 14",
        "level": "state",
        "state": "TX",
        "census_geoid": "48014"
      }
    ],
    "bodies": [
      {
        "body_name": "Commissioners Court",
        "body_kind": "county_commission",
        "seats": 5,
        "composition": "A county judge elected countywide and four commissioners elected by precinct.",
        "election_method": "mixed",
        "citation": "Tex. Const. art. V, § 18",
        "source_url": "https://www.example.gov/constitution",
        "verified_on": "2026-09-01",
        "applies_as": "state_default"
      }
    ],
    "place_rosters": [
      {
        "place_geoid": "4805000",
        "place_name": "Austin",
        "state": "TX",
        "status": "rostered",
        "count": 11,
        "reason": null,
        "checked_at": "2026-09-17"
      }
    ]
  },
  "coverage": {
    "county": "held",
    "levels": {
      "federal": "served",
      "state": "served",
      "place": "served",
      "school": "none held",
      "local": "none held"
    },
    "held_not_redistributed": 0,
    "note": "No row held for this lookup was withheld by the licence filter or the row text rules."
  }
}

Plans

PlanPriceLookupsGet it
Open$0500 per month. 10 per minute, 300 per dayGet a free key
Builder$19 / month, plus tax where applicable50,000 per month
Pro$49 / month, plus tax where applicable1,000,000 per month
Customfrom $299 / month, plus tax where applicableabove 5,000,000; 8.5M included, then $35 / $25 / $15 per million by volume band, by order formTalk to us

Built for research

Each row names the page it was read from and the day it was read. Where our data comes from lists the sources and what each does not cover; Coverage counts what is held and shows the blanks.

Use it from Claude

Rallybase is also a connector for Claude. It reads federal, state, county and city officials, saved bills and the elections held for a state. It takes no address: the address lookup is the keyed API above.

Rallybase is in Claude’s connector directory. Add Rallybase to Claude.

  1. In Claude, open Settings, then Connectors, and choose Add custom connector.
  2. Paste https://rallybase.org/mcp as the address.
  3. Claude sends you to the Rallybase Connect page. Log in and choose Allow.

https://rallybase.org/mcp

It can read
County officers; a state’s federal and state officials, with their offices’ published phone, email and website; a city’s officials; saved bills; and the elections held for a state.
It cannot
It can only read. It cannot change anything on your account or on Rallybase.
What you need
A connection needs a Rallybase account with a key. The free key is enough.
Your allowance
Its lookups count toward your account's monthly allowance. In one day a connection can use up to a tenth of it.
To end it
You can end this link at any time by signing out of all devices, changing your password or revoking your API key.

Questions

Where does a row come from?
From a public page, named in the row. A row carries the day we read it where we hold one; where we do not, the row says so.
What if a row is wrong?
Tell us, and we will read the source again.