Start Typing
Show the 'typing...' or 'recording audio...' status in a chat.
Authentication Required
Login to swap the placeholders with your real Instance ID and Access Token.
Log InNo query parameters required
This endpoint doesn't expect data in the URL.
Best practices
Call this 2-3 seconds before sending the actual text message.
Use webhooks to detect when a user starts typing to your bot as well.
Organic Presence: Mastering the Start Typing Engine
The `/v2/send/start-typing", endpoint is a non-visual, high-impact tool for managing user psychology and conversational expectations. In a world where instant bot replies can often feel robotic and impersonal, the "typing..." indicator serves as a bridge of human mimicry. By explicitly signaling that a response is in progress, you reduce user anxiety, prevent "double-texting" from impatient customers, and create a premium, "Human-in-the-Loop" experience for your automated flows.
🏗️ The Presence and Attention Pipeline
When you trigger the /start-typing endpoint, Wawp initiates a "Presence Broadcast" across the WhatsApp network:
- Signaling Initialization: The engine sends a specialized
COMPOSEpacket to the chat identified bychatId. This packet instructs the recipient's phone to render the "typing..." text in the top bar of the chat window and the animated bubble in the message thread. - Ephemeral Persistence: Unlike a message, this status is ephemeral. WhatsApp naturally clears it after approximately 10–20 seconds if no further activity is detected. However, Wawp allows you to maintain this status for longer durations by periodically re-calling the endpoint.
- Multi-Platform Sync: The "typing..." indicator is synchronized across the recipient's entire account—appearing on their mobile phone, WhatsApp Web, and Desktop apps simultaneously.
🛡️ Strategic Best Practices for Organic Simulation
1. The "Think Time" Strategy
Instantaneous text replies from a bot are a clear giveaway that no human is present.
- Implementation: When your backend receives a
message.receivedwebhook, call/v2/send/start-typingimmediately. Then, calculate your AI response or perform your database query, and wait a minimum of 2–3 seconds before sending the final/v2/send/text. - UX Impact: This brief pause with a "typing..." status makes the interaction feel like a considered reply from an attentive agent, significantly increasing user satisfaction and trust.
2. Managing impetuous Users
Users often send several messages in a row ("Hello?", "Are you there?", "I have a question").
- Best Practice: As soon as you detect any activity, trigger
/start-typing. This visual feedback often stops a user from sending follow-up messages, as they can see a response is already being formulated.
3. Coordinate with Media Prep
Large videos or PDFs can take a few seconds to process and upload.
- Workflow: If you are about to send a high-resolution image or a long video, start the "typing..." indicator during the file-fetch phase. This fills the dead air and ensures the user doesn't close the chat thinking the bot has crashed.
🧩 Advanced Use Cases
High-Fidelity Bot Mimicry
Build a "Humanized AI" by varying the duration of the typing status based on the length of the predicted response. If the AI is about to send a 500-word explanation, show "typing..." for 4 seconds. If it's a simple "Yes," show it for only 1 second. This level of detail makes the bot virtually indistinguishable from a human agent at first glance.
Interactive Voice Preparation
If your bot is about to send a Voice Note (/v2/send/voice), you can actually signal that you are "recording audio..." (on supported engine versions). This alerts the user to turn up their volume and prepare for a non-textual interaction, smoothing the transition between media types.
🛠️ Common Pitfalls and Solutions
- The "Stuck Typing" Bug: If you call
/start-typingbut then your backend crashes before sending the message, the user might see "typing..." for a long time only for it to disappear without a response. Solution: Use atry...finallyblock in your code to ensure that a/v2/send/stop-typingor a final message is always sent. - Over-Scheduling: Calling the start-typing endpoint every 100ms is unnecessary and can be flagged as "Abusive Behavior" by the WhatsApp network. We recommend a frequency of no more than once every 5–10 seconds if you need to sustain the indicator for a long-duration task.
- Group Chaos: In very large groups, excessive typing indicators from a bot can become distracting. Use this feature sparingly in group environments, focusing primarily on 1-on-1 customer support situations.
Summary of Capabilities:
- Explicitly trigger the native WhatsApp "typing..." or "recording audio..." indicators.
- High-fidelity organic simulation for bot and human-agent flows.
- Real-time presence broadcasting to individual, group, and channel recipients.
- Ephemeral state management with automatic network-level timeouts.
- Essential tool for managing user expectations and reducing conversational friction.
- Seamless coordination with text, media, and document delivery endpoints.
Request Parameters
Configure the parameters required to interact with this endpoint. All query and body arguments are listed below with their details.
Request Body
Sent as a JSON objectstring | Your unique WhatsApp Instance ID Example: | ||
string | Your API Access Token Example: | ||
string | Target phone number or group ID Example: |
Request Samples
Use these ready-to-go code snippets to integrate our API into your project quickly and efficiently. Choose your preferred language and library.
Expected Responses
Explore all possible responses and outcomes from the server. We have documented each status code with data examples to make success and error handling easier.
Example
{
"_data": {
"id": {
"fromMe": true,
"remote": "000000000000@c.us",
"id": "MSG_ID_123456",
"_serialized": "true_000000000000@c.us_MSG_ID_123456"
},
"viewed": false,
"body": "BASE64_IMAGE_DATA",
"type": "image",
"t": 1759108866,
"from": {
"server": "c.us",
"user": "111111111111",
"_serialized": "111111111111@c.us"
},
"to": {
"server": "c.us",
"user": "000000000000",
"_serialized": "000000000000@c.us"
},
"ack": 0,
"isNewMsg": true,
"star": false,
"kicNotified": false,
"caption": "Here's your requested image.",
"deprecatedMms3Url": "https://example.com/media-url",
"directPath": "/media/direct/path/example",
"mimetype": "image/jpeg",
"filehash": "FILE_HASH_PLACEHOLDER",
"encFilehash": "ENC_FILE_HASH_PLACEHOLDER",
"size": 192487,
"mediaKey": "MEDIA_KEY_PLACEHOLDER",
"mediaKeyTimestamp": 1759108865,
"streamable": false,
"mediaHandle": null,
"isFromTemplate": false,
"pollInvalidated": false,
"isSentCagPollCreation": false,
"latestEditMsgKey": null,
"latestEditSenderTimestampMs": null,
"mentionedJidList": {
},
"groupMentions": {
},
"isEventCanceled": false,
"eventInvalidated": false,
"isVcardOverMmsDocument": false,
"isForwarded": false,
"isQuestion": false,
"questionReplyQuotedMessage": null,
"questionResponsesCount": 0,
"readQuestionResponsesCount": 0,
"labels": {
},
"hasReaction": false,
"disappearingModeInitiator": "chat",
"disappearingModeTrigger": "chat_settings",
"productHeaderImageRejected": false,
"lastPlaybackProgress": 0,
"isDynamicReplyButtonsMsg": false,
"isCarouselCard": false,
"parentMsgId": null,
"callSilenceReason": null,
"isVideoCall": false,
"callDuration": null,
"callCreator": null,
"callParticipants": null,
"isCallLink": null,
"callLinkToken": null,
"isMdHistoryMsg": false,
"stickerSentTs": 0,
"lastUpdateFromServerTs": 0,
"invokedBotWid": null,
"bizBotType": null,
"botResponseTargetId": null,
"botPluginType": null,
"botPluginReferenceIndex": null,
"botPluginSearchProvider": null,
"botPluginSearchUrl": null,
"botPluginSearchQuery": null,
"botPluginMaybeParent": false,
"botReelPluginThumbnailCdnUrl": null,
"botMessageDisclaimerText": null,
"botMsgBodyType": null,
"requiresDirectConnection": false,
"bizContentPlaceholderType": null,
"hostedBizEncStateMismatch": false,
"senderOrRecipientAccountTypeHosted": false,
"placeholderCreatedWhenAccountIsHosted": false,
"galaxyFlowDisabled": false,
"links": {
}
},
"mediaKey": "MEDIA_KEY_PLACEHOLDER",
"id": {
"fromMe": true,
"remote": "000000000000@c.us",
"id": "MSG_ID_123456",
"_serialized": "true_000000000000@c.us_MSG_ID_123456"
},
"ack": 0,
"hasMedia": true,
"body": "Here's your requested image.",
"type": "image",
"timestamp": 1759108866,
"from": "111111111111@c.us",
"to": "000000000000@c.us",
"deviceType": "android",
"isForwarded": false,
"forwardingScore": 0,
"isStatus": false,
"isStarred": false,
"fromMe": true,
"hasQuotedMsg": false,
"hasReaction": false,
"vCards": {
},
"mentionedIds": {
},
"groupMentions": {
},
"isGif": false,
"links": {
}
}Command Palette
Search for a command to run...