Swansea City fell to a third consecutive defeat after sub Scott Hogan scored an injury-time penalty to boost Birmingham City’s survival hopes.
In a game that looked destined for a 0-0 draw, the Blues claimed the points with their second penalty of the night after sub Yan Dhanda slipped and tripped Ivan Sunjic.
Woodman had earlier kept out Lukas Jutkiewicz’s penalty following Connor Roberts’ foul on Jonathan Leko, but he could do nothing about Hogan’s late strike.
It proved high drama in a game that had provided little in terms of chances in open play, and it’s a defeat that leaves the Swans in third place and nine points behind Watford, with a game in hand.
Next up for the Swans is a home encounter with Preston on Monday night.
Steve Cooper made two changes to the starting XI from the team that was beaten by Cardiff City, with Jamal Lowe, who scored on his international debut for Jamaica last week, returning to the attacking line in place of Morgan Whittaker.
The other change saw Korey Smith back in the fold with Conor Hourihane, who was available after overcoming a nerve problem which saw him withdrawn early against the Bluebirds, on the bench.
Freddie Woodman was between the sticks with Ryan Bennett, Marc Guehi and Kyle Naughton in front of him. Roberts and Jake Bidwell offered support on the flanks while Smith linked up with captain Matt Grimes and Jay Fulton in midfield.
Up front, Lowe partnered top scorer Andre Ayew.
After a break due to international fixtures, both teams took time to get into this encounter.
Neither found a flow to their game in the opening 45 minutes, and chances were few and far between.
The Swans made the first proper attack, with Roberts finding Lowe in the box with a well-worked free-kick. The striker’s first touch gave him an opportunity to let rip, and his powerful drive at Neil Etheridge had to be tipped over the crossbar by the former Cardiff stopper.
That was the only real threat posed by the Swans before the break, while it was the hosts – who tested the visitors’ resolve with a number of huge throw-ins from Kristian Pedersen – who had the best opportunity.
Minutes after Alen Halilovic saw his shot deflected just wide off team-mate Jonathan Leko, the Blues had a golden chance to open the scoring.
Referee Tony Harrington pointed to the spot just passed the half-hour mark after Roberts struck the boot of Leko in the box after the latter was first to a bouncing ball. Up stepped Jutkiewicz, but Woodman stayed in the centre of the goal and deflected the powerful effort with his thigh.
That was it for the first half, with both teams looking for more of a spark after the break.
After the break, it took until the hour mark for the first real threat of the half as Ayew latched onto Fulton’s through ball and fed Lowe in the box. His intelligent first touch led to Lowe rolling his marker and looking to catch Etheridge off guard with a right-footed shot, but the Blues defence snuffed out the effort.
Cooper made a change for the last 20 minutes as Dhanda came on in place of Smith as the Swans looked for more attacking options.
Dhanda went close to finding a breakthrough just a few minutes after being introduced, with the midfielder’s 25-yard free-kick palmed away by Etheridge.
But the substitute was at the centre of a key moment in additional time as he slipped and tripped Sunjic in the box, and Harrington pointed to the spot for a second time.
This time, Hogan made no mistake and gave the Blues’ survival hopes a big boost.
Birmingham City: Neil Etheridge, Maxime Colin, Kristian Pedersen, Marc Roberts, Lukas Jutkiewicz (Sam Cosgrove, 82), Harlee Dean (capt), Jonathan Leko (Scott Hogan, 82), Gary Gardner (Rakeem Harper, 90), Ivan Sunjic, Alen Halilovic (Jon Toral, 68), Steve Seddon (George Friend, ht).
Subs not used: Andres Prieto, Jeremie Bela, Riley McGree, Mikel San Jose.
Swansea City: Freddie Woodman, Kyle Naughton (Morgan Whittaker, 90), Ryan Bennett, Marc Guehi, Connor Roberts, Matt Grimes (capt), Jay Fulton, Korey Smith (Yan Dhanda, 70), Jake Bidwell, Jamal Lowe (Wayne Routledge, 88), Andre Ayew.
Subs not used: Ben Hamer, Ben Cabango, Joel Latibeaudiere, Ryan Manning, Conor Hourihane, Oli Cooper.