Vedad Ibisevic scored the only goal of the game for the home side in the 63rd minute.
Dortmund had won six and drawn two of their last eight games but failed to collect their 12th away victory of the season to set a new league record.
They remain well clear at the top of the table with 61 points, 12 ahead of Bayer Leverkusen, who play on Sunday.
Hoffenheim created the best early chances with David Alaba heading onto the top of the net in the 10th minute and Dortmund goalkeeper Roman Weidenfeller making a superb save from Ibisevic's header two minutes later.
Dortmund began taking control of the game around the half-hour mark with Robert Lewandowski shooting just over the bar in the 35th minute.
Weidenfeller was again called upon to keep Dortmund in the game, superbly stopping Ibisevic in the 48th minute.
Hoffenheim goalkeeper Tom Starke was called into action six minutes later, barely fending away Marcel Schmelzer's blast at the near post.
Hoffenheim finally beat Weidenfeller and took the lead after 63 minutes as Ibisevic played a one-two with Andreas Beck before firing home.
Ibisevic missed two more chances in the 79th and 83rd minutes before the Bosnian blasted a long ball off the crossbar in the 87th minute.
Dortmund had one more opportunity to collect a point but Starke kept out Lucas Barrios' shot three minutes into stoppage time.