STATE SENATOR, DISTRICT 31

⚠ 12
● Live Results·223,511 ballots cast·Updated 11/5/2026, 3:10:31 PM
73.0%163,490
27.0%60,021
Early vote vs Election Day

KEVIN SPARKS gained 3.6 percentage points on Election Day.

KEVIN SPARKS+3.6pp on E-day
Early 115,825 (70.8%)E-day 47,665 (29.2%)
JOHN BETANCOURT-3.6pp on E-day
Early 44,764 (74.6%)E-day 15,257 (25.4%)
Race totals223,511 ballots
Early 160,589 (71.8%)E-day 62,922 (28.2%)
Menard: no dataHale: no dataArmstrong: 860 votes · KEVIN SPARKS 91.4% (786) · JOHN BETANCOURT 8.6% (74) · 712 net for leaderCalhoun: no dataClay: no dataOrange: no dataGonzales: no dataFannin: no dataKerr: no dataRefugio: no dataJim Hogg: no dataDimmit: no dataNolan: no dataBrazos: no dataJefferson: no dataBell: no dataBandera: no dataHidalgo: no dataSchleicher: 894 votes · KEVIN SPARKS 76.8% (687) · JOHN BETANCOURT 23.2% (207) · 480 net for leaderGrayson: no dataCrosby: no dataDelta: no dataZavala: no dataRockwall: no dataEastland: no dataDeWitt: no dataAngelina: no dataMcLennan: no dataLamar: no dataLeon: no dataStonewall: no dataMcMullen: no dataSutton: no dataFort Bend: no dataParker: no dataKinney: no dataFayette: no dataBriscoe: 585 votes · KEVIN SPARKS 87.7% (513) · JOHN BETANCOURT 12.3% (72) · 441 net for leaderHarrison: no dataReagan: 682 votes · KEVIN SPARKS 74.6% (509) · JOHN BETANCOURT 25.4% (173) · 336 net for leaderColeman: no dataOchiltree: 2,282 votes · KEVIN SPARKS 81.0% (1,848) · JOHN BETANCOURT 19.0% (434) · 1,414 net for leaderCrane: 965 votes · KEVIN SPARKS 75.4% (728) · JOHN BETANCOURT 24.6% (237) · 491 net for leaderWashington: no dataLynn: no dataMills: no dataOldham: 739 votes · KEVIN SPARKS 89.6% (662) · JOHN BETANCOURT 10.4% (77) · 585 net for leaderSabine: no dataHopkins: no dataHouston: no dataBexar: no dataUpton: 825 votes · KEVIN SPARKS 81.6% (673) · JOHN BETANCOURT 18.4% (152) · 521 net for leaderErath: no dataRandall: 52,737 votes · KEVIN SPARKS 74.8% (39,469) · JOHN BETANCOURT 25.2% (13,268) · 26,201 net for leaderRusk: no dataCoryell: no dataComal: no dataAransas: no dataJack: no dataHemphill: 1,203 votes · KEVIN SPARKS 84.4% (1,015) · JOHN BETANCOURT 15.6% (188) · 827 net for leaderShackelford: no dataSan Jacinto: no dataKendall: no dataWharton: no dataFloyd: no dataKarnes: no dataKaufman: no dataDuval: no dataJohnson: no dataFranklin: no dataEdwards: no dataWaller: no dataMaverick: no dataKleberg: no dataGaines: 4,744 votes · KEVIN SPARKS 84.7% (4,020) · JOHN BETANCOURT 15.3% (724) · 3,296 net for leaderMartin: 1,468 votes · KEVIN SPARKS 82.6% (1,213) · JOHN BETANCOURT 17.4% (255) · 958 net for leaderBowie: no dataAndrews: 4,076 votes · KEVIN SPARKS 76.8% (3,129) · JOHN BETANCOURT 23.2% (947) · 2,182 net for leaderPotter: 25,405 votes · KEVIN SPARKS 63.3% (16,089) · JOHN BETANCOURT 36.7% (9,316) · 6,773 net for leaderGarza: no dataCaldwell: no dataParmer: 1,955 votes · KEVIN SPARKS 75.1% (1,468) · JOHN BETANCOURT 24.9% (487) · 981 net for leaderTitus: no dataTerry: no dataFoard: no dataReal: no dataCarson: 2,351 votes · KEVIN SPARKS 88.0% (2,068) · JOHN BETANCOURT 12.0% (283) · 1,785 net for leaderKnox: no dataHays: no dataMedina: no dataMotley: no dataWichita: no dataMidland: 42,930 votes · KEVIN SPARKS 73.4% (31,527) · JOHN BETANCOURT 26.6% (11,403) · 20,124 net for leaderVictoria: no dataTyler: no dataFalls: no dataPresidio: no dataWillacy: no dataLubbock: no dataHenderson: no dataWalker: no dataGalveston: no dataHarris: no dataDawson: 2,523 votes · KEVIN SPARKS 74.6% (1,883) · JOHN BETANCOURT 25.4% (640) · 1,243 net for leaderPecos: no dataNacogdoches: no dataGuadalupe: no dataTarrant: no dataJackson: no dataSwisher: 1,688 votes · KEVIN SPARKS 76.1% (1,284) · JOHN BETANCOURT 23.9% (404) · 880 net for leaderSterling: 439 votes · KEVIN SPARKS 89.3% (392) · JOHN BETANCOURT 10.7% (47) · 345 net for leaderWinkler: 1,318 votes · KEVIN SPARKS 74.3% (979) · JOHN BETANCOURT 25.7% (339) · 640 net for leaderFrio: no dataLipscomb: 929 votes · KEVIN SPARKS 87.7% (815) · JOHN BETANCOURT 12.3% (114) · 701 net for leaderCollingsworth: no dataColorado: no dataWise: no dataGlasscock: 545 votes · KEVIN SPARKS 93.6% (510) · JOHN BETANCOURT 6.4% (35) · 475 net for leaderShelby: no dataComanche: no dataBurnet: no dataGray: no dataHudspeth: no dataCass: no dataEllis: no dataCooke: no dataWilliamson: no dataCochran: 670 votes · KEVIN SPARKS 75.1% (503) · JOHN BETANCOURT 24.9% (167) · 336 net for leaderVan Zandt: no dataDonley: no dataJones: no dataGrimes: no dataIrion: 642 votes · KEVIN SPARKS 86.8% (557) · JOHN BETANCOURT 13.2% (85) · 472 net for leaderNavarro: no dataBrooks: no dataDallam: 993 votes · KEVIN SPARKS 79.3% (787) · JOHN BETANCOURT 20.7% (206) · 581 net for leaderHunt: no dataMitchell: 1,823 votes · KEVIN SPARKS 82.8% (1,509) · JOHN BETANCOURT 17.2% (314) · 1,195 net for leaderWood: no dataChildress: no dataJeff Davis: no dataMontague: no dataBrown: no dataHaskell: no dataFisher: no dataConcho: no dataCoke: 1,344 votes · KEVIN SPARKS 87.4% (1,174) · JOHN BETANCOURT 12.6% (170) · 1,004 net for leaderPolk: no dataCottle: no dataYoung: no dataLee: no dataCherokee: no dataHall: 807 votes · KEVIN SPARKS 84.1% (679) · JOHN BETANCOURT 15.9% (128) · 551 net for leaderHood: no dataArcher: no dataBaylor: no dataSan Augustine: no dataMadison: no dataMilam: no dataReeves: no dataNueces: no dataCamp: no dataFreestone: no dataRunnels: no dataTerrell: no dataDeaf Smith: 3,466 votes · KEVIN SPARKS 61.7% (2,140) · JOHN BETANCOURT 38.3% (1,326) · 814 net for leaderMarion: no dataLiberty: no dataJasper: no dataHansford: 1,455 votes · KEVIN SPARKS 87.6% (1,274) · JOHN BETANCOURT 12.4% (181) · 1,093 net for leaderChambers: no dataHardin: no dataCollin: no dataBrazoria: no dataThrockmorton: no dataBastrop: no dataScurry: 4,076 votes · KEVIN SPARKS 83.1% (3,387) · JOHN BETANCOURT 16.9% (689) · 2,698 net for leaderEctor: 29,037 votes · KEVIN SPARKS 62.8% (18,228) · JOHN BETANCOURT 37.2% (10,809) · 7,419 net for leaderLimestone: no dataDenton: no dataRed River: no dataMatagorda: no dataHardeman: no dataPalo Pinto: no dataLive Oak: no dataSherman: 694 votes · KEVIN SPARKS 86.0% (597) · JOHN BETANCOURT 14.0% (97) · 500 net for leaderUvalde: no dataBailey: 1,380 votes · KEVIN SPARKS 71.0% (980) · JOHN BETANCOURT 29.0% (400) · 580 net for leaderCulberson: no dataAtascosa: no dataWilson: no dataStarr: no dataDallas: no dataKimble: no dataMcCulloch: no dataCrockett: no dataHill: no dataKent: no dataEl Paso: no dataLoving: 63 votes · KEVIN SPARKS 84.1% (53) · JOHN BETANCOURT 15.9% (10) · 43 net for leaderDickens: no dataLa Salle: no dataLamb: no dataAustin: no dataHutchinson: 5,984 votes · KEVIN SPARKS 84.0% (5,024) · JOHN BETANCOURT 16.0% (960) · 4,064 net for leaderVal Verde: no dataSmith: no dataRobertson: no dataGillespie: no dataKing: no dataTom Green: no dataYoakum: 1,716 votes · KEVIN SPARKS 75.2% (1,291) · JOHN BETANCOURT 24.8% (425) · 866 net for leaderSomervell: no dataKenedy: no dataBorden: 302 votes · KEVIN SPARKS 96.4% (291) · JOHN BETANCOURT 3.6% (11) · 280 net for leaderSan Saba: no dataBurleson: no dataBee: no dataTrinity: no dataCastro: 1,505 votes · KEVIN SPARKS 74.0% (1,113) · JOHN BETANCOURT 26.0% (392) · 721 net for leaderBrewster: no dataGregg: no dataWard: 2,487 votes · KEVIN SPARKS 75.2% (1,869) · JOHN BETANCOURT 24.8% (618) · 1,251 net for leaderWilbarger: no dataHamilton: no dataStephens: no dataLavaca: no dataBosque: no dataGoliad: no dataRoberts: 449 votes · KEVIN SPARKS 96.0% (431) · JOHN BETANCOURT 4.0% (18) · 413 net for leaderCallahan: no dataRains: no dataMorris: no dataLampasas: no dataUpshur: no dataWheeler: no dataSan Patricio: no dataMoore: 4,015 votes · KEVIN SPARKS 70.4% (2,828) · JOHN BETANCOURT 29.6% (1,187) · 1,641 net for leaderWebb: no dataBlanco: no dataNewton: no dataHockley: no dataPanola: no dataAnderson: no dataCameron: no dataMontgomery: no dataLlano: no dataMason: no dataTaylor: no dataHartley: 1,520 votes · KEVIN SPARKS 88.8% (1,350) · JOHN BETANCOURT 11.2% (170) · 1,180 net for leaderJim Wells: no dataZapata: no dataTravis: no dataHoward: 6,940 votes · KEVIN SPARKS 74.3% (5,158) · JOHN BETANCOURT 25.7% (1,782) · 3,376 net for leaderEl PasoAmarilloLubbockOdessaSan AngeloDallasTylerAustinHoustonSan AntonioCorpus ChristiMcAllen
Hue = county leader · Saturation = √(net margin / 90th-pctile county margin), floored
Noted (12)
  • Underperform4.1
    ECTOR
    KEVIN SPARKS's margin +25.6pp vs statewide +46.3pp
  • Underperform3.6
    POTTER
    KEVIN SPARKS's margin +26.7pp vs statewide +46.3pp
  • Swing outlier2.0
    HOWARD
    KEVIN SPARKS shifted -0.7pp early→E-day vs +3.8pp statewide (3.4σ outlier)
  • Swing outlier1.7
    HUTCHINSON
    KEVIN SPARKS shifted -0.5pp early→E-day vs +3.8pp statewide (3.2σ outlier)
  • Underperform1.6
    DEAF SMITH
    KEVIN SPARKS's margin +23.5pp vs statewide +46.3pp
  • Landslide1.1
    HARTLEY
    KEVIN SPARKS won by +77.6pp vs statewide +46.3pp
  • Landslide1.0
    ARMSTRONG
    KEVIN SPARKS won by +82.8pp vs statewide +46.3pp
  • Landslide0.9
    ROBERTS
    KEVIN SPARKS won by +92.0pp vs statewide +46.3pp
  • Landslide0.9
    GLASSCOCK
    KEVIN SPARKS won by +87.2pp vs statewide +46.3pp
  • Landslide0.8
    OLDHAM
    KEVIN SPARKS won by +79.2pp vs statewide +46.3pp
  • Landslide0.7
    BORDEN
    KEVIN SPARKS won by +92.7pp vs statewide +46.3pp
  • Landslide0.6
    STERLING
    KEVIN SPARKS won by +78.6pp vs statewide +46.3pp

