What it means
A flood wait is the way Telegram's MTProto servers tell a client: "you are doing too much, slow down". It is a structured error response with a single integer payload: the number of seconds the client must wait before making the same call again.
Telegram's rate-limiting system is intentionally opaque. You do not get a public quota table; you get a runtime signal when you cross a threshold. That makes flood waits a feedback loop, not a configuration: every client has to actively listen for them, respect them, and adapt the send rate based on what it observes.
Important nuance: flood waits are per-account, per-method. Hitting a flood wait on messages.sendMessage does not block calls to messages.getHistory. And a flood wait on one account does not block other accounts in your pool. This is why account rotation works, but only when combined with pacing.
The FLOOD_WAIT_X error format
The error string is literal: FLOOD_WAIT_X, where X is the number of seconds. So FLOOD_WAIT_30 means "wait 30 seconds"; FLOOD_WAIT_3600 means "wait 1 hour"; FLOOD_WAIT_86400 means "wait 24 hours".
On the wire, the error arrives as an RPC error with type rpc_error, error code 420, and an error message of the form FLOOD_WAIT_X. Most MTProto client libraries parse the X out for you and either expose it as structured data or convert the error into an exception with the wait time attached.
Related but distinct errors:
SLOWMODE_WAIT_X: chat-level slowmode, not account-level. Triggered when a group has slow-mode enabled.FLOOD_PREMIUM_WAIT_X: premium-feature-specific limit (e.g., reactions). Behaves like a flood wait but only applies to the specific feature.PEER_FLOOD: a more serious version with no X. The account is restricted from sending to non-contacts entirely; only un-restricted by support contact or a long cooldown.
PEER_FLOOD is the one to fear. It means Telegram has decided your account looks like a spammer and is throttling cold-DM behavior with no automatic recovery. Treat any PEER_FLOOD as a stop-and-investigate event.
How clients should back off
The reference behavior is:
- Sleep for at least X seconds. Not X minus two, not "estimated X"; use exactly what the server said, plus a small safety margin (5-10%).
- Retry the original call. Most flood waits are transient; the same call usually succeeds after the wait.
- If the retry hits another flood wait, double the safety margin and consider applying an exponential back-off across the whole sending pipeline, not just the individual call.
- If X is greater than 3600 seconds (1 hour), stop sending from this account entirely for the day. Long flood waits are a leading indicator of escalation to
PEER_FLOODor full restriction.
A naive exponential back-off can look like this:
attempt 1 sleeps X seconds, attempt 2 sleeps X × 2, attempt 3 sleeps X × 4. Cap the multiplier so you do not end up sleeping for 18 hours after a bad day.
What you must not do: ignore the wait, switch to a different account immediately and keep hammering, or retry inside the wait window. All three escalate the issue from "this account paused" to "this account flagged".
Why it matters
For low-volume Telegram CRMs, flood waits are an occasional inconvenience. For anyone doing real outbound (100+ DMs per account per day), flood waits are the central operational challenge.
The economic impact is direct. Without proper handling, a single account hitting cascading flood waits during a bulk send can stall an entire campaign. With proper handling (account rotation, paced sending, exponential back-off, warm-up), the same account can run for months without escalating to a ban.
Flood waits also predict bans. Telegram's restriction escalation is roughly: minor flood waits → larger flood waits → PEER_FLOOD → spam-block → permanent restriction. Catching the pattern early, and slowing down, is the only way to avoid the later stages.
Real-world examples
- SDR sending 200 DMs/hour from one account. First flood wait at minute 12:
FLOOD_WAIT_30. Second at minute 25:FLOOD_WAIT_60. By minute 45 the waits climb to 5 minutes. If the client ignores them, by hour 2 the account is inPEER_FLOODand effectively offline for 48 hours. - Bulk-import via group scraping. Scraping member lists from large public groups can trigger flood waits on
channels.getParticipants. Standard handling: page through with 100-member chunks and a 1-second pause between pages. - Mass account creation.
account.sendCodehas a particularly aggressive limit. Trying to register 50 numbers in an hour will trigger flood waits in the thousands of seconds. - Joining many groups at once.
channels.joinChannelhas a per-account limit of roughly 200 joins per day. Crossing that throws aFLOOD_WAITof about 24 hours. - Account warming. A freshly-created account that sends a DM in the first 24 hours almost always hits a flood wait. Warm-up (a few days of receiving messages, joining channels, posting in groups) dramatically reduces flood-wait frequency.
Common mistakes
- Treating flood waits as fatal errors. They are not; they are throttling signals. Logging them as errors and stopping the campaign loses you the entire send window.
- Hot-switching accounts on every flood wait. If account A hits a wait, immediately switching to account B at the same send rate just produces a wait on B in 10 minutes. Slow down across the pool, not just within the account.
- Not exponentially backing off. Sleeping for exactly X and retrying, over and over, produces the same pattern that triggered the wait in the first place. Double the safety margin on each retry.
- Ignoring PEER_FLOOD as if it were a normal flood wait. It is not.
PEER_FLOODrequires a full stop, a 24-hour cooldown, and a behavior change, not a 5-minute pause. - Skipping account warm-up. A fresh number has zero trust signal. Treat the first 7 days as warm-up-only: receive messages, browse groups, do not send cold outbound at all.
Related concepts
- MTProto: the protocol that defines and enforces flood waits.
- Spintax: reduces duplicate-content signals that contribute to rate-limit escalation.
- Cold outreach: the workflow that hits flood waits most often.
- Drip campaign: the pacing structure that, when designed right, never hits flood waits at all.
- Webhook: flood waits should fire a webhook into your ops monitoring so the team can adjust pacing in real time.
- Omnichannel CRM Needs flood-wait awareness baked into every send path, not just Telegram.
How CRM Solid handles it
CRM Solid's send engine parses every MTProto response and auto-handles FLOOD_WAIT_X with an exponential back-off curve tuned across thousands of accounts. Long waits (above 1 hour) automatically pause the account for the rest of the day; PEER_FLOOD halts the account and notifies the operator. Account rotation respects per-account waits, so one account hitting a 5-minute pause does not stop the campaign. The rate limiter is configurable in appsettings.json. Twenty messages/hour and 50/day per account are our production defaults.