Substitute Nahki Wells netted an 83rd-minute penalty to earn Bristol City a 1-1 Championship draw with Swansea at Ashton Gate.
The visitors broke the deadlock in the 51st minute when Jamal Lowe latched onto a Connor Roberts pass inside the box and fired a fierce left-footed drive across Bristol City goalkeeper Dan Bentley from a narrow angle.
The hosts' spot-kick was hotly disputed. Roberts appeared to lose his footing and was judged to have brought down Antoine Semenyo by referee Oliver Langford as they challenged to meet a free-kick from the right.
Wells beat Swans keeper Freddie Woodman with a chipped penalty down the middle to spare his side a second home defeat in the space of four days, moving them up to second in the table.
Bristol City head coach Dean Holden made five changes from the team beaten at home by Middlesbrough in midweek, bringing in Tomas Kalas for the injured Alfie Mawson and giving starts to wing-backs Steven Sessegnon and Jay Dasilva, midfielder Chris Brunt and striker Semenyo.
Steve Cooper made just one change for Swansea, giving a first start of the season to Jay Fulton in a midfield also including former Robins favourite Korey Smith.
The home side created more clear openings in a closely-fought first half. Andreas Weimann had their first effort on goal with a fierce fifth-minute shot that flew over from a Dasilva cross.
Chris Martin's strong run down the left almost created a 26th-minute chance for Semenyo and when the ball was cleared Sessegnon fired over from 25 yards.
Jamie Paterson then latched onto a poor pass from Roberts and burst into the box only to place his low shot too close to Woodman.
Andre Ayew tested Bentley for the first time with a powerful angled drive that the Bristol City keeper did well to parry in the 31st minute.
Martin saw a diving header go just past a post. At the other end, Ayew headed against the bar after 38 minutes, but referee Langford had already blown for an infringement.
Woodman produced the best save of the half in the 43rd minute, diving to keep out Taylor Moore's header from a Brunt free-kick.
The second half sprang to life with Lowe's goal. Last ditch tackles denied Ayew at one end and Martin at the other, with both sides committed to attack.
Bristol City lost Weimann to injury after 65 minutes, Callum O'Dowda taking his place, and then had Sessegnon stretchered off in the 72nd minute, with striker Famara Diedhiou going on as substitute.
Holden went for broke with 12 minutes left, taking off centre-back Moore and sending on Wells as a fourth striker in search of the equaliser.
It paid dividends and both sides might have won it in injury time, Swans going close through substitute Viktor Gyokeres before Smith shot wide with the final chance.