The Bundesliga's leading scorer Pierre-Emerick Aubameyang rescued a point for Dortmund with a 48th-minute equaliser, his 16th goal of the campaign.
Hoffenheim are still undefeated this season and moved up to third spot on 27 points.
Dortmund, a point behind in fifth place, have won just three of their last 10 league matches.
"It was a very hard game for us," said Dortmund defender Marcel Schmelzer. "After falling a goal behind we had to become more aggressive.
News that makes sense
Your trusted source for staying up-to-date with the world around you. Get free daily news updates and analysis, straight to your inbox.
"Having played a game like we did with 10 men I think this result is more than deserved."
It took only three minutes for Hoffenheim to grab the lead through Mark Uth, back from injury for the first time since September.
Uth rounded keeper Roman Weidenfeller, who was caught completely out of position, to score.
Dortmund almost levelled through full back Schmelzer and Aubameyang but the pressure paid off in the 11th minute when Mario Goetze equalised after Ousmane Dembele had beaten four Hoffenheim players.
The home team kept up a frantic pace and their top scorer Sandro Wagner headed in from close range after giving defender Sven Bender a shove in the back.
Weidenfeller, filling in for the injured Roman Buerki, let the ball slip through his hands.
"I did not realise at the time ... but seeing it at halftime I have to admit it was a foul," Wagner said.
Things took a turn for the worse for Dortmund when Reus was sent off for a second booking four minutes before the break and Wagner hit the post right after the restart.
Aubameyang then netted against the run of play for Dortmund after yet another fine Dembele solo run.
(Reporting by Karolos Grohmann; Editing by Tony Jimenez)
