polls.voting.submit
Scope:
pollsКто может вызывать: Пользователь с правом голосования в опросе; опрос активен и доступен. Голос за другого пользователя (
userId) — только вызывающий с правом редактирования опроса (canEdit); у пользователяuserIdдолжно быть право голосования в опросе. Подробнее: Права доступа
Отправка голоса пользователя.
HTTP: POST
Побочные эффекты:
- Записывает голос в
b_vote_event/b_vote_event_answer(тот же путь, что UI черезCVote::keepVoting/voteFor). - Сохраняет комментарии к вопросам (
comment_{questionId}), если переданы. - Переголосование (revote): если пользователь уже голосовал и
polls.voting.canRevoteдля него возвращаетcanRevote: true, новый submit заменяет бюллетень. После успешного голосования срабатывает событиеonAfterVoting→ обработчикPolls\Events\Vote\ReVoteудаляет предыдущие события голосования этого пользователя в этом опросе (CVoteEvent::Delete). - Уведомление автору опроса (не всегда): если у опроса
notify≠N, заданauthorIdи голосующий — не автор, вызываетсяsendVotingMessage(IM приnotify = I, иначе e-mail). См. полеnotifyвpolls.vote.get/polls.vote.add. - При установленном модуле statistic может добавляться запись в статистику посещений (
CStatEvent::AddCurrent).
Повторный submit без права на revote не перезаписывает голос — вернётся VALIDATION_ERROR.
Голос от имени другого пользователя (userId)
Если userId передан и отличается от вызывающего, голос записывается на пользователя userId — участник голосования (b_vote_user), событие onAfterVoting, уведомление автору и комментарии относятся к нему, а не к вызывающему. Голос вызывающего при этом не появляется (polls.voting.isVoted без userId вернёт voted: false).
Проверки (как при голосовании из интерфейса):
- вызывающий — с правом редактирования опроса (
canEdit), иначеACCESS_DENIED; - у пользователя
userIdесть право голосования в опросе, опрос активен, иначеACCESS_DENIED; - пользователь
userIdсуществует, иначеNOT_FOUND; - ограничения уникальности опроса применяются только те, что относятся к пользователю: по ID пользователя, по авторизации и по дате регистрации. Ограничения по сессии, cookie и IP описывают браузер вызывающего и для голоса от имени другого пользователя не применяются; сессия и cookie вызывающего не меняются;
- повторный голос того же пользователя подчиняется правилам переголосования опроса так же, как обычный (без права на revote —
VALIDATION_ERROR).
Параметры метода
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
voteId |
int |
да | ID опроса (aliases: id, elementId) |
answers |
object |
да | Бюллетень: объект «questionId → ответы» или массив {questionId, answerId, message} |
userId |
int |
нет | ID пользователя портала, на которого записывается голос. По умолчанию — пользователь вебхука/OAuth. Голос за другого: у вызывающего canEdit, у пользователя — право голосования, опрос активен. |
Возвращаемые данные
Ответ в конверте модуля: result.result — { success, voteId, userId }; result.error. Ключи total/next для не-list методов могут отсутствовать в сериализации, если не переданы.
Обработка ошибок
Справочник кодов: Коды ошибок.
| Код | Описание |
|---|---|
UNAUTHORIZED |
Пользователь не авторизован |
INTERNAL_ERROR |
Внутренняя ошибка сервера |
ACCESS_DENIED |
Нет прав на операцию |
NOT_FOUND |
Сущность не найдена |
VALIDATION_ERROR |
Некорректные или неполные параметры |
Пример запроса (POST)
curl -X POST "https://{портал}/rest/{user_id}/{webhook_code}/polls.voting.submit.json" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"voteId": 15,
"answers": "{\"52\":{\"answerId\":193}}"
}'
Голос от имени пользователя 42:
curl -X POST "https://{портал}/rest/{user_id}/{webhook_code}/polls.voting.submit.json" -H "Content-Type: application/json" -H "Accept: application/json" -d '{
"voteId": 15,
"userId": 42,
"answers": {"52": 193}
}'
Пример ответа
{
"result": {
"result": {
"success": true,
"voteId": 27,
"userId": 1
},
"error": null
},
"time": {
"start": 1787319175,
"finish": 1787319175.416966,
"duration": 0.41696596145629883,
"processing": 0,
"date_start": "2026-08-21T16:32:55+03:00",
"date_finish": "2026-08-21T16:32:55+03:00"
}
}