[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-openlines\u002Fratings":3,"docs-tabs-openlines\u002Fratings":6},{"content":4,"lastmod":5},"## Оценки (CSAT)\n\n> ⚠️ **Метод выходит в обновлении `imopenlines 26.700.0` и доступен пока не на всех порталах Битрикс24.** Если обновление на ваш портал ещё не пришло, API вернёт `422 METHOD_NOT_YET_AVAILABLE` — это признак того, что метод на портале ещё не выпущен, а не ошибка интеграции.\n\n`POST \u002Fv1\u002Fopenlines\u002Fratings\u002Fsearch`\n\nСписок сессий с выставленной клиентом оценкой (лайк\u002Fдизлайк) за период — для отчётов CSAT и выгрузки отзывов. Сессии без клиентской оценки в список не попадают.\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|---------|\n| `dateVoteFrom` | string | да | Начало периода оценки, ISO 8601. Период `dateVoteFrom`..`dateVoteTo` — не больше 1 года |\n| `dateVoteTo` | string | да | Конец периода оценки, ISO 8601 |\n| `configId` | number | нет | Идентификатор линии. Источник: [`GET \u002Fv1\u002Fopenline-configs`](\u002Fdocs\u002Fopenlines\u002Fconfig\u002Flist) |\n| `configIdList` | number[] | нет | Список линий |\n| `operatorId` | number | нет | Идентификатор оператора. Источник: [`GET \u002Fv1\u002Fusers`](\u002Fdocs\u002Fentities\u002Fusers) |\n| `operatorIdList` | number[] | нет | Список операторов |\n| `source` | string | нет | Код канала |\n| `sourceList` | string[] | нет | Список кодов каналов |\n| `vote` | string | нет | Клиентская оценка: `like` \u002F `dislike`. Без параметра возвращаются все оценённые сессии |\n| `hasVoteHead` | boolean | нет | Есть ли оценка руководителя. Принимает `true`\u002F`false` и `Y`\u002F`N` |\n| `limit` | number | нет | Размер страницы, 1..200 (по умолчанию 50) |\n| `offset` | number | нет | Смещение для пагинации (по умолчанию 0) |\n\nПериод `dateVoteFrom`\u002F`dateVoteTo` обязателен — ограничение защищает от тяжёлых выборок по таблице сессий. Если на линии отключена клиентская оценка, метод вернёт пустой список (оценённых сессий на такой линии не появляется).\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fopenlines\u002Fratings\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"configId\": 3,\n    \"vote\": \"like\",\n    \"dateVoteFrom\": \"2026-06-01T00:00:00+03:00\",\n    \"dateVoteTo\": \"2026-06-30T23:59:59+03:00\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fopenlines\u002Fratings\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"configId\": 3,\n    \"vote\": \"like\",\n    \"dateVoteFrom\": \"2026-06-01T00:00:00+03:00\",\n    \"dateVoteTo\": \"2026-06-30T23:59:59+03:00\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fopenlines\u002Fratings\u002Fsearch', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    configId: 3,\n    vote: 'like',\n    dateVoteFrom: '2026-06-01T00:00:00+03:00',\n    dateVoteTo: '2026-06-30T23:59:59+03:00',\n  }),\n})\nconst { data } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fopenlines\u002Fratings\u002Fsearch', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    configId: 3,\n    vote: 'like',\n    dateVoteFrom: '2026-06-01T00:00:00+03:00',\n    dateVoteTo: '2026-06-30T23:59:59+03:00',\n  }),\n})\nconst { data } = await res.json()\n```\n\n## Поля ответа\n\nОтвет — `{ \"success\": true, \"data\": { \"ratings\": [...], \"hasNextPage\": bool } }`.\n\n| Ключ | Описание |\n|---|---|\n| `ratings[].sessionId` | Идентификатор сессии |\n| `ratings[].configId` | Идентификатор линии |\n| `ratings[].operatorId` | Идентификатор оператора |\n| `ratings[].source` | Код канала |\n| `ratings[].vote` | Клиентская оценка (`like` \u002F `dislike`) |\n| `ratings[].voteHead` | Оценка руководителя, число 1..5 (`null`, если нет права) |\n| `ratings[].commentHead` | Комментарий руководителя (`null`, если нет права) |\n| `ratings[].dateVote` | Дата выставления оценки клиентом |\n| `ratings[].dateSessionClose` | Дата закрытия сессии |\n| `hasNextPage` | Есть ли следующая страница (поле конверта `data`, не элемента) |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"ratings\": [\n      {\n        \"sessionId\": 1024,\n        \"configId\": 3,\n        \"operatorId\": 42,\n        \"source\": \"livechat\",\n        \"vote\": \"like\",\n        \"voteHead\": 5,\n        \"commentHead\": \"Отличная работа\",\n        \"dateVote\": \"2026-06-15T14:53:00+03:00\",\n        \"dateSessionClose\": \"2026-06-15T14:52:10+03:00\"\n      }\n    ],\n    \"hasNextPage\": false\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n`400` — не передан период оценки:\n\n```json\n{\n  \"success\": false,\n  \"error\": { \"code\": \"MISSING_PARAMS\", \"message\": \"Required: dateVoteFrom, dateVoteTo (ISO 8601 strings)\" }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Когда |\n|---|---|---|\n| 403 | `B24_TARIFF_RESTRICTION` | Тариф не включает статистику Открытых линий (`report_open_lines`) |\n| 400 | `MISSING_PARAMS` | Не переданы обязательные `dateVoteFrom`\u002F`dateVoteTo` |\n| 422 | `BITRIX_ERROR` (`error.b24Code: INVALID_FILTER`) | Недопустимое значение `vote` или формат даты |\n| 422 | `BITRIX_ERROR` (`error.b24Code: PERIOD_TOO_LARGE`) | Период превышает 1 год |\n| 422 | `BITRIX_ERROR` (`error.b24Code: OFFSET_TOO_LARGE`) | `offset` превышает максимум — сузьте период |\n| 422 | `METHOD_NOT_YET_AVAILABLE` | Обновление `imopenlines 26.700.0` ещё не приехало на портал |\n\n## Пагинация без дрейфа страниц\n\nМетод листается через `offset`\u002F`limit`. При постраничной выгрузке фиксируйте верхнюю границу периода — `dateVoteTo` равным моменту старта выгрузки, чтобы новые оценки не сдвигали страницы.\n\nПолный список системных кодов — [Ошибки API](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список сессий](\u002Fdocs\u002Fopenlines\u002Fsessions)\n- [Агрегаты по линии за период](\u002Fdocs\u002Fopenlines\u002Fstats)\n- [Статистика Открытых линий](\u002Fdocs\u002Fopenlines)\n","2026-07-21",{}]