For AI agents: markdown of this page — /docs-content-en/chats/messages/typing.md documentation index — /llms.txt
Typing indicator
POST /v1/chats/:dialogId/typing
Shows the other chat members that the current user is typing a message, recording a voice message or a video, or sending a photo or a file — the v2 messenger method im.v2.Chat.InputAction.notify. The me alias as dialogId addresses the current user's personal dialog — see the Chats overview for details.
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
dialogId (path) |
string | yes | — | Dialog ID: numeric user ID for personal messages, chatXXX for group chats. The special me alias — the current user's personal dialog |
Request body fields
| Field | Type | Required | Description |
|---|---|---|---|
type |
string | no | What the user is doing: writing (default) — typing, recordingVoice — recording a voice message, sendingPhoto — sending a photo, sendingFile — sending a file, recordingVideo — recording a video |
The body may be omitted. Any other body field and any query parameter are rejected with 400 INVALID_PARAMS.
Examples
curl — personal key
curl -X POST "https://vibecode.bitrix24.com/v1/chats/chat42/typing" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "type": "recordingVoice" }'
curl — OAuth application
curl -X POST "https://vibecode.bitrix24.com/v1/chats/chat42/typing" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "type": "recordingVoice" }'
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/chats/chat42/typing', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({ type: 'recordingVoice' }),
})
const { success } = await res.json()
console.log('Indicator sent:', success)
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/chats/chat42/typing', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({ type: 'recordingVoice' }),
})
const { success } = await res.json()
console.log('Indicator sent:', success)
Response fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Always true on success |
data |
boolean | true — the event was sent to the members |
Response example
{
"success": true,
"data": true
}
Error response example
400 — an unknown type value:
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "`type` must be one of: writing, recordingVoice, sendingPhoto, sendingFile, recordingVideo."
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 400 | INVALID_PARAMS |
type outside the five values, any other body field, or any query parameter. Checked before any call to Bitrix24 |
| 404 | ENTITY_NOT_FOUND |
Bitrix24 reported "not found"; the portal code is in error.b24Code |
| 422 | BITRIX_ERROR |
Bitrix24 returned an error, for example CHAT_NOT_FOUND; the portal code is in error.b24Code |
| 403 | SCOPE_DENIED |
The API key does not have the im scope |
| 403 | WRITE_BLOCKED_READONLY_KEY |
The key is read-only, and the call sends an event to the chat members — see access rights |
| 401 | TOKEN_MISSING |
The API key has no Bitrix24 tokens configured |
| 502 | ME_ALIAS_RESOLUTION_FAILED |
The me alias could not be resolved: Bitrix24 did not return the current user's ID |
Full list of common API errors — Errors.
Known specifics
The indicator turns off on its own. The event shows the indicator for a few seconds. While the user keeps typing, repeat the call — but no more often than needed to keep the indicator on: the endpoint has no rate limit of its own, and every call goes to Bitrix24.
writing reaches beyond the chat. The "typing" event also goes to Open Channels, which pass it on to the external client, and to the chat's bots.
It does not make you a member. Unlike reading a chat, the call does not add the user as a member.