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"
          }
        }
        

См. также

Предыдущая
Следующая