Skip to content

API: polls

Create, edit, answer, finalize and schedule polls, including suggested polls and invitations.

All paths are under https://api.quorumcal.com. Send Authorization: Bearer <token>, and optionally Quorum-Version: 2026-10-20. Body properties are listed as arguments with In = body.

Answer a poll as yourself: PUT /v1/me/polls/{pollId}/my-response

One response per member; calling again replaces your answers.

  • Needs: polls:write (not for credentials limited to some orgs)
  • CLI: quorum polls answer
  • MCP tool: polls_answer
  • Returns: 200 PollResponseId
Argument In Type Required Description
pollId path string (uuid) yes
answers body PollAnswerInput[] yes Options left out count as no

Add attendees to a suggested poll: POST /v1/me/polls/{pollId}/attendees

Adds people as required or optional. Existing options stay; propose more times to include the new people’s calendars in new options. The creator or a team admin, while the poll is open.

  • Needs: polls:write (not for credentials limited to some orgs)
  • CLI: quorum polls attendees add
  • MCP tool: polls_attendees_add
  • Returns: 200 PollSuggestions
Argument In Type Required Description
pollId path string (uuid) yes
attendees body PollAttendeeInput[] yes

Remove an attendee from a suggested poll: DELETE /v1/me/polls/{pollId}/attendees/{attendeeId}

Their answers, if they gave any, stay on the poll. The creator or a team admin, while the poll is open.

  • Needs: polls:write (not for credentials limited to some orgs)
  • CLI: quorum polls attendees remove
  • MCP tool: polls_attendees_remove
  • Returns: 200 PollSuggestions
Argument In Type Required Description
pollId path string (uuid) yes
attendeeId path string (uuid) yes

Make an attendee required or optional: PATCH /v1/me/polls/{pollId}/attendees/{attendeeId}

The “make optional” quick action (Q63). Required attendees decide whether an option counts as working (Q61). Changing it never changes answers. The creator or a team admin, while the poll is open.

  • Needs: polls:write (not for credentials limited to some orgs)
  • CLI: quorum polls attendees update
  • MCP tool: polls_attendees_update
  • Returns: 200 PollSuggestions
Argument In Type Required Description
pollId path string (uuid) yes
attendeeId path string (uuid) yes
required body boolean yes

Busy overlay for a poll’s grid: GET /v1/me/polls/{pollId}/busy

Team members only. For each member who answered, whether they are busy, free or unavailable for each option (decisions.md Q21) with no times, honoring their visibility (Q22): people who hide their calendars are left out. Options spread over more than 120 days get available: false. Rate limited per person. Never available on the public poll.

  • Needs: polls:read (not for credentials limited to some orgs)
  • CLI: quorum polls busy
  • MCP tool: polls_busy
  • Returns: 200 PollBusy
Argument In Type Required Description
pollId path string (uuid) yes

Create a poll: POST /v1/me/polls

Share the poll’s public link at quorumcal.com/{owner address}/poll/{publicId} (or quorumcal.com/{org}/poll/{publicId} with publishAtRoot). Anyone with it can respond without an account.

  • Needs: polls:write (not for credentials limited to some orgs)
  • CLI: quorum polls create
  • MCP tool: polls_create
  • Returns: 201 Poll
Argument In Type Required Description
title body string yes
description body string
durationMinutes body integer yes
timezone body string yes
options body string (date-time)[] yes Candidate start times, in the future, up to 50
deadline body string (date-time)
meet body boolean Defaults to the org’s setting
publishAtRoot body boolean Team polls of a team with root publishing: public at quorumcal.com/{org}/poll/{publicId} instead of under the team. Defaults to false

Delete a poll and its responses: DELETE /v1/me/polls/{pollId}

Deleting a finalized poll doesn’t remove the calendar event.

  • Needs: polls:write (not for credentials limited to some orgs)
  • CLI: quorum polls delete
  • MCP tool: polls_delete
  • Returns: no body
Argument In Type Required Description
pollId path string (uuid) yes

Pick the final time and invite everyone who responded: POST /v1/me/polls/{pollId}/finalize

Creates a Google Calendar event on the creator’s booking calendar with every respondent as an attendee, and closes the poll. Finalizing the same option again returns the poll unchanged without a second event.

  • Needs: polls:write (not for credentials limited to some orgs)
  • CLI: quorum polls finalize
  • MCP tool: polls_finalize
  • Returns: 200 Poll
Argument In Type Required Description
pollId path string (uuid) yes
optionId body string (uuid) yes

Get a poll with every response: GET /v1/me/polls/{pollId}

