Why Fish Gasp at the Surface — Overstocking and Low Oxygen

Written 2026-10-13

When a fish keeps hovering at the surface and gulping air, it isn’t getting enough oxygen through its gills — the surface, right where water meets air, has slightly more dissolved oxygen than the water below, so it swims up to get what it can. Running this through the simulator shows that even when ammonia and nitrite look fine, packing in more fish than the filter and tank can really support quietly drains the water’s oxygen on its own. A 60cm tank stocked with 12 panda corydoras (within the recommended range) never dropped below a safe oxygen level across 90 days. The exact same tank and filter with 20 corydoras instead started logging a “getting worse” warning on day 33, then lost one fish at a time to low oxygen on days 38, 45 and 57 — down to 17 survivors. Keeping the same 20 fish but adding one air pump let all 20 survive the full 90 days.

Why gasping at the surface means low oxygen

Fish pull dissolved oxygen out of the water through their gills. When that oxygen drops, they breathe harder and tend to head for the surface, where gas exchange with the air keeps oxygen a little higher than deeper in the tank — gasping there is usually the first visible sign. This simulator doesn’t draw the gasping itself, but it logs the same underlying event as a “getting worse” warning — the same quiet red flag that shows up as surface-hovering in a real tank.

There’s also a hard ceiling on how much oxygen water can hold at all. By this simulator’s saturation formula, water at 24°C can carry at most 8.33mg of oxygen per liter. Once what the fish and filter bacteria consume outpaces what the surface can resupply, oxygen across the whole tank slides down slowly.

What we ran — eight extra fish was the difference

We set up a standard 60cm tank with a large canister filter, no air pump, heater held at 24°C. After a full fishless cycle, we stocked panda corydoras on day 30 and watched for 90 days. Panda corydoras has a lower oxygen tolerance than the catalog default (0.8 versus 1.0), so it reacts earlier than most species.

At the recommended stocking level of 12, oxygen never fell below 5.52mg/L across the whole 90 days — no warnings, no deaths, all 12 survived. The exact same tank and filter with 20 corydoras instead saw oxygen fall to 3.66mg/L, triggering a “getting worse” warning on day 33 with low oxygen as the dominant cause. Left alone, one fish died on each of day 38, 45 and 57 — every single one logged with low oxygen as 100% of the cause (ammonia and nitrite stayed harmless the whole time; nitrite peaked at just 0.24ppm on a test-kit scale, nowhere near the 0.8ppm danger line). That left 17 of the 20 alive.

SetupSurvivedFirst warningFirst deathLast death
12 fish · no air pump12/12NoneNoneNone
20 fish · no air pump17/20Day 33Day 38Day 57
20 fish · air pump added20/20NoneNoneNone

The fix — cut the stocking or add an air pump

There are two ways out of overstocking: bring the fish count back down to the recommended range, or keep the same count and increase surface agitation instead. We kept the 20 corydoras from the failing tank and only added one air pump (surface agitation went from 0 to 0.8, nothing else changed) and ran it again for 90 days. Oxygen never dropped below 5.86mg/L, with zero warnings and zero deaths — all 20 survived. The pump churns the surface so water trades gas with the air faster, and that alone was enough even though the fish were still using the same amount of oxygen.

Warmer weather makes this worse on its own, since warmer water simply can’t hold as much oxygen — a stocking level that’s fine most of the year can start causing gasping only in summer. If you notice fish lingering and gulping at the surface, check your stocking level and your filter’s surface agitation first.

The button below is the tank from this guide with the air pump added, where all 20 fish survived.

Run this tank yourself

The numbers in this guide come from the Water Kiwoogi simulator model; real tanks can differ.