
## Open Channel configuration fields

`GET /v1/openline-configs/fields`

Returns the schema of fields available for filtering and sorting, as well as the full registry of fields in the `list`, `get`, and `search` responses.

## Examples

### curl — personal key

```bash
curl "https://vibecode.bitrix24.com/v1/openline-configs/fields" \
  -H "X-Api-Key: YOUR_API_KEY"
```

### curl — OAuth application

```bash
curl "https://vibecode.bitrix24.com/v1/openline-configs/fields" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"
```

### JavaScript — personal key

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/openline-configs/fields', {
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
  },
})

const { success, data } = await res.json()
console.log('Schema fields:', Object.keys(data.fields))
```

### JavaScript — OAuth application

```javascript
const res = await fetch('https://vibecode.bitrix24.com/v1/openline-configs/fields', {
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
  },
})

const { success, data } = await res.json()
```

## Response fields

The `/fields` endpoint returns `data.fields` — a description of **all** fields in the `list`, `get`, and `search` responses: each field carries `type`, `readonly`, a `label`, and a `description`. Field names are **in camelCase**. The full set in `get` is 95 fields, in `list`/`search` — 91 (without the 4 operator queue fields). `data` additionally contains `aggregatable` and `batch`.

### Field schema (data.fields)

`/fields` returns the full field set — each with `type`, `readonly`, `label`, and `description`. Filtering (`filter`), sorting (`sort`), and grouping (`groupBy`) operate on these camelCase names. Below are the core fields most often used in `sort` and `filter`:

| Field | Type | RO | Description |
|------|-----|----|---------|
| `id` | number | yes | Configuration identifier |
| `name` | string | | Open Channel name |
| `active` | boolean | | Whether the channel is active |
| `queueType` | string | | Distribution algorithm: `all` — to all operators at once, `evenly` — evenly, `strictly` — strictly in the queue order |
| `workTimeFrom` | string | | Start of working hours (for example, `"8"` or `"9.30"`) |
| `workTimeTo` | string | | End of working hours |

`data` additionally specifies:
- `aggregatable` — fields available for `groupBy`: `["active", "queueType"]`
- `batch` — the set of batch operations declared for this entity in the `/fields` response: empty array `[]`

### Full response field registry (list / get / search)

In `get` the `data` object contains 95 fields (all camelCase), in `list`/`search` — 91 (without the 4 fields marked "`get` only": `queue`, `queueFull`, `queueUsersFields`, `queueOnline`).

#### Core

| Field | Type | RO | Source | Description |
|------|-----|----|---------|---------|
| `id` | number | yes | everywhere | Configuration identifier |
| `name` | string | | everywhere | Open Channel name |
| `active` | boolean | | everywhere | Channel is active (`true`/`false`) |
| `temporary` | string | | everywhere | Temporary channel: `"Y"` / `"N"` |
| `xmlId` | string\|null | | everywhere | External identifier |
| `languageId` | string\|null | | everywhere | Channel language (for example, `"en"`). `null` if the language is not set |

#### Queue and operators

| Field | Type | RO | Source | Description |
|------|-----|----|---------|---------|
| `queueType` | string | | everywhere | Distribution algorithm: `all` — to all operators at once, `evenly` — evenly, `strictly` — strictly in the queue order |
| `queueTime` | string | | everywhere | Wait time in the queue (seconds) |
| `noAnswerTime` | string | | everywhere | Time without an operator response before switching (seconds) |
| `checkAvailable` | string | | everywhere | Check operator availability: `"Y"` / `"N"` |
| `maxChat` | string\|null | | everywhere | Maximum number of simultaneous chats per operator (`"0"` — no limit). `null` if not set |
| `typeMaxChat` | string\|null | | everywhere | Chat-limit counting type: `answered` — only accepted, `total` — all. `null` if not set |
| `queue` | string[] | yes | `get` only | Array of operator IDs in the queue (strings) |
| `queueFull` | object | yes | `get` only | Operator objects with the fields `ID`, `SORT`, `USER_ID`, `DEPARTMENT_ID`, `USER_NAME`, `USER_WORK_POSITION`, `USER_AVATAR`, `USER_AVATAR_ID` |
| `queueUsersFields` | object | yes | `get` only | Operator profile data: `USER_NAME`, `USER_WORK_POSITION`, `USER_AVATAR`, `USER_AVATAR_ID` |
| `queueOnline` | string | yes | `get` only | Whether any operators are online at the moment: `"Y"` / `"N"` |

#### CRM integration

| Field | Type | RO | Source | Description |
|------|-----|----|---------|---------|
| `crm` | string | | everywhere | Enable CRM integration: `"Y"` / `"N"` |
| `crmCreate` | string | | everywhere | Type of CRM record created on the first inquiry: `deal`, `lead`, `contact`, `company` |
| `crmCreateSecond` | string | | everywhere | Record type on repeat inquiries (numeric type identifier) |
| `crmCreateThird` | string | | everywhere | Record type on the third and subsequent inquiries: `"Y"` / `"N"` |
| `crmForward` | string | | everywhere | Forward the inquiry to the responsible person from CRM: `"Y"` / `"N"` |
| `crmChatTracker` | string | | everywhere | Enable the chat tracker in CRM: `"Y"` / `"N"` |
| `crmTransferChange` | string | | everywhere | Change the responsible person when transferring the chat: `"Y"` / `"N"` |
| `crmSource` | string | | everywhere | CRM record source: `create` — create, any other value — take from history |

#### Welcome message

| Field | Type | RO | Source | Description |
|------|-----|----|---------|---------|
| `welcomeMessage` | string | | everywhere | Show the welcome message: `"Y"` / `"N"` |
| `welcomeMessageText` | string | | everywhere | Welcome text (supports BB code) |
| `watchTyping` | string | | everywhere | Show the typing indicator: `"Y"` / `"N"` |
| `sendWelcomeEachSession` | string | | everywhere | Send the welcome on every new session: `"Y"` / `"N"` |

#### Welcome bot

| Field | Type | RO | Source | Description |
|------|-----|----|---------|---------|
| `welcomeBotEnable` | string | | everywhere | Enable the welcome bot: `"Y"` / `"N"` |
| `welcomeBotId` | string | | everywhere | Bot ID. List: `GET /v1/bots` |
| `welcomeBotTime` | string | | everywhere | Bot response wait time (seconds) |
| `welcomeBotJoin` | string | | everywhere | When the bot joins: `always` — always, other values per configuration |
| `welcomeBotLeft` | string | | everywhere | When the bot leaves the chat: `queue` — after queueing, other values per configuration |

#### Working hours

| Field | Type | RO | Source | Description |
|------|-----|----|---------|---------|
| `workTimeEnable` | string | | everywhere | Enable the working-hours schedule: `"Y"` / `"N"` |
| `workTimeFrom` | string | | everywhere | Start of the working day (for example, `"8"`, `"9.30"`) |
| `workTimeTo` | string | | everywhere | End of the working day |
| `workTimeTimezone` | string | | everywhere | Time zone (for example, `"UTC"`) |
| `workTimeHolidays` | string[] | | everywhere | Holiday non-working days in `"DD.MM"` format (for example, `["1.01","7.01"]`) |
| `workTimeDayoff` | string[] | | everywhere | Days off of the week: `"MO"`, `"TU"`, `"WE"`, `"TH"`, `"FR"`, `"SA"`, `"SU"` |

#### Non-working-hours, no-answer, and close scenarios

Three groups of four fields each — scenario, form, bot, text:

| Field | Type | RO | Source | Description |
|------|-----|----|---------|---------|
| `workTimeDayoffRule` | string | | everywhere | Action on a day off: `text` — message, `form` — form, `bot` — bot, `none` — nothing |
| `workTimeDayoffFormId` | string | | everywhere | ID of the form for non-working hours |
| `workTimeDayoffBotId` | string | | everywhere | ID of the bot for non-working hours. List: `GET /v1/bots` |
| `workTimeDayoffText` | string | | everywhere | Message text during non-working hours (supports BB code) |
| `noAnswerRule` | string | | everywhere | Action on no answer: `text`, `form`, `bot`, `none` |
| `noAnswerFormId` | string | | everywhere | ID of the form on no answer |
| `noAnswerBotId` | string | | everywhere | ID of the bot on no answer. List: `GET /v1/bots` |
| `noAnswerText` | string | | everywhere | Message text on no answer |
| `closeRule` | string | | everywhere | Action on chat close: `text`, `form`, `bot`, `none` |
| `closeFormId` | string | | everywhere | ID of the form on close |
| `closeBotId` | string | | everywhere | ID of the bot on close. List: `GET /v1/bots` |
| `closeText` | string | | everywhere | Message text on close |
| `fullCloseTime` | string | | everywhere | Time until the chat is fully closed (seconds) |
| `confirmClose` | string | | everywhere | Ask for confirmation when closing the chat: `"Y"` / `"N"` |
| `showNotificationRedirect` | string\|null | | everywhere | Show a notification on redirect: `"Y"` / `"N"` / `null` |

#### Auto-close on inactivity

| Field | Type | RO | Source | Description |
|------|-----|----|---------|---------|
| `autoCloseRule` | string | | everywhere | Action when the inactivity time expires: `text`, `form`, `bot`, `none` |
| `autoCloseFormId` | string | | everywhere | ID of the form on auto-close |
| `autoCloseBotId` | string | | everywhere | ID of the bot on auto-close. List: `GET /v1/bots` |
| `autoCloseTime` | string | | everywhere | Time until the chat auto-closes (seconds) |
| `autoCloseText` | string\|null | | everywhere | Text on auto-close. An unset value comes back as `null` |
| `autoExpireTime` | string | | everywhere | Session expiration time on inactivity (seconds) |

#### Quality rating

| Field | Type | RO | Source | Description |
|------|-----|----|---------|---------|
| `voteMessage` | string | | everywhere | Enable the rating request: `"Y"` / `"N"` |
| `voteTimeLimit` | string | | everywhere | Time limit for the rating (seconds, `"0"` — no limit) |
| `voteBeforeFinish` | string | | everywhere | Request the rating before finishing the chat: `"Y"` / `"N"` |
| `voteClosingDelay` | string | | everywhere | Delay closing after the rating: `"Y"` / `"N"` |
| `voteMessage1Text` | string | | everywhere | Rating request text (simple messages with buttons) |
| `voteMessage1Like` | string | | everywhere | Response on a positive rating |
| `voteMessage1Dislike` | string | | everywhere | Response on a negative rating |
| `voteMessage2Text` | string | | everywhere | Rating request text (text mode, `1`/`0`) |
| `voteMessage2Like` | string | | everywhere | Response on `1` (positive) |
| `voteMessage2Dislike` | string | | everywhere | Response on `0` (negative) |

#### Agreements and categories

| Field | Type | RO | Source | Description |
|------|-----|----|---------|---------|
| `agreementMessage` | string | | everywhere | Request consent to the terms: `"Y"` / `"N"` |
| `agreementId` | string | | everywhere | ID of the terms document |
| `categoryEnable` | string | | everywhere | Enable inquiry categorization: `"Y"` / `"N"` |
| `categoryId` | string | | everywhere | ID of the default category |

#### Wait form

| Field | Type | RO | Source | Description |
|------|-----|----|---------|---------|
| `useWelcomeForm` | string | | everywhere | Show a form before queueing: `"Y"` / `"N"` |
| `welcomeFormId` | string | | everywhere | ID of the wait form |
| `welcomeFormDelay` | string | | everywhere | Delay showing the form: `"Y"` / `"N"` |
| `ignoreWelcomeFormResponsible` | string | | everywhere | Skip the form for the responsible person from CRM: `"Y"` / `"N"` |

#### Operator and session

| Field | Type | RO | Source | Description |
|------|-----|----|---------|---------|
| `operatorData` | string | | everywhere | Operator data in the chat: `profile` — full profile |
| `defaultOperatorData` | array | | everywhere | Default data when no operators are present. An empty set comes back as `[]` |
| `sessionPriority` | string | | everywhere | Session priority (`"0"` — standard) |
| `quickAnswersIblockId` | string | | everywhere | ID of the information block with quick answers |

#### KPI

| Field | Type | RO | Source | Description |
|------|-----|----|---------|---------|
| `kpiFirstAnswerTime` | string | | everywhere | First-response time target (seconds) |
| `kpiFirstAnswerAlert` | string | | everywhere | Send an alert when the first-response KPI is breached: `"Y"` / `"N"` |
| `kpiFirstAnswerList` | string[] | | everywhere | List of recipient IDs for the first-response KPI alert. An empty set comes back as `[]` |
| `kpiFirstAnswerText` | string\|null | | everywhere | Alert text template (supports `#OPERATOR#`, `#DIALOG#`). `null` if not set |
| `kpiFurtherAnswerTime` | string | | everywhere | Subsequent-response time target (seconds) |
| `kpiFurtherAnswerAlert` | string | | everywhere | Send an alert when the subsequent-response KPI is breached: `"Y"` / `"N"` |
| `kpiFurtherAnswerList` | string[] | | everywhere | List of recipient IDs for the alert. An empty set comes back as `[]` |
| `kpiFurtherAnswerText` | string\|null | | everywhere | Alert text template. `null` if not set |
| `kpiCheckOperatorActivity` | string | | everywhere | Monitor operator activity: `"Y"` / `"N"` |
| `sendNotificationEmptyQueue` | string | | everywhere | Notify on an empty queue: `"Y"` / `"N"` |

