Texas State Senate District 4 special election results

Texas State Senate District 4 special election results

Texas May 2026 State Senate District 4 special election. See results


{“headline”:”USA TODAY’s Susan Page breaks down Texas Senate primaries”,”id”:”88977540007″,”promoBrief”:”Democrats eye a rare chance to flip a Texas Senate seat, possibly reshaping the November landscape, USA TODAY’s Susan Page explains.”,”shortHeadline”:”Can Democrats snatch a Texas Senate seat?”,”title”:”Democrats see opportunity to flip Texas Senate seat”,”type”:”video”,”adsEnabled”:true,”awsPath”:”news/politics”,”brightcoveAccountId”:””,”brightcoveId”:””,”byline”:””,”embedURL”:””,”hlsURL”:”https://hlsmedia.gannett-cdn.com/authoring/videos/presto/renditions/88977540007/49f470b7-9bf4-4fef-ae8a-b964220743b4/480p_30fps,720p_30fps,1080p_30fps,master.m3u8″,”initialPublishDate”:”2026-03-04T12:20:15.130045506Z”,”keywords”:”Vertical Video,VPC – Video Analytics,Video Syndication – USAT,Video Syndication – OTT Platforms,Congressional Elections,Local Elections,Elections,State Elections,Campaigns u0026 Elections,Legislative Branch,Politics,Government,News,Texas,Democratic Party,Overall Positive”,”mp4URL”:”https://www.gannett-cdn.com/authoring/videos/presto/renditions/88977540007/49f470b7-9bf4-4fef-ae8a-b964220743b4/1080p_30fps.mp4″,”origin”:”Reuters”,”pageURL”:{“long”:”https://www.usatoday.com/videos/news/politics/2026/03/04/democrats-see-opportunity-to-flip-texas-senate-seat/88977540007/”,”short”:”https://www.usatoday.com/videos/news/politics/2026/03/04/democrats-see-opportunity-to-flip-texas-senate-seat/88977540007/”},”renditions”:[{“duration”:61000},{“duration”:61000},{“duration”:61000},{“duration”:61000},{“duration”:0},{“duration”:0},{“duration”:0},{“duration”:0}],”series”:””,”ssts”:{“path”:”news/politics”,”section”:”news”,”subsection”:”politics”,”taxonomyEntityDisplayName”:”Politics”},”videoStill”:”https://www.gannett-cdn.com/authoring/authoring-images/2026/03/04/USAT/88977553007-voters-texas.jpg?crop=1919,1079,x0,y0″}

play
Show Caption

#videoDetailsToggle{color:var( –color-dove-gray,rgba(0,0,0,.6));cursor:pointer;display:inline-block;font-family:var(–sans-serif,sans-serif);font-size:var(–type-7);font-weight:var( –font-weight-bold,900);line-height:var(–spacer-twentyfour,24px);margin-bottom:-8px}#vdt_hide{margin-bottom:10px}.vdt-flex[hidden]{display:none}.vdt-svg{fill:var( –color-dove-gray,rgba(0,0,0,.6));height:var(–spacer-twentyfour,24px);width:var(–spacer-twentyfour,24px)}
(function() {
let vdContainer, vdShow, vdHide,
flagCaption = false,
vdToggle = document.getElementById(‘videoDetailsToggle’),
section = ga_data.route.sectionName || ga_data.route.ssts.split(‘/’)[0],
subsection = ga_data.route.ssts.split(‘/’)[1];

vdToggle.addEventListener(‘click’, ()=> {
// query dom only after user click
if (!vdContainer) {
vdContainer = document.getElementById(‘videoDetailsContainer’);
vdShow = document.getElementById(‘vdt_show’),
vdHide = document.getElementById(‘vdt_hide’);
}
vdContainer.hidden = !(vdContainer.hidden);

// show/hide elements
if (vdContainer.hidden) {
vdShow.hidden = false;
vdHide.hidden = true;
} else {
if (!flagCaption) {
flagCaption = true;
fireCaptionAnalytics()
}
vdShow.hidden = true;
vdHide.hidden = false;
}
});

function fireCaptionAnalytics () {

let analytics = document.getElementById(“pageAnalytics”);

try {
if (analytics) {
analytics.fireEvent(`${ga_data.route.basePageType}|${section}|${subsection}|streamline|expandCaption`);
} else {
if (window.newrelic) window.newrelic.noticeError(‘page analytics tag not found’);
}
} catch (e) {
if (window.newrelic) window.newrelic.noticeError(e);
}
}
}());

The polls are closed, and counting has begun for Texas’s special election in State Senate District 4.

On the ballot were only two candidates — Republican and Democrat.

Tonight’s winner is set to take the district’s vacant seat in the Texas State Senate and represent nearly 950,000 Texans from Montgomery, Harris, Chambers, Jefferson, and Galveston counties.

Here’s what you need to know about the election and what the results are showing.

All five counties are starting to report results

As if 8:30 p.m. Central Time, all five counties in this election are reporting voting numbers as of 8:30 p.m. Central Time.

With only 8.04% of the 112 polling sites reporting, here is the breakdown of how many votes the two candidates have received so far.

  • Ligon (R) — 76% (19,703 votes).
  • Angeletti (D) — 24% (6,272 votes).
  • Total counted votes so far — 25,975.

Republican candidate takes early lead as votes are counted

As of 8 p.m. CT, the Texas Secretary of State reports that Republican candidate Brett Ligon has claimed an early lead, with 76% of the vote, based on 2.68% of votes reported so far.

Democratic candidate Ron Angeletti is coming in with 24% of the vote.

Who was on the ballot?

There are only two names on the ballot — Republican candidate Brett Ligon and Democratic candidate Ron Angeletti.

Creighton has endorsed Ligon to fill his seat.

What was the vacant seat?

The seat had been held by former Republican State Sen. Brandon Creighton for over 10 years before he vacated it to become the new chancellor of the Texas Tech University System in October 2025.

Mateo Rosiles is the Texas Connect reporter for USA TODAY and its regional papers in Texas. Got a news tip for him? Email him at mrosiles@usatodayco.com.

html a.nsb-link,html .primary-content a.nsb-link{box-shadow:0 0;cursor:pointer;height:var(–spacer-twentyfour,24px);margin-right:var(–spacer-twentyfour,24px);text-shadow:none;width:var(–spacer-twentyfour,24px)}a.nsb-link span{max-width:0;overflow:hidden;position:absolute;visibility:hidden}.nsb-svg{height:var(–spacer-twentyfour,24px);width:var(–spacer-twentyfour,24px)}.nsb-twitter-button{fill:var(–social-twitter,#4099ff)}.nsb-email-button{fill:var(–color-dove-gray,#787878)}.nsb-facebook-button{fill:var(–social-facebook,#3b5998)}.nsb-sms-button{fill:var(–color-ui-green,#008c33)}.nsb-svg.gallery{fill:var(–color-ui-white,#fff)}

(function () {
let route = window.ga_data.route,
headline = route.headline || document.title,
url = route.url,
sponsoredText = (route.sponsoredSeries || route.sponsoredStory) ? ‘Story From ‘ + route.sponsoredName + ‘: ‘ : ”;

nsbFacebookURL(url, headline);
nsbTwitterURL(url, headline, sponsoredText);
nsbEmailURL(url, headline, sponsoredText);
nsbSMSURL(url, headline, sponsoredText);

function nsbFacebookURL(url, headline) {
let ele = document.querySelectorAll(‘.nsb-facebook’);
if (!ele) return;

nsbSetLink(ele, `https://www.facebook.com/dialog/feed?app_id=${window.ga_data.site.facebook.appid}&redirect_uri=${window.location.href}&link=${url}&name=${encodeURIComponent(headline)}`);
}

function nsbTwitterURL(url, headline, sponsoredText) {
let ele = document.querySelectorAll(‘.nsb-twitter’);
if (!ele) return;

let text = encodeURIComponent(`${sponsoredText}${headline}`);
nsbSetLink(ele, `https://twitter.com/intent/tweet?text=${text} ${url} via @${window.ga_data.site.twitter.primary_account}`);
}

function nsbEmailURL(url, headline, sponsoredText) {
let description = document.querySelector(‘meta[name=”description”]’) ? encodeURIComponent(document.querySelector(‘meta[name=”description”]’).getAttribute(‘content’)) : null,
siteName = window.ga_data.site.publicationName,
text = encodeURIComponent(`${sponsoredText}${headline}`);

if (!description && text) ele.remove();
else nsbSetLink(document.querySelectorAll(‘.nsb-email’), `mailto:?subject=${siteName} ${text}&body=From ${siteName}%0D%0A${text}%0D%0A${description}%0D%0A%0D%0A${url}%0D%0A%0D%0A%0D%0A%0D%0A`);
}

function nsbSMSURL(url, headline, sponsoredText) {
let ele = document.querySelectorAll(‘.nsb-text’);
if (!ele) return;

let text = encodeURIComponent(`${sponsoredText}${headline}`) + ‘%0A%0A’;
nsbSetLink(ele, `sms:?&body=${text}${encodeURIComponent(url)}`);
}

function nsbSetLink (ele, url) {
let links = ele;
links.forEach(link => {
link.setAttribute(‘href’, url);
});
}
})();

function fireNavShareAnalytics (type) {
try {
let analytics = document.getElementById(“pageAnalytics”),
section = ga_data.route.sectionName || ga_data.route.ssts.split(‘/’)[0];
if (analytics) {
analytics.fireEvent(`${ga_data.route.basePageType}:${section}:nav-share-buttons:${type}`);
} else {
if (window.newrelic) window.newrelic.noticeError(‘page analytics tag not found’);
}
} catch (e) {
if (window.newrelic) window.newrelic.noticeError(e);
}
}

Leave a Reply

Your email address will not be published. Required fields are marked *