County results — early vs Election Day

  • ANDREWS4,076 total
    SPARKSEarly 2,122 · E-day 1,0073,129
    BETANCOURTEarly 669 · E-day 278947
  • ARMSTRONG860 total
    SPARKSEarly 585 · E-day 201786
    BETANCOURTEarly 56 · E-day 1874
  • BAILEY1,380 total
    SPARKSEarly 622 · E-day 358980
    BETANCOURTEarly 249 · E-day 151400
  • BORDEN302 total
    SPARKSEarly 210 · E-day 81291
    BETANCOURTEarly 10 · E-day 111
  • BRISCOE585 total
    SPARKSEarly 340 · E-day 173513
    BETANCOURTEarly 54 · E-day 1872
  • CARSON2,351 total
    SPARKSEarly 1,114 · E-day 9542,068
    BETANCOURTEarly 201 · E-day 82283
  • CASTRO1,505 total
    SPARKSEarly 618 · E-day 4951,113
    BETANCOURTEarly 246 · E-day 146392
  • COCHRAN670 total
    SPARKSEarly 320 · E-day 183503
    BETANCOURTEarly 99 · E-day 68167
  • COKE1,344 total
    SPARKSEarly 769 · E-day 4051,174
    BETANCOURTEarly 126 · E-day 44170
  • CRANE965 total
    SPARKSEarly 487 · E-day 241728
    BETANCOURTEarly 153 · E-day 84237
  • DALLAM993 total
    SPARKSEarly 427 · E-day 360787
    BETANCOURTEarly 135 · E-day 71206
  • DAWSON2,523 total
    SPARKSEarly 1,416 · E-day 4671,883
    BETANCOURTEarly 474 · E-day 166640
  • DEAF SMITH3,466 total
    SPARKSEarly 1,523 · E-day 6172,140
    BETANCOURTEarly 944 · E-day 3821,326
  • ECTOR29,037 total
    SPARKSEarly 12,422 · E-day 5,80618,228
    BETANCOURTEarly 7,768 · E-day 3,04110,809
  • GAINES4,744 total
    SPARKSEarly 2,750 · E-day 1,2704,020
    BETANCOURTEarly 516 · E-day 208724
  • GLASSCOCK545 total
    SPARKSEarly 339 · E-day 171510
    BETANCOURTEarly 25 · E-day 1035
  • HALL807 total
    SPARKSEarly 407 · E-day 272679
    BETANCOURTEarly 76 · E-day 52128
  • HANSFORD1,455 total
    SPARKSEarly 724 · E-day 5501,274
    BETANCOURTEarly 124 · E-day 57181
  • HARTLEY1,520 total
    SPARKSEarly 860 · E-day 4901,350
    BETANCOURTEarly 114 · E-day 56170
  • HEMPHILL1,203 total
    SPARKSEarly 663 · E-day 3521,015
    BETANCOURTEarly 131 · E-day 57188
  • HOWARD6,940 total
    SPARKSEarly 3,904 · E-day 1,2545,158
    BETANCOURTEarly 1,336 · E-day 4461,782
  • HUTCHINSON5,984 total
    SPARKSEarly 3,676 · E-day 1,3485,024
    BETANCOURTEarly 696 · E-day 264960
  • IRION642 total
    SPARKSEarly 358 · E-day 199557
    BETANCOURTEarly 62 · E-day 2385
  • LIPSCOMB929 total
    SPARKSEarly 324 · E-day 491815
    BETANCOURTEarly 43 · E-day 71114
  • LOVING63 total
    SPARKSEarly 34 · E-day 1953
    BETANCOURTEarly 3 · E-day 710
  • MARTIN1,468 total
    SPARKSEarly 766 · E-day 4471,213
    BETANCOURTEarly 177 · E-day 78255
  • MIDLAND42,930 total
    SPARKSEarly 22,613 · E-day 8,91431,527
    BETANCOURTEarly 8,630 · E-day 2,77311,403
  • MITCHELL1,823 total
    SPARKSEarly 1,046 · E-day 4631,509
    BETANCOURTEarly 230 · E-day 84314
  • MOORE4,015 total
    SPARKSEarly 1,881 · E-day 9472,828
    BETANCOURTEarly 749 · E-day 4381,187
  • OCHILTREE2,282 total
    SPARKSEarly 1,141 · E-day 7071,848
    BETANCOURTEarly 255 · E-day 179434
  • OLDHAM739 total
    SPARKSEarly 372 · E-day 290662
    BETANCOURTEarly 42 · E-day 3577
  • PARMER1,955 total
    SPARKSEarly 593 · E-day 8751,468
    BETANCOURTEarly 179 · E-day 308487
  • POTTER25,405 total
    SPARKSEarly 11,833 · E-day 4,25616,089
    BETANCOURTEarly 7,146 · E-day 2,1709,316
  • RANDALL52,737 total
    SPARKSEarly 30,682 · E-day 8,78739,469
    BETANCOURTEarly 10,858 · E-day 2,41013,268
  • REAGAN682 total
    SPARKSEarly 352 · E-day 157509
    BETANCOURTEarly 117 · E-day 56173
  • ROBERTS449 total
    SPARKSEarly 241 · E-day 190431
    BETANCOURTEarly 13 · E-day 518
  • SCHLEICHER894 total
    SPARKSEarly 529 · E-day 158687
    BETANCOURTEarly 158 · E-day 49207
  • SCURRY4,076 total
    SPARKSEarly 2,221 · E-day 1,1663,387
    BETANCOURTEarly 472 · E-day 217689
  • SHERMAN694 total
    SPARKSEarly 336 · E-day 261597
    BETANCOURTEarly 67 · E-day 3097
  • STERLING439 total
    SPARKSEarly 278 · E-day 114392
    BETANCOURTEarly 25 · E-day 2247
  • SWISHER1,688 total
    SPARKSEarly 826 · E-day 4581,284
    BETANCOURTEarly 274 · E-day 130404
  • UPTON825 total
    SPARKSEarly 475 · E-day 198673
    BETANCOURTEarly 119 · E-day 33152
  • WARD2,487 total
    SPARKSEarly 1,207 · E-day 6621,869
    BETANCOURTEarly 395 · E-day 223618
  • WINKLER1,318 total
    SPARKSEarly 553 · E-day 426979
    BETANCOURTEarly 227 · E-day 112339
  • YOAKUM1,716 total
    SPARKSEarly 866 · E-day 4251,291
    BETANCOURTEarly 321 · E-day 104425