#### Service

| Field | Type | RO | Source | Description |
|------|-----|----|---------|---------|
| `dateCreate` | object | yes | everywhere | Creation date — comes back as an empty object `{}` |
| `dateModify` | object | yes | everywhere | Last-modification date — comes back as an empty object `{}` |
| `modifyUserId` | string | yes | everywhere | ID of the user who made the last change. Lookup: `GET /v1/users` |

## Response example

A few representative fields are shown. The full set is larger — 95 fields in `get`, 91 in `list`/`search`.

```json
{
  "success": true,
  "data": {
    "fields": {
      "id": { "type": "number", "readonly": true, "label": "ID", "description": "Configuration identifier." },
      "name": { "type": "string", "readonly": false, "label": "Line name", "description": "Open line name." },
      "active": { "type": "boolean", "readonly": false, "label": "Line active", "description": "Line is active (true/false)." },
      "queueType": { "type": "string", "readonly": false, "label": "Distribution algorithm", "description": "Distribution algorithm: all — to everyone at once, evenly — evenly, strictly — strictly by queue order." },
      "crmCreate": { "type": "string", "readonly": false, "label": "CRM record to create", "description": "Type of CRM record created on first contact: deal, lead, contact, company." },
      "welcomeMessage": { "type": "string", "readonly": false, "label": "Show welcome", "description": "Show welcome message: Y/N." },
      "workTimeFrom": { "type": "string", "readonly": false, "label": "Work day start", "description": "Work day start (for example 8, 9.30)." }
    },
    "aggregatable": ["active", "queueType"],
    "batch": []
  }
}
```

