Cole Skuse's equaliser all but ended West Ham's hopes of automatic promotion from the Championship and edged Bristol City nearer to survival.
James Tomkins put West Ham ahead with a header midway through the first half.
But Skuse saw his long-range shot squirm past Robert Green to leave the Hammers five points adrift of second-placed Southampton with two games left.
City are five points above the relegation zone and will be safe if they beat Barnsley on Saturday.
The visitors saw Ricardo Vaz Te waste a couple of early opportunities.
They took the lead when Tomkins got on the end of Mark Noble's free-kick to head in for his fifth goal of the season.
But, only four minutes later, Derek McInnes's side pulled level when Skuse's weak 25-yard effort somehow bobbled its way past former England goalkeeper Green.
Henri Lansbury clipped the bar with an effort just after the restart as the visitors looked to restore their advantage.
Green had to make a scrambling save to deny Chris Wood as the hosts continued to threaten on the break.
Substitute John Carew could have snatched a winner but headed Matt Taylor's free-kick over and toe-poked wide late on.
Bristol City manager Derek McInnes:
"There's not many teams that will get a fluency against West Ham. It's the way it is. You've got to do the ugly side of the game well, you've got to stand up to it.
McInnes confident of City safety
"West Ham are a big, big side with a lot of experience and they know how to win games and they ask questions of you so you won't get a lot of teams playing against West Ham with a lot of fluency.
"We showed enough of the right qualities to get our point and we more than earned it.
"I wasn't expecting it to be a pretty night, I wasn't expecting it to be expansive. I was expecting it to be naughty at times, I was expecting it to be physical and that was exactly what it was."
West Ham manager Sam Allardyce:
"I've been looking at the chances we've created and it's just sickening that we didn't have the quality of finish we needed with so many opportunities.
"From start to finish we always looked like the dominant force, we created so many chances and to finish 1-1 is very disappointing considering the performance was so good.
"It's difficult as we know (catching Southampton). We wanted to stay in with a fighting chance, winning today and keeping that little bit closer to Southampton.
"We know we have to ask someone to do us a favour, and even if we get that favour from Middlesbrough we've still got to go and beat Leicester and it's still difficult for us."
Bristol City 22 Gerken 04 Fontaine 26 Foster 33 Amougou Booked 36 McGivern Booked 14 Skuse Booked 17 Bolasie (Woolford - 69' ) 21 Cisse (Adomah - 69' ) 37 Pearson 09 Stead Booked (Carey - 88' ) 39 Wood Substitutes 01 James 06 Carey 08 Kilkenny 11 Woolford 27 Adomah West Ham United 01 Green 02 Reid Booked 05 Tomkins 20 Demel (Faubert - 74' ) 25 Collins Booked (Carew - 63' ) 04 Nolan 14 Taylor 16 Noble 22 Lansbury 08 Maynard (Collison - 74' ) 12 Vaz Te Substitutes 13 Henderson 18 Faubert 10 Collison 21 Diop 11 Carew