Members see respondents’ email addresses; the public view never does.

  • Needs: polls:read (not for credentials limited to some orgs)
  • CLI: quorum polls get
  • MCP tool: polls_get
  • Returns: 200 Poll
Argument In Type Required Description
pollId path string (uuid) yes

Invite people to answer a poll by email: POST /v1/me/polls/{pollId}/invitations

Inviting needs no availability grant (Q105). Each address gets the poll’s link; the first email an address ever gets introduces Quorum, and every email carries “Don’t email me about Quorum” and “Forget me”. An address that opted out is skipped (listed under suppressed). Addresses already invited are skipped. New accounts can send a few a day (Q113).

  • Needs: polls:write (not for credentials limited to some orgs)
  • CLI: quorum polls invitations create
  • MCP tool: polls_invitations_create
  • Returns: 201 PollInvitations
Argument In Type Required Description
pollId path string (uuid) yes
emails body string (email)[] yes Up to 20 addresses
note body string

List who was invited to a poll: GET /v1/me/polls/{pollId}/invitations

Team members only.

  • Needs: polls:read (not for credentials limited to some orgs)
  • CLI: quorum polls invitations list
  • MCP tool: polls_invitations_list
  • Returns: 200 object
Argument In Type Required Description
pollId path string (uuid) yes

Suggested answers from your connected calendars: GET /v1/me/polls/{pollId}/prefill

Free options are suggested yes, busy ones no, never maybe (Q49). Reads your own conflict-checking calendars, hidden ones included. Nothing is saved: answer with the my-response endpoint after reviewing.

  • Needs: polls:read (not for credentials limited to some orgs)
  • CLI: quorum polls prefill
  • MCP tool: polls_prefill
  • Returns: 200 PollPrefill
Argument In Type Required Description
pollId path string (uuid) yes

Schedule now: book the chosen option and close the poll: POST /v1/me/polls/{pollId}/schedule

Books the option the owner picked through the same path as finalize: one Google Calendar event on the creator’s booking calendar with every attendee and respondent invited, and the poll closed. Google’s invitation is the only booking email (Q122); Quorum emails nobody. The ranking is re-read fresh first: if a required attendee is busy, outside hours or unconfirmed at that time, the request is refused with conflicts unless acceptConflicts is true. The creator or a team admin. Booking the same option again returns the poll unchanged.

  • Needs: polls:write (not for credentials limited to some orgs)
  • CLI: quorum polls schedule
  • MCP tool: polls_schedule
  • Returns: 200 Poll
Argument In Type Required Description
pollId path string (uuid) yes
optionId body string (uuid) yes
acceptConflicts body boolean

Create a poll whose times Quorum proposes: POST /v1/me/polls/suggest

Pick attendees (required or optional), a length and a window. Quorum proposes up to maxOptions non-overlapping times where the people it may see are free (Q105: a grant for this owner, and only calendars they show), inside their working hours and with their saved overrides applied (Q52). Attendees it can’t see are counted as unknown, not busy. Fails with no_times when nobody it can read is free anywhere in the window.

  • Needs: polls:write (not for credentials limited to some orgs)
  • CLI: quorum polls suggest
  • MCP tool: polls_suggest
  • Returns: 201 Poll
Argument In Type Required Description
title body string yes
description body string
durationMinutes body integer yes
timezone body string yes
window body SuggestionWindow yes
intervalMinutes body integer How often a time may start, in the poll’s time zone. Defaults to 30
attendees body PollAttendeeInput[] yes
maxOptions body integer At most this many proposed times. Defaults to 20
deadline body string (date-time)
autoFinalize body boolean Schedule the Best option by itself once every required attendee has answered, or the deadline passes, if it is unique (Q75). Needs a required attendee or a deadline
meet body boolean
publishAtRoot body boolean

People who can be picked as attendees of a suggested poll: GET /v1/me/polls/suggest/people

Org and team members, plus anyone who shared their availability for this owner (Q105). Names only, no addresses. canSeeCalendar says whether Quorum may read them; anyone else can still be an attendee and is counted as unknown. Team members only.

  • Needs: polls:read (not for credentials limited to some orgs)
  • CLI: quorum polls suggest-people
  • MCP tool: polls_suggest_people
  • Returns: 200 object

Every option ranked, with who can make it: GET /v1/me/polls/{pollId}/suggestions

