Skip to content
Get started

Start typing indicator

POST/v3/chats/{chatId}/typing

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 204 response 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 403 error.

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.

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.

Path ParametersExpand Collapse
chatId: string
formatuuid

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
}