## Error response example

403 — no scope:

```json
{
  "success": false,
  "error": {
    "code": "SCOPE_DENIED",
    "message": "Access denied. Required scope: imopenlines"
  }
}
```

## Errors

| HTTP | Code | Description |
|------|-----|---------|
| 401 | `TOKEN_MISSING` | The API key was not passed |
| 403 | `SCOPE_DENIED` | The API key lacks the `imopenlines` scope |

Full list of common API errors — [Errors](/docs/errors).

## Known specifics

**A single set of names — camelCase.** All fields in the `list`/`get`/`search` responses come back in camelCase. The `/fields` endpoint (`data.fields`) describes each field with `type`, `readonly`, `label`, and `description`. `filter`, `sort`, `groupBy` operate on these names. 91 fields total in `list`/`search`, 95 in `get` (the 4 operator queue fields are added). On **write** (`create`/`update`) camelCase is the canonical case. UPPER_SNAKE_CASE names are also accepted for backward compatibility. Boolean fields accept `true`/`false` on write (coerced to `"Y"`/`"N"`).

**Numeric fields come as strings.** `queueTime`, `noAnswerTime`, `autoCloseTime`, `maxChat`, `kpiFirstAnswerTime`, and others — strings (`"60"`, `"180"`). The exceptions are `id` (`number`) and `active` (`boolean`): these two fields are transformed by the Vibecode API schema.

**`dateCreate` and `dateModify` are always empty objects `{}`.** Bitrix24 does not pass date values through these fields.

## See also

- [List configurations](/docs/openlines/config/list)
- [Get configuration](/docs/openlines/config/get)
- [Entity API](/docs/entity-api)
- [Filtering syntax](/docs/filtering)
