Start typing indicator
Send a typing indicator to show that someone is typing in the chat.
Behavior
Typing indicators are best-effort signals that behave as follows:
-
iMessage chats only: Typing indicators are only supported for iMessage chats. Requests for RCS or SMS chats are accepted (
204) but no indicator is delivered. -
Send a message first for reliable delivery: Typing indicators are best-effort. If you have not sent a message in this chat recently (roughly the last 5 minutes), a typing indicator may not reach the recipient — the request is still accepted (
204), but delivery is not deterministic. Once you have sent a message in the chat, typing indicators reliably reach the recipient. -
No delivery guarantee: Even for active chats, a
204response only indicates the request was accepted for processing. -
Group chats not supported: Attempting to start a typing indicator in a group chat will return a
403error.
Duration & keeping it visible
-
A single call shows the indicator for about 85–90 seconds, then it clears automatically.
-
To keep it visible longer, call this endpoint again every 60 seconds. Each call refreshes the indicator so it stays visible continuously.
-
Sending a message clears the indicator.
-
To resume typing after sending a message, call this endpoint again.
-
Incoming messages do not affect the indicator.
Recipient re-opening the chat
If the recipient brings their messaging app to the foreground while the chat has an
unread message, their device clears any showing typing indicator. Calling this endpoint
again on its own may not bring it back. To make it reappear, either send a message, or
call DELETE /v3/chats/{chatId}/typing (stop) and then call start typing again.
Recommended usage
Call this endpoint when composing begins, call it again every 60 seconds while
composing, and send the message to clear the indicator. To clear the indicator without
sending a message, call DELETE /v3/chats/{chatId}/typing.
Start typing indicator
curl https://api.linqapp.com/api/partner/v3/chats/$CHAT_ID/typing \
-X POST \
-H "Authorization: Bearer $LINQ_API_V3_API_KEY"{
"error": {
"status": 400,
"code": 1002,
"message": "Phone number must be in E.164 format",
"doc_url": "https://docs.linqapp.com/error/codes/1xxx/1002/"
},
"success": false
}{
"error": {
"status": 401,
"code": 2004,
"message": "Unauthorized - missing or invalid authentication token",
"doc_url": "https://docs.linqapp.com/error/codes/2xxx/2004/"
},
"success": false
}{
"error": {
"status": 403,
"code": 2005,
"message": "Access denied - insufficient permissions for this resource",
"doc_url": "https://docs.linqapp.com/error/codes/2xxx/2005/"
},
"success": false
}{
"error": {
"status": 404,
"code": 2001,
"message": "Resource not found",
"doc_url": "https://docs.linqapp.com/error/codes/2xxx/2001/"
},
"success": false
}{
"error": {
"status": 500,
"code": 3006,
"message": "Internal server error",
"doc_url": "https://docs.linqapp.com/error/codes/3xxx/3006/"
},
"success": false
}Returns Examples
{
"error": {
"status": 400,
"code": 1002,
"message": "Phone number must be in E.164 format",
"doc_url": "https://docs.linqapp.com/error/codes/1xxx/1002/"
},
"success": false
}{
"error": {
"status": 401,
"code": 2004,
"message": "Unauthorized - missing or invalid authentication token",
"doc_url": "https://docs.linqapp.com/error/codes/2xxx/2004/"
},
"success": false
}{
"error": {
"status": 403,
"code": 2005,
"message": "Access denied - insufficient permissions for this resource",
"doc_url": "https://docs.linqapp.com/error/codes/2xxx/2005/"
},
"success": false
}{
"error": {
"status": 404,
"code": 2001,
"message": "Resource not found",
"doc_url": "https://docs.linqapp.com/error/codes/2xxx/2001/"
},
"success": false
}{
"error": {
"status": 500,
"code": 3006,
"message": "Internal server error",
"doc_url": "https://docs.linqapp.com/error/codes/3xxx/3006/"
},
"success": false
}