Combines each attendee’s calendar (only if they shared availability for this owner and show a calendar, Q105) with the explicit answers on the poll; an explicit answer wins. Options are ordered required people first (an option missing a required person ranks below every option where all required people are available), then most people available, then maybes, then the earlier date (Q61). best marks the top option when no required person is missing. When no option has every required person requiredAlign is false and hints lists quick actions to offer; Quorum applies none. Each cell says busy, free, outside_hours or unknown for that person and option, never a time or title. Team members only; rate limited.

  • Needs: polls:read (not for credentials limited to some orgs)
  • CLI: quorum polls suggestions get
  • MCP tool: polls_suggestions_get
  • Returns: 200 PollSuggestions
Argument In Type Required Description
pollId path string (uuid) yes

Propose more times, optionally in a wider window: POST /v1/me/polls/{pollId}/suggestions/more

The “widen window” quick action (Q63). Adds new non-overlapping options from the calendars Quorum may see; existing options and their answers stay. to and from move the window (at most 62 days in all); without them the window extends a week at the end. Up to 50 options in total. The creator or a team admin, while the poll is open.

  • Needs: polls:write (not for credentials limited to some orgs)
  • CLI: quorum polls suggestions more
  • MCP tool: polls_suggestions_more
  • Returns: 200 PollSuggestions
Argument In Type Required Description
pollId path string (uuid) yes
from body string (date-time)
to body string (date-time)

Turn auto-finalize on or off: PATCH /v1/me/polls/{pollId}/suggestions

Auto-finalize (Q75) schedules the Best option by itself once every required attendee has answered, or the deadline has passed, if exactly one Best exists; otherwise the owner is emailed once. It needs a required attendee or a deadline. The creator or a team admin.

  • Needs: polls:write (not for credentials limited to some orgs)
  • CLI: quorum polls suggestions update
  • MCP tool: polls_suggestions_update
  • Returns: 200 PollSuggestions
Argument In Type Required Description
pollId path string (uuid) yes
autoFinalize body boolean yes

Edit a poll: PATCH /v1/me/polls/{pollId}

The creator or a team admin can edit an open poll. Times, length and time zone can’t change once anyone has responded.

  • Needs: polls:write (not for credentials limited to some orgs)
  • CLI: quorum polls update
  • MCP tool: polls_update
  • Returns: 200 Poll
Argument In Type Required Description
pollId path string (uuid) yes
title body string
description body string
durationMinutes body integer
timezone body string
options body string (date-time)[] Replaces the options. Only allowed while nobody has responded
deadline body string (date-time)
meet body boolean
publishAtRoot body boolean

Answer a poll as yourself: PUT /v1/orgs/{handle}/teams/{teamPath}/polls/{pollId}/my-response

One response per member; calling again replaces your answers.

  • Needs: polls:write
  • CLI: quorum team polls answer
  • MCP tool: team_polls_answer
  • Returns: 200 PollResponseId
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
pollId path string (uuid) yes
answers body PollAnswerInput[] yes Options left out count as no

Add attendees to a suggested poll: POST /v1/orgs/{handle}/teams/{teamPath}/polls/{pollId}/attendees

Adds people as required or optional. Existing options stay; propose more times to include the new people’s calendars in new options. The creator or a team admin, while the poll is open.

  • Needs: polls:write
  • CLI: quorum team polls attendees add
  • MCP tool: team_polls_attendees_add
  • Returns: 200 PollSuggestions
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
pollId path string (uuid) yes
attendees body PollAttendeeInput[] yes

Remove an attendee from a suggested poll: DELETE /v1/orgs/{handle}/teams/{teamPath}/polls/{pollId}/attendees/{attendeeId}

Their answers, if they gave any, stay on the poll. The creator or a team admin, while the poll is open.

  • Needs: polls:write
  • CLI: quorum team polls attendees remove
  • MCP tool: team_polls_attendees_remove
  • Returns: 200 PollSuggestions
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
pollId path string (uuid) yes
attendeeId path string (uuid) yes

Make an attendee required or optional: PATCH /v1/orgs/{handle}/teams/{teamPath}/polls/{pollId}/attendees/{attendeeId}

The “make optional” quick action (Q63). Required attendees decide whether an option counts as working (Q61). Changing it never changes answers. The creator or a team admin, while the poll is open.

  • Needs: polls:write
  • CLI: quorum team polls attendees update
  • MCP tool: team_polls_attendees_update
  • Returns: 200 PollSuggestions
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
pollId path string (uuid) yes
attendeeId path string (uuid) yes
required body boolean yes

Busy overlay for a poll’s grid: GET /v1/orgs/{handle}/teams/{teamPath}/polls/{pollId}/busy

