Match ends, Birmingham City 0, Bristol City 3.
Struggling Birmingham City lost at home for the 12th time this season as Bristol City ended their run of back-to-back defeats.
Blues striker Scott Hogan hit the post twice before the visitors took the lead when Kasey Palmer picked the ball up 40 yards from goal, drove forward and slotted home a confident finish from 20 yards out.
Nigel Pearson's side doubled their lead in fortuitous circumstances as Antoine Semenyo charged down Neil Etheridge's clearance and the ball flew into the empty net.
Palmer's neat pass played sub Callum O'Dowda in on goal to wrap up all three points.
Aitor Karanka's men, who have the worst home record in the league, remain three points clear of the relegation zone but have now played four more games than 22nd-placed Rotherham.
The Millers have had to postpone their past three matches because of positive Covid-19 results at the South Yorkshire club.
Palmer made Blues pay for the second of Hogan's two close-range misses when he gave the visitors the lead just moments after the former Brentford and Aston Villa striker hit the woodwork for the second time.
Birmingham's day was summed up when Kristian Pedersen underhit a backpass to Etheridge and, for the second time in recent weeks, Semenyo charged down a goalkeeper's clearance to score.
O'Dowda finished well seconds after coming on for his first appearance since Boxing Day as the Robins claimed a third successive away win.
They will be looking to continue their excellent form away from Ashton Gate when they visit Blackburn on Wednesday, while Blues will hope to claim just a fourth home win of the season when they host play-off chasing Reading on the same night.
'Every single game is the same' - reaction
Birmingham head coach Aitor Karanka told BBC WM 95.6:
"We've been here for several months and every single game is the same. We can do whatever we want but if we make mistakes we are going to lose the game.
"When you are losing you need to have that direction, but we didn't deliver one ball into the box. It is impossible to win games if you don't score goals from the chances you have and you are making mistakes every day.
"I don't look at the table, I don't look at where we are in the calendar, but it's difficult when you're working, you're trying to do your best and every single day is the same story."
Bristol City manager Nigel Pearson told BBC Radio Bristol:
"You've got to work hard and today was a good example of that. We needed firstly to get a performance which showed more cohesion as a group of players.
"If we go into a game with the collective mentality of protecting our goal, in the knowledge that we've got pace and power to hurt sides, it stands to reason that we're going to have a better chance of winning games that don't necessarily suit how people perceive us.
"We knew it was going to be a potentially difficult game based on Birmingham's style of play - they've got a lot of physicality in the side and were going to be very direct.
"We conceded quite a bit of height to them but it depends how you go about it and I thought everybody dealt with the physical side of it very well."
- 2ColinSubstituted forCosgroveat 68'minutes
- 4RobertsBooked at 90mins
- 34SunjicBooked at 48mins
- 17SánchezBooked at 45minsSubstituted forLekoat 54'minutes
- 35HalilovicSubstituted forGardnerat 68'minutes
- 9HoganSubstituted forJutkiewiczat 68'minutes
- 43S Sessegnon
- 17LansburyBooked at 66minsSubstituted forWalshat 81'minutes
- 21WellsBooked at 49minsSubstituted forO'Dowdaat 75'minutes
- 9DiédhiouSubstituted forWatkinsat 88'minutes
- Jarred Gillett
- Shots on Target
Second Half ends, Birmingham City 0, Bristol City 3.
Corner, Bristol City. Conceded by Marc Roberts.
Attempt missed. Steven Sessegnon (Bristol City) right footed shot from outside the box is high and wide to the right following a set piece situation.
Marc Roberts (Birmingham City) is shown the yellow card for a bad foul.
Foul by Marc Roberts (Birmingham City).
Marley Watkins (Bristol City) wins a free kick on the right wing.
Foul by Lukas Jutkiewicz (Birmingham City).
Jack Hunt (Bristol City) wins a free kick in the defensive half.
Rekeem Harper (Birmingham City) wins a free kick in the defensive half.
Foul by Marley Watkins (Bristol City).
Substitution, Bristol City. Marley Watkins replaces Famara Diédhiou.
Attempt missed. Jonathan Leko (Birmingham City) right footed shot from the right side of the box is high and wide to the right. Assisted by Ivan Sunjic.
Attempt missed. Ivan Sunjic (Birmingham City) left footed shot from the centre of the box misses to the right. Assisted by Sam Cosgrove with a cross.
Substitution, Bristol City. Liam Walsh replaces Henri Lansbury.
Attempt blocked. Famara Diédhiou (Bristol City) right footed shot from the centre of the box is blocked.
Attempt saved. Kasey Palmer (Bristol City) left footed shot from the centre of the box is saved in the bottom right corner. Assisted by Callum O'Dowda.
Goal! Birmingham City 0, Bristol City 3. Callum O'Dowda (Bristol City) right footed shot from the centre of the box to the centre of the goal. Assisted by Kasey Palmer with a through ball.
Substitution, Bristol City. Callum O'Dowda replaces Nahki Wells.
Corner, Birmingham City. Conceded by Henri Lansbury.