For AI agents: markdown of this page — /docs-content-en/openlines/sessions/transfers.md documentation index — /llms.txt

Reassignment history

The method ships in the imopenlines 26.700.0 update and is not yet available on all Bitrix24 accounts. If the update has not reached your Bitrix24 account yet, the API returns 422 METHOD_NOT_YET_AVAILABLE — this means the method has not been released on the account yet, not that the integration is broken.

POST /v1/openlines/sessions/transfers

A chronological list of reassignments (transfers) for specific sessions — from whom to whom, between which Open Channels, and for what reason.

Request fields (body)

Field Type Required Description
FieldsessionId Typenumber[] Requiredyes DescriptionArray of session identifiers, up to 50 elements. Source: POST /v1/openlines/sessions/search. A single number is also accepted and wrapped in an array

Duplicates in sessionId are counted once. A sessionId that does not exist, belongs to someone else, or is not accessible does not cause an error — there are simply no records for it in transfers.

Examples

curl — personal key

Terminal
curl -X POST "https://vibecode.bitrix24.com/v1/openlines/sessions/transfers" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "sessionId": [809, 805] }'

curl — OAuth application

Terminal
curl -X POST "https://vibecode.bitrix24.com/v1/openlines/sessions/transfers" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "sessionId": [809, 805] }'

JavaScript — personal key

javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/openlines/sessions/transfers', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ sessionId: [809, 805] }),
})
const { data } = await res.json()

JavaScript — OAuth application

javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/openlines/sessions/transfers', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ sessionId: [809, 805] }),
})
const { data } = await res.json()

Response fields

Transfers for all requested sessions come in one shared list, in chronological order by ascending date. To group by session, use the data.transfers[].sessionId field.

Field Type Description
Fieldsuccess Typeboolean Descriptiontrue on a successful response
Fielddata.transfers Typearray DescriptionReassignments across all requested sessions. An empty array if there were no transfers
Fielddata.transfers[].sessionId Typenumber DescriptionSession identifier
Fielddata.transfers[].date Typestring DescriptionDate and time of the reassignment, ISO 8601
Fielddata.transfers[].fromOperatorId Typenumber | null DescriptionOperator the dialog left. null if it came from the queue. Employee — GET /v1/users
Fielddata.transfers[].toOperatorId Typenumber | null DescriptionOperator the dialog went to. null if it went to the queue. Employee — GET /v1/users
Fielddata.transfers[].fromConfigId Typenumber DescriptionSource Open Channel. Open Channel description — GET /v1/openline-configs/:id
Fielddata.transfers[].toConfigId Typenumber | null DescriptionTarget Open Channel, if the dialog was transferred to another Open Channel. Open Channel description — GET /v1/openline-configs/:id
Fielddata.transfers[].reason Typestring DescriptionReason: manual / auto
Fielddata.transfers[].mode Typestring DescriptionMode: MANUAL / AUTO
Fielddata.transfers[].type Typestring DescriptionType: USER / QUEUE
Fielddata.transfers[].initiatorId Typenumber | null DescriptionTransfer initiator. Can be null. It can be populated even when reason is auto. Employee — GET /v1/users

Response example

Session 805 returned to the queue twice, and the operator manually transferred session 809 to a colleague:

JSON
{
  "success": true,
  "data": {
    "transfers": [
      { "sessionId": 805, "date": "2026-10-14T18:41:13+00:00", "fromOperatorId": 1, "toOperatorId": null, "fromConfigId": 59, "toConfigId": null, "reason": "auto", "mode": "MANUAL", "type": "QUEUE", "initiatorId": 1 },
      { "sessionId": 805, "date": "2026-10-14T18:41:14+00:00", "fromOperatorId": 1, "toOperatorId": null, "fromConfigId": 59, "toConfigId": null, "reason": "auto", "mode": "MANUAL", "type": "QUEUE", "initiatorId": 1 },
      { "sessionId": 809, "date": "2026-10-14T19:07:47+00:00", "fromOperatorId": 1, "toOperatorId": 1295, "fromConfigId": 59, "toConfigId": null, "reason": "manual", "mode": "MANUAL", "type": "USER", "initiatorId": 1 }
    ]
  }
}

Error response example

400 — more than 50 identifiers in the request:

JSON
{
  "success": false,
  "error": { "code": "BATCH_LIMIT_EXCEEDED", "message": "sessionId batch must not exceed 50 unique ids (got 51)" }
}

Errors

HTTP Code Description
HTTP400 CodeINVALID_JSON_BODY DescriptionThe request body did not parse as JSON. JSON is parsed before the fields are checked, so the response says nothing about missing parameters
HTTP400 CodeMISSING_PARAMS DescriptionsessionId is an empty array or is missing
HTTP400 CodeINVALID_PARAMS DescriptionAn element of sessionId is not a positive integer. The same code is returned when the request body is not an object
HTTP400 CodeBATCH_LIMIT_EXCEEDED DescriptionMore than 50 unique identifiers (duplicates are counted once)
HTTP401 CodeTOKEN_MISSING DescriptionThe key has no configured tokens
HTTP403 CodeSCOPE_DENIED DescriptionThe key has no imopenlines scope
HTTP403 CodeB24_TARIFF_RESTRICTION DescriptionThe plan does not include Open Channels statistics (report_open_lines)
HTTP422 CodeMETHOD_NOT_YET_AVAILABLE DescriptionThe imopenlines 26.700.0 update has not reached the Bitrix24 account yet. The response contains an error.release field set to imopenlines 26.700.0

Full list of common API errors — Errors.

See also