Team members only. For each member who answered, whether they are busy, free or unavailable for each option (decisions.md Q21) with no times, honoring their visibility (Q22): people who hide their calendars are left out. Options spread over more than 120 days get available: false. Rate limited per person. Never available on the public poll.

  • Needs: polls:read
  • CLI: quorum team polls busy
  • MCP tool: team_polls_busy
  • Returns: 200 PollBusy
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
pollId path string (uuid) yes

Create a poll: POST /v1/orgs/{handle}/teams/{teamPath}/polls

Share the poll’s public link at quorumcal.com/{owner address}/poll/{publicId} (or quorumcal.com/{org}/poll/{publicId} with publishAtRoot). Anyone with it can respond without an account.

  • Needs: polls:write
  • CLI: quorum team polls create
  • MCP tool: team_polls_create
  • Returns: 201 Poll
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
title body string yes
description body string
durationMinutes body integer yes
timezone body string yes
options body string (date-time)[] yes Candidate start times, in the future, up to 50
deadline body string (date-time)
meet body boolean Defaults to the org’s setting
publishAtRoot body boolean Team polls of a team with root publishing: public at quorumcal.com/{org}/poll/{publicId} instead of under the team. Defaults to false

Delete a poll and its responses: DELETE /v1/orgs/{handle}/teams/{teamPath}/polls/{pollId}

Deleting a finalized poll doesn’t remove the calendar event.

  • Needs: polls:write
  • CLI: quorum team polls delete
  • MCP tool: team_polls_delete
  • Returns: no body
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
pollId path string (uuid) yes

Pick the final time and invite everyone who responded: POST /v1/orgs/{handle}/teams/{teamPath}/polls/{pollId}/finalize

Creates a Google Calendar event on the creator’s booking calendar with every respondent as an attendee, and closes the poll. Finalizing the same option again returns the poll unchanged without a second event.

  • Needs: polls:write
  • CLI: quorum team polls finalize
  • MCP tool: team_polls_finalize
  • Returns: 200 Poll
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
pollId path string (uuid) yes
optionId body string (uuid) yes

Get a poll with every response: GET /v1/orgs/{handle}/teams/{teamPath}/polls/{pollId}

Members see respondents’ email addresses; the public view never does.

  • Needs: polls:read
  • CLI: quorum team polls get
  • MCP tool: team_polls_get
  • Returns: 200 Poll
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
pollId path string (uuid) yes

Invite people to answer a poll by email: POST /v1/orgs/{handle}/teams/{teamPath}/polls/{pollId}/invitations

Inviting needs no availability grant (Q105). Each address gets the poll’s link; the first email an address ever gets introduces Quorum, and every email carries “Don’t email me about Quorum” and “Forget me”. An address that opted out is skipped (listed under suppressed). Addresses already invited are skipped. New accounts can send a few a day (Q113).

  • Needs: polls:write
  • CLI: quorum team polls invitations create
  • MCP tool: team_polls_invitations_create
  • Returns: 201 PollInvitations
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
pollId path string (uuid) yes
emails body string (email)[] yes Up to 20 addresses
note body string

List who was invited to a poll: GET /v1/orgs/{handle}/teams/{teamPath}/polls/{pollId}/invitations

Team members only.

  • Needs: polls:read
  • CLI: quorum team polls invitations list
  • MCP tool: team_polls_invitations_list
  • Returns: 200 object
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
pollId path string (uuid) yes

Suggested answers from your connected calendars: GET /v1/orgs/{handle}/teams/{teamPath}/polls/{pollId}/prefill

Free options are suggested yes, busy ones no, never maybe (Q49). Reads your own conflict-checking calendars, hidden ones included. Nothing is saved: answer with the my-response endpoint after reviewing.

  • Needs: polls:read
  • CLI: quorum team polls prefill
  • MCP tool: team_polls_prefill
  • Returns: 200 PollPrefill
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
pollId path string (uuid) yes

Schedule now: book the chosen option and close the poll: POST /v1/orgs/{handle}/teams/{teamPath}/polls/{pollId}/schedule

Books the option the owner picked through the same path as finalize: one Google Calendar event on the creator’s booking calendar with every attendee and respondent invited, and the poll closed. Google’s invitation is the only booking email (Q122); Quorum emails nobody. The ranking is re-read fresh first: if a required attendee is busy, outside hours or unconfirmed at that time, the request is refused with conflicts unless acceptConflicts is true. The creator or a team admin. Booking the same option again returns the poll unchanged.

  • Needs: polls:write
  • CLI: quorum team polls schedule
  • MCP tool: team_polls_schedule
  • Returns: 200 Poll
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
pollId path string (uuid) yes
optionId body string (uuid) yes
acceptConflicts body boolean

