Goals from Jacob Ramsey and Douglas Luiz either side of the interval put the hosts in control but Spurs set up a nervy finish after Harry Kane scored from the penalty spot a minute from time after he was brought down by Emi Martinez.
The result moved Villa level on points with sixth-placed Spurs but both clubs are just two points clear of Brighton, having played three games more.
Dan Kilpatrick was at Villa Park to rate the Spurs players...
Fraser Forster - 6
Kept Spurs in the game with smart saves to deny Leon Bailey and then Emi Buendia at 1-0, but should have done better for Luiz's free-kick, which he could only palm into the roof of the net.
Emerson Royal - 6
Stood up well to the pace of Bailey and directness of Alex Moreno, and made a couple of important challenges.
Cristian Romero - 4
Flew into a tackle ahead of Villa's opening goal, leaving him playing catch up, and gave away the free-kick for their second.
Clement Lenglet - 5
Repeatedly lost possession in the face of Villa's press in the first half. More comfortable when stepping out of defence with the ball.
Pedro Porro - 5
Loose with the ball in his own half. Better going forward, as usual, but failed to carve out any real openings.
Pierre-Emile Hojbjerg - 6
Created Spurs' first chance of the game, which Kane fired straight at Emi Martinez, with some fine pressing and worked hard in the midfield.
Oliver Skipp - 4
Struggled against Villa's well-organised, pressing midfield and was withdrawn early.
Ben Davies - 5
Beaten by Leon Bailey for Villa's opening goal and failed to make an impact at either end.
Heung-min Son - 5
Could not beat the offside trap and finishing was mixed when he did get in shooting positions.
Richarlison - 4
Struggled to stay onside on the rare occasions Spurs threatened in the final third, and looked off the pace generally.
Harry Kane - 6
Uncharacteristically squandered Spurs' best chance from open play when he fired straight at Martinez but won the penalty and made no mistake from the spot.
Yves Bissouma (Skipp 62') - 7
It said a lot that on his first appearance since February he was one of Spurs' better players.
Dejan Kulusevski (Richarlison 62') - 6
Flashed an effort agonisingly wide of the far post but made the wrong decision in a good position in stoppage-time.
Arnaut Danjuma (Porro 81) - 5
Had limited time to make an impression at wing-back.
Ivan Perisic (Davies 90') - N/A
Not used: Austin, Sanchez, Lucas, Sarr, Craig.