Skip to main content
Safe Mode makes a number behave the way a person using WhatsApp behaves: it can go online while it sends, show a typing indicator before a message, mark incoming messages read before answering them, and leave human-shaped gaps between sends. Safe Mode is a BanSafe Lite feature, included in BanSafe Lite (Standard and Pro). Every setting is off by default on every number, existing and new, and only an explicit request turns one on.
Presence and read receipts are visible to the people you message and cannot be taken back. Read What your contacts see before you turn either on.

The four settings

Presence

Both online values also stop the number’s delivery receipts being marked as sent from a backgrounded client, which is the single clearest difference between a linked device that is in use and one that never is. Going online needs a display name on the account. When WhatsApp has none, the number stays dark and the response reports the applied presence as dark. Setting the number’s presence yourself with POST /messaging/{session}/presence always wins: Safe Mode does not undo it. Your value holds until you set it again, until the session reconnects, or — with online_hours — until the window next opens or closes.

Typing

The indicator lasts as long as the message would take to type: about 4.2 characters a second, never less than 900 ms and never more than 9 seconds. A voice note shows the recording indicator for 2.5 to 4 seconds and media shows the typing indicator for 1.2 to 2.6 seconds, both varied per message. Typing indicators are never sent to a channel, a bot, or a broadcast list, and never to a group.

Reads

Pacing

Delays never stack

A send takes one pause, not four. The typing indicator, the pacing gap, and the reply floor produce a budget; the largest one wins, and the time your request already spent waiting for the throughput limit is subtracted from it. The pause never exceeds 9 seconds. If your request declares how long it will wait for WhatsApp to acknowledge the send, Safe Mode shortens the pause rather than exceeding your deadline. A request sent with Prefer: respond-async is unaffected. Campaign sends are already paced by the campaign’s own rate, so a Safe Mode pause on a campaign send takes at most 60% of the gap between recipients and never reduces the campaign’s throughput.

Campaign sends always get typing and pacing

A send that originates from a campaign always uses at least typing: before_text and pacing: jittered, whatever the number’s Safe Mode settings are. Campaigns are the safe path for reaching people who have not written to you, so they behave that way by default.

What your contacts see

Every value except pacing changes what the people you message see. These actions cannot be undone once taken. This is why nothing is on by default. If your number is expected to stay dark, leave every setting where it is; BanSafe reports the findings either way.

Where to set it

Safe Mode is in Console and on both APIs, with the same settings, the same rules, and the same responses: Console names the values in plain words rather than the API’s: presence is Dark, Online while sending or Online during set hours; typing is Off, Before each text message or Before every message; read receipts are Off, Chats this number replies to or Every incoming message; pacing is Off, Varied gaps or Conversation pace. A number’s control also offers Follow the project, which is inherit. See Safety. Reading needs sessions:read; changing needs sessions:manage. On the Platform API, a signed-in team member must be an organization owner, admin, or developer to change Safe Mode; reading needs organization membership. The examples below use the Platform API. {sessionId} accepts a session UUID or a stable session slug, and so does the {session} segment on the Messaging API.

Set the project ceiling

The project ceiling is the most visible behaviour any number in the project may use.
The body is a partial update: send only the settings you want to change.
onlineStart and onlineEnd are whole local hours from 0 to 23 and default to 9 and 21. They apply only to presence: online_hours. The GET response tells you whether the plan allows a raise before you send one. entitled is true when at least one number in the project is on a plan that includes BanSafe Lite, and entitlementReason carries the sentence a refused raise would return, or null when a raise is allowed.

Set one number’s override

Each setting on a number accepts inherit to follow the project ceiling. An override may only be equally or more conservative than the ceiling; a more visible value is refused:
Raise the project ceiling first, then set the number override. The response carries the whole picture: applied is an observation, not a claim: it comes from the number itself. A number that is disconnected reports nothing and applied is null.

Responses to expect

A 503 never means the change was lost. Polymorfa persists the policy before telling the number about it, so an effective mode is never reported as applied when it is not.

Which numbers can use it

Safe Mode is included with BanSafe Lite. Both GET responses report this for you in entitled and entitlementReason, so you can tell a caller why a change is unavailable without attempting it. Eligible production Linked Device sessions receive Health estimates. BanSafe Lite adds Safe Mode, which changes how the number sends. See BanSafe Health.