Create a poll whose times Quorum proposes: POST /v1/orgs/{handle}/teams/{teamPath}/polls/suggest

Pick attendees (required or optional), a length and a window. Quorum proposes up to maxOptions non-overlapping times where the people it may see are free (Q105: a grant for this owner, and only calendars they show), inside their working hours and with their saved overrides applied (Q52). Attendees it can’t see are counted as unknown, not busy. Fails with no_times when nobody it can read is free anywhere in the window.

  • Needs: polls:write
  • CLI: quorum team polls suggest
  • MCP tool: team_polls_suggest
  • Returns: 201 Poll
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
title body string yes
description body string
durationMinutes body integer yes
timezone body string yes
window body SuggestionWindow yes
intervalMinutes body integer How often a time may start, in the poll’s time zone. Defaults to 30
attendees body PollAttendeeInput[] yes
maxOptions body integer At most this many proposed times. Defaults to 20
deadline body string (date-time)
autoFinalize body boolean Schedule the Best option by itself once every required attendee has answered, or the deadline passes, if it is unique (Q75). Needs a required attendee or a deadline
meet body boolean
publishAtRoot body boolean

People who can be picked as attendees of a suggested poll: GET /v1/orgs/{handle}/teams/{teamPath}/polls/suggest/people

Org and team members, plus anyone who shared their availability for this owner (Q105). Names only, no addresses. canSeeCalendar says whether Quorum may read them; anyone else can still be an attendee and is counted as unknown. Team members only.

  • Needs: polls:read
  • CLI: quorum team polls suggest-people
  • MCP tool: team_polls_suggest_people
  • Returns: 200 object
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id

Every option ranked, with who can make it: GET /v1/orgs/{handle}/teams/{teamPath}/polls/{pollId}/suggestions

Combines each attendee’s calendar (only if they shared availability for this owner and show a calendar, Q105) with the explicit answers on the poll; an explicit answer wins. Options are ordered required people first (an option missing a required person ranks below every option where all required people are available), then most people available, then maybes, then the earlier date (Q61). best marks the top option when no required person is missing. When no option has every required person requiredAlign is false and hints lists quick actions to offer; Quorum applies none. Each cell says busy, free, outside_hours or unknown for that person and option, never a time or title. Team members only; rate limited.

  • Needs: polls:read
  • CLI: quorum team polls suggestions get
  • MCP tool: team_polls_suggestions_get
  • Returns: 200 PollSuggestions
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
pollId path string (uuid) yes

Propose more times, optionally in a wider window: POST /v1/orgs/{handle}/teams/{teamPath}/polls/{pollId}/suggestions/more

The “widen window” quick action (Q63). Adds new non-overlapping options from the calendars Quorum may see; existing options and their answers stay. to and from move the window (at most 62 days in all); without them the window extends a week at the end. Up to 50 options in total. The creator or a team admin, while the poll is open.

  • Needs: polls:write
  • CLI: quorum team polls suggestions more
  • MCP tool: team_polls_suggestions_more
  • Returns: 200 PollSuggestions
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
pollId path string (uuid) yes
from body string (date-time)
to body string (date-time)

Turn auto-finalize on or off: PATCH /v1/orgs/{handle}/teams/{teamPath}/polls/{pollId}/suggestions

Auto-finalize (Q75) schedules the Best option by itself once every required attendee has answered, or the deadline has passed, if exactly one Best exists; otherwise the owner is emailed once. It needs a required attendee or a deadline. The creator or a team admin.

  • Needs: polls:write
  • CLI: quorum team polls suggestions update
  • MCP tool: team_polls_suggestions_update
  • Returns: 200 PollSuggestions
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
pollId path string (uuid) yes
autoFinalize body boolean yes

Edit a poll: PATCH /v1/orgs/{handle}/teams/{teamPath}/polls/{pollId}

The creator or a team admin can edit an open poll. Times, length and time zone can’t change once anyone has responded.

  • Needs: polls:write
  • CLI: quorum team polls update
  • MCP tool: team_polls_update
  • Returns: 200 Poll
Argument In Type Required Description
handle path string yes
teamPath path string yes The team’s slug or id
pollId path string (uuid) yes
title body string
description body string
durationMinutes body integer
timezone body string
options body string (date-time)[] Replaces the options. Only allowed while nobody has responded
deadline body string (date-time)
meet body boolean
publishAtRoot body boolean