openapi: 3.0.3
info:
  title: Welcome to Geekbot's API
  version: 1.0.0
  description: |-
    <b>API reference</b>

     Use the Geekbot API to manage standups, polls, reports, users, and team data from your own tools and workflows. 

     All requests are made over HTTPS to <code>https://api.geekbot.com</code> and authenticated with an API key sent in the Authorization header. 

     The API returns JSON responses and supports common workflows such as retrieving the current user, listing teams and standups, creating polls, submitting reports, and starting standups programmatically.

     

     

     <b>Current and Legacy endpoints</b>

     The Geekbot API has two sets of endpoints, grouped as <b>Current</b> and <b>Legacy</b> in the sidebar. 

     The <b>Current</b> endpoints (served under <code>/v2/</code>) are the recommended choice for new integrations. They use a consistent response envelope (<code>data</code>, <code>next_cursor</code>, <code>has_more</code>), cursor-based pagination, opt-in field expansion via <code>?include=</code>, structured errors (<code>{ error: { code, message } }</code>), and an <code>Idempotency-Key</code> header for safe retries on write endpoints. The official <a href="https://github.com/geekbot-com/geekbot-cli">geekbot-cli</a> targets these endpoints.

     The <b>Legacy</b> endpoints (served under <code>/v1/</code>) are retained for backwards compatibility. They currently overlap with parts of the current API — both are fully supported, and you can mix them per request. More resources will be added to the current set over time.

     

     

     <b>Geekbot CLI & AI Skill</b> 

     Submit reports, analyse past responses, and manage standups and polls from your terminal or AI coding agent. Works as a standalone CLI and as a skill for Claude Code, Cursor, Windsurf, and Copilot. 

    <a href="https://github.com/geekbot-com/geekbot-cli">View on GitHub</a> 




     <b>Geekbot MCP Server</b> 

     Connect your AI assistant to Geekbot via the Model Context Protocol. Query standups, fetch reports, and post updates using natural language in Claude Desktop, Cursor, or Windsurf. 

    <a href="https://github.com/geekbot-com/geekbot-mcp">View on GitHub</a>
servers:
  - url: https://api.geekbot.com
    description: API base URL
tags:
  - name: User
    description: Retrieve information about the authenticated user, their teams, and their standups.
  - name: Poll (legacy)
    description: >-
      Older v1 poll endpoints retained for backwards compatibility. New integrations should use the current Poll
      endpoints.
  - name: Report (legacy)
    description: >-
      Older v1 report endpoints retained for backwards compatibility. New integrations should use the current Report
      endpoints.
  - name: Standup (legacy)
    description: >-
      Older v1 standup endpoints retained for backwards compatibility. New integrations should use the current Standup
      endpoints.
  - name: Team
    description: Retrieve team information associated with the authenticated API key.
  - name: Poll
    description: |-
      v2 poll endpoints. Standard envelope, cursor pagination, opt-in includes.
      The votes endpoint returns aggregated results (counts per choice, category
      rollups for open-ended) scoped by default to the latest poll instance.
  - name: Report
    description: |-
      v2 report endpoints. Standard envelope, cursor pagination, summary/full views.
      Write methods (POST/PATCH/DELETE) accept an `Idempotency-Key` header for safe
      retries. Time-window queries are capped at 90 days.
  - name: Standup
    description: |-
      v2 standup endpoints. Standard envelope, cursor pagination, opt-in includes.
      See `GET /v2/standups` for the canonical shape.
paths:
  /v1/me:
    get:
      tags:
        - User
      summary: Get current user
      operationId: GetCurrentUser
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  user:
                    type: object
                    properties:
                      id:
                        type: string
                        description: User unique ID.
                      username:
                        type: string
                        description: Username.
                      realname:
                        type: string
                        description: User's real name.
                      firstname:
                        type: string
                        description: User's first name.
                      email:
                        type: string
                        description: User's email address.
                      profile_img:
                        type: string
                        description: Profile image URL (192px).
                      timezone:
                        type: string
                        description: User's timezone.
                      is_admin:
                        type: boolean
                        description: Whether user is an admin.
                      is_billing_admin:
                        type: boolean
                        description: Whether user is a billing admin.
                      role:
                        type: string
                        description: User's role description.
                    description: Current user information.
                  team:
                    type: object
                    properties:
                      id:
                        type: number
                        description: Team ID.
                      name:
                        type: string
                        description: Team name.
                    description: Team information.
      description: Returns the authenticated user and basic information about the team associated with the provided API key.
  /v1/me/teams:
    get:
      tags:
        - User
      summary: List user teams
      operationId: GetUserTeams
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  teams:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                          description: Team ID.
                        name:
                          type: string
                          description: Team name.
                        is_admin:
                          type: boolean
                          description: Whether user is admin in this team.
                        standup_count:
                          type: number
                          description: Number of standups in the team.
                    description: List of teams the user belongs to.
      description: >-
        Returns the teams the authenticated user belongs to. This endpoint currently returns only the team associated
        with the provided API key.
  /v1/polls:
    get:
      tags:
        - Poll (legacy)
      summary: List polls
      operationId: ListPolls
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: number
                      description: Poll unique id.
                    name:
                      type: string
                      description: Poll name.
                    time:
                      type: string
                      description: Poll time.
                    timezone:
                      type: string
                      description: Poll timezone.
                    questions:
                      type: array
                      items:
                        type: object
                        properties:
                          id:
                            type: number
                            description: Question unique id.
                          text:
                            type: string
                            description: Question text.
                          answer_type:
                            type: string
                            description: Question answer type.
                          answer_choices:
                            type: array
                            items:
                              type: string
                            description: Question answer choices.
                          add_own_options:
                            type: boolean
                            description: Whether to allow users to add their own options.
                          one_option_limit:
                            type: boolean
                            description: Whether to limit the number of options to one.
                      description: Poll questions.
                    users:
                      type: array
                      items:
                        type: object
                        properties:
                          id:
                            type: number
                            description: User unique id.
                          role:
                            type: string
                            description: User role.
                          email:
                            type: string
                            description: User email.
                          username:
                            type: string
                            description: User username.
                          realname:
                            type: string
                            description: User real name.
                          profile_img:
                            type: string
                            description: User profile image.
                      description: Poll users.
                    recurrence:
                      type: object
                      properties: {}
                      description: Poll recurrence.
                    sync_channel_members:
                      type: boolean
                      description: Whether to sync channel members.
                    sync_channel:
                      type: string
                      description: Sync channel.
                    anonymous:
                      type: boolean
                      description: Whether to use anonymous mode.
                    intro:
                      type: string
                      description: Poll intro.
                    creator:
                      type: object
                      properties: {}
                      description: Poll creator.
                    users_total:
                      type: number
                      description: Total number of users.
                    paused:
                      type: boolean
                      description: Whether the poll is paused.
      description: Returns the polls the authenticated user participates in.
    post:
      tags:
        - Poll (legacy)
      summary: Create poll
      operationId: CreatePoll
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: number
                    description: Poll unique id.
                  name:
                    type: string
                    description: Poll name.
                  time:
                    type: string
                    description: Poll time.
                  timezone:
                    type: string
                    description: Poll timezone.
                  questions:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                          description: Question unique id.
                        text:
                          type: string
                          description: Question text.
                        answer_type:
                          type: string
                          description: Question answer type.
                        answer_choices:
                          type: array
                          items:
                            type: string
                          description: Question answer choices.
                        add_own_options:
                          type: boolean
                          description: Whether to allow users to add their own options.
                        one_option_limit:
                          type: boolean
                          description: Whether to limit the number of options to one.
                    description: Poll questions.
                  users:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                          description: User unique id.
                        role:
                          type: string
                          description: User role.
                        email:
                          type: string
                          description: User email.
                        username:
                          type: string
                          description: User username.
                        realname:
                          type: string
                          description: User real name.
                        profile_img:
                          type: string
                          description: User profile image.
                    description: Poll users.
                  recurrence:
                    type: object
                    properties: {}
                    description: Poll recurrence.
                  sync_channel_members:
                    type: boolean
                    description: Whether to sync channel members.
                  sync_channel:
                    type: string
                    description: Sync channel.
                  anonymous:
                    type: boolean
                    description: Whether to use anonymous mode.
                  intro:
                    type: string
                    description: Poll intro.
                  creator:
                    type: object
                    properties: {}
                    description: Poll creator.
                  users_total:
                    type: number
                    description: Total number of users.
                  paused:
                    type: boolean
                    description: Whether the poll is paused.
      description: >-
        Creates a one-time poll in the specified channel and invites current channel members. The authenticated user
        becomes the poll creator.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: Poll name.
                channel:
                  type: string
                  description: Channel where the poll is posted and the members are invited.
                question:
                  type: string
                  description: Poll question.
                choices:
                  type: array
                  items:
                    type: string
                  description: Poll choices.
                duration:
                  type: number
                  description: Duration of the poll in minutes.
              required:
                - name
                - channel
                - question
                - choices
                - duration
  /v1/polls/{id}:
    get:
      tags:
        - Poll (legacy)
      summary: Get poll
      operationId: GetPoll
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: number
                    description: Poll unique id.
                  name:
                    type: string
                    description: Poll name.
                  time:
                    type: string
                    description: Poll time.
                  timezone:
                    type: string
                    description: Poll timezone.
                  questions:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                          description: Question unique id.
                        text:
                          type: string
                          description: Question text.
                        answer_type:
                          type: string
                          description: Question answer type.
                        answer_choices:
                          type: array
                          items:
                            type: string
                          description: Question answer choices.
                        add_own_options:
                          type: boolean
                          description: Whether to allow users to add their own options.
                        one_option_limit:
                          type: boolean
                          description: Whether to limit the number of options to one.
                    description: Poll questions.
                  users:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                          description: User unique id.
                        role:
                          type: string
                          description: User role.
                        email:
                          type: string
                          description: User email.
                        username:
                          type: string
                          description: User username.
                        realname:
                          type: string
                          description: User real name.
                        profile_img:
                          type: string
                          description: User profile image.
                    description: Poll users.
                  recurrence:
                    type: object
                    properties: {}
                    description: Poll recurrence.
                  sync_channel_members:
                    type: boolean
                    description: Whether to sync channel members.
                  sync_channel:
                    type: string
                    description: Sync channel.
                  anonymous:
                    type: boolean
                    description: Whether to use anonymous mode.
                  intro:
                    type: string
                    description: Poll intro.
                  creator:
                    type: object
                    properties: {}
                    description: Poll creator.
                  users_total:
                    type: number
                    description: Total number of users.
                  paused:
                    type: boolean
                    description: Whether the poll is paused.
      description: >-
        Returns a poll by ID. The poll must belong to the authenticated team, and the authenticated user must have
        access to it.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: number
          description: Poll unique id.
  /v1/polls/{id}/votes:
    get:
      tags:
        - Poll (legacy)
      summary: Get poll results
      operationId: GetPollVotes
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  total_results:
                    type: number
                    description: Total number of poll instances in the result.
                  questions:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                          description: Question unique id.
                        text:
                          type: string
                          description: Question text.
                        answer_type:
                          type: string
                          description: Question answer type.
                        results:
                          type: array
                          items:
                            type: object
                            properties:
                              date:
                                type: string
                                description: Result date.
                              answers:
                                type: array
                                items:
                                  type: object
                                  properties:
                                    text:
                                      type: string
                                      description: Answer text.
                                    votes:
                                      type: number
                                      description: Answer votes.
                                    percentage:
                                      type: number
                                      description: Answer percentage.
                                    users:
                                      type: array
                                      items:
                                        type: object
                                        properties:
                                          id:
                                            type: string
                                            description: User unique id.
                                          role:
                                            type: string
                                            description: User role.
                                          email:
                                            type: string
                                            description: User email.
                                          username:
                                            type: string
                                            description: User username.
                                          realname:
                                            type: string
                                            description: User real name.
                                          profile_img:
                                            type: string
                                            description: User profile image.
                                      description: Users who chose this answer (when poll is not anonymous).
                                description: Result answers.
                          description: Per-instance vote breakdown for this question.
                    description: Poll questions with aggregated votes.
                  instances:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                          description: Instance unique id.
                        date:
                          type: string
                          description: Instance date.
                        answer_count:
                          type: number
                          description: Number of answers in this instance.
                    description: Poll instances included in the result.
      description: >-
        Returns aggregated voting results for a poll. You can optionally filter results by date range using the `from`
        and `to` query parameters.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: number
          description: Poll unique id.
        - name: from
          in: query
          required: false
          schema:
            type: string
          description: Votes from date.
        - name: to
          in: query
          required: false
          schema:
            type: string
          description: Votes to date.
  /v1/reports/:
    get:
      tags:
        - Report (legacy)
      summary: List reports
      operationId: ListReports
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: number
                      description: Report unique id.
                    standup_id:
                      type: number
                      description: Standup unique id.
                    timestamp:
                      type: number
                      description: Report timestamp (Unix).
                    channel:
                      type: string
                      description: Channel where the standup is posted.
                    is_anonymous:
                      type: boolean
                      description: Whether the standup is anonymous.
                    broadcast_thread:
                      type: boolean
                      description: Whether updates are posted in a thread.
                    is_confidential:
                      type: boolean
                      description: Whether the standup is confidential.
                    member:
                      type: object
                      properties:
                        id:
                          type: string
                          description: User unique id.
                        username:
                          type: string
                          description: User username.
                        realname:
                          type: string
                          description: User real name.
                        profileImg:
                          type: object
                          properties: {}
                          description: User profile image URLs by size.
                      description: User who submitted the report (omitted when anonymous).
                    questions:
                      type: array
                      items:
                        type: object
                        properties:
                          id:
                            type: number
                            description: Answer unique id.
                          question:
                            type: string
                            description: Question text.
                          question_id:
                            type: number
                            description: Question unique id.
                          color:
                            type: string
                            description: Question color.
                          answer:
                            type: string
                            description: Answer text (HTML when html=true).
                          images:
                            type: array
                            items:
                              type: object
                              properties:
                                title:
                                  type: string
                                  description: Image title.
                                image_url:
                                  type: string
                                  description: Image URL.
                            description: Images attached to the answer.
                      description: Report answers.
      description: >-
        Returns standup reports visible to the authenticated user. You can filter results by standup, user, date range,
        and question ID.
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: number
          description: Limit number of reports. Default is 30, maximum limit is 100.
        - name: standup_id
          in: query
          required: false
          schema:
            type: number
          description: Receive reports for the specified standup only.
        - name: user_id
          in: query
          required: false
          schema:
            type: number
          description: Receive reports from the specified user only.
        - name: after
          in: query
          required: false
          schema:
            type: number
          description: Receive reports given after the specified timestamp.
        - name: before
          in: query
          required: false
          schema:
            type: number
          description: Receive reports given before the specified timestamp.
        - name: question_ids
          in: query
          required: false
          schema:
            type: array
            items:
              type: number
          description: Receive answers to specific questions only.
        - name: html
          in: query
          required: false
          schema:
            type: boolean
          description: Receive anwers with html formatting.
    post:
      tags:
        - Report (legacy)
      summary: Create report
      operationId: CreateReport
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: number
                    description: Report unique id.
                  slack_ts:
                    type: string
                    description: Slack message timestamp.
                  standup_id:
                    type: number
                    description: Standup unique id.
                  timestamp:
                    type: number
                    description: Report timestamp (Unix).
                  started_at:
                    type: number
                    description: When the report was started (Unix).
                  done_at:
                    type: number
                    description: When the report was completed (Unix).
                  broadcasted_at:
                    type: string
                    description: When the report was broadcast to the channel.
                  channel:
                    type: string
                    description: Channel where the standup is posted.
                  member:
                    type: object
                    properties:
                      id:
                        type: string
                        description: User unique id.
                      role:
                        type: string
                        description: User role.
                      username:
                        type: string
                        description: User username.
                      realname:
                        type: string
                        description: User real name.
                      profileImg:
                        type: object
                        properties: {}
                        description: User profile image URLs by size.
                    description: User who submitted the report.
                  answers:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                          description: Answer unique id.
                        answer:
                          type: string
                          description: Answer text.
                        question:
                          type: string
                          description: Question text.
                        question_id:
                          type: number
                          description: Question unique id.
                        color:
                          type: string
                          description: Question color.
                        images:
                          type: array
                          items:
                            type: object
                            properties: {}
                          description: Images attached to the answer.
                    description: Submitted answers.
      description: >-
        Creates a new standup report on behalf of the authenticated user. The standup must exist, be active, and include
        the authenticated user as a participant or creator.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                standup_id:
                  type: integer
                  description: Standup unique id
                answers:
                  type: array
                  items:
                    type: string
                  description: Associative array with question ids that point to text answers
              required:
                - standup_id
                - answers
  /v1/me/standups:
    get:
      tags:
        - User
      summary: List user standups
      operationId: GetUserStandups
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: number
                      description: Standup unique id.
                    name:
                      type: string
                      description: Standup name.
                    time:
                      type: string
                      description: Time standup starts.
                    wait_time:
                      type: number
                      description: >-
                        Minutes to wait after user logs in before asking a question. Null value means no automated
                        asking.
                    timezone:
                      type: string
                      description: Timezone used to calculate standup time.
                    days:
                      type: array
                      items:
                        type: string
                      description: List of days when standup is active.
                    channel:
                      type: string
                      description: Channel where the standup updates are posted.
                    questions:
                      type: array
                      items:
                        type: object
                        properties: {}
                      description: List of standup questions.
                    users:
                      type: array
                      items:
                        type: object
                        properties: {}
                      description: List of users taking part in the standup.
                    sync_channel_members:
                      type: boolean
                      description: Standup participants will be synced with channel members.
      description: >-
        Returns the standups the authenticated user participates in. This endpoint is an alias of `/v1/standups` and
        returns the same detailed response format.
  /v1/standups/:
    get:
      tags:
        - Standup (legacy)
      summary: List standups
      operationId: ListStandups
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: number
                      description: Standup unique id.
                    name:
                      type: string
                      description: Standup name.
                    time:
                      type: string
                      description: Time standup starts.
                    wait_time:
                      type: number
                      description: >-
                        Minutes to wait after user logs in before asking a question. Null value means no automated
                        asking.
                    timezone:
                      type: string
                      description: Timezone used to calculate standup time.
                    days:
                      type: array
                      items:
                        type: string
                      description: List of days when standup is active.
                    channel:
                      type: string
                      description: Channel where the standup updates are posted.
                    questions:
                      type: array
                      items:
                        type: object
                        properties: {}
                      description: List of standup questions.
                    users:
                      type: array
                      items:
                        type: object
                        properties: {}
                      description: List of users taking part in the standup.
                    sync_channel_members:
                      type: boolean
                      description: Standup participants will be synced with channel members.
      description: >-
        Returns the standups available to the authenticated user. Draft or restricted standups are hidden unless the
        authenticated user is the creator. Admins can request the full list by using the `admin` query parameter.
    post:
      tags:
        - Standup (legacy)
      summary: Create standup
      operationId: CreateStandup
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: number
                    description: Standup unique id.
                  name:
                    type: string
                    description: Standup name.
                  time:
                    type: string
                    description: Time standup starts (HH:MM:SS).
                  wait_time:
                    type: number
                    description: Minutes to wait after login before asking (-1 = no automatic asking).
                  timezone:
                    type: string
                    description: Timezone used to calculate standup time.
                  days:
                    type: array
                    items:
                      type: string
                    description: Days when standup is active.
                  channel:
                    type: string
                    description: Channel where standup updates are posted.
                  questions:
                    type: array
                    items:
                      type: object
                      properties: {}
                    description: Standup questions.
                  users:
                    type: array
                    items:
                      type: object
                      properties: {}
                    description: Standup participants.
                  sync_channel_members:
                    type: boolean
                    description: Whether participants are synced from the channel.
      description: >-
        Creates a new standup in the authenticated team. Participants can be provided explicitly with `users`, or
        derived from a channel when `sync_channel_members` is enabled.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: Standup name.
                channel:
                  type: string
                  description: Channel where the standup updates are posted.
                time:
                  type: string
                  description: Time to ask standup in "HH:MM:SS" format.
                timezone:
                  type: string
                  description: Timezone to use when calculating time to ask. If not specified, default is user local.
                wait_time:
                  type: number
                  description: >-
                    Minutes to wait after team member is online before asking a question. Set to null so that users do
                    not get asked at all automatically.
                days:
                  type: array
                  items:
                    type: string
                  description: An array of 3-letter words that define days to ask, example ['Mon', 'Wed', 'Fri'].
                questions:
                  type: array
                  items:
                    type: object
                    properties: {}
                  description: >-
                    List of standup questions, an array of objects containing a "question" property. If ommited, 3
                    Geekbot recommended questions will be used.
                users:
                  type: array
                  items:
                    type: number
                  description: Array of user ids that will be included in the standup.
                sync_channel_members:
                  type: boolean
                  description: Standup participants will be synced with channel members.
                personalised:
                  type: boolean
                  description: Allow users to change their personal schedule for the standup
              required:
                - name
                - channel
                - time
                - timezone
                - days
                - users
                - sync_channel_members
                - personalised
  /v1/standups/{id}:
    get:
      tags:
        - Standup (legacy)
      summary: Get standup
      operationId: GetStandup
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: number
                    description: Standup unique id.
                  name:
                    type: string
                    description: Standup name.
                  time:
                    type: string
                    description: Time standup starts.
                  wait_time:
                    type: number
                    description: Minutes to wait after user logs in before asking a question. Null value means no automated asking.
                  timezone:
                    type: string
                    description: Timezone used to calculate standup time.
                  days:
                    type: array
                    items:
                      type: string
                    description: List of days when standup is active.
                  channel:
                    type: string
                    description: Channel where the standup updates are posted.
                  questions:
                    type: array
                    items:
                      type: object
                      properties: {}
                    description: List of standup questions.
                  users:
                    type: array
                    items:
                      type: object
                      properties: {}
                    description: List of users taking part in the standup.
                  sync_channel_members:
                    type: boolean
                    description: Standup participants will be synced with channel members.
      description: >-
        Returns a standup by ID. The standup must belong to the authenticated team, and the authenticated user must be a
        participant or the standup creator.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: number
          description: Standup unique id.
    delete:
      tags:
        - Standup (legacy)
      summary: Delete standup
      operationId: DeleteStandup
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: number
                    description: Standup unique id.
                  name:
                    type: string
                    description: Standup name.
                  time:
                    type: string
                    description: Time standup starts (HH:MM:SS).
                  wait_time:
                    type: number
                    description: Minutes to wait after login before asking (-1 = no automatic asking).
                  timezone:
                    type: string
                    description: Timezone used to calculate standup time.
                  days:
                    type: array
                    items:
                      type: string
                    description: Days when standup is active.
                  channel:
                    type: string
                    description: Channel where standup updates are posted.
                  questions:
                    type: array
                    items:
                      type: object
                      properties: {}
                    description: Standup questions.
                  users:
                    type: array
                    items:
                      type: object
                      properties: {}
                    description: Standup participants.
                  sync_channel_members:
                    type: boolean
                    description: Whether participants are synced from the channel.
      description: Deletes a standup. The authenticated user must have permission to edit it.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: number
          description: Standup unique id.
    patch:
      tags:
        - Standup (legacy)
      summary: Update standup
      operationId: UpdateStandup
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: number
                    description: Standup unique id.
                  name:
                    type: string
                    description: Standup name.
                  time:
                    type: string
                    description: Time standup starts (HH:MM:SS).
                  wait_time:
                    type: number
                    description: Minutes to wait after login before asking (-1 = no automatic asking).
                  timezone:
                    type: string
                    description: Timezone used to calculate standup time.
                  days:
                    type: array
                    items:
                      type: string
                    description: Days when standup is active.
                  channel:
                    type: string
                    description: Channel where standup updates are posted.
                  questions:
                    type: array
                    items:
                      type: object
                      properties: {}
                    description: Standup questions.
                  users:
                    type: array
                    items:
                      type: object
                      properties: {}
                    description: Standup participants.
                  sync_channel_members:
                    type: boolean
                    description: Whether participants are synced from the channel.
      description: Updates one or more standup fields. Only properties included in the request body are changed.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: number
          description: Standup unique id.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                channel:
                  type: string
                  description: Channel where the standup updates are posted.
                name:
                  type: string
                  description: Standup name.
                time:
                  type: string
                  description: Time to ask standup in HHMM format.
                timezone:
                  type: string
                  description: Timezone to use when calculating time to ask.
                wait_time:
                  type: number
                  description: >-
                    Minutes to wait after team member is online before asking a question. Set to null so that users do
                    not get asked at all automatically.
                days:
                  type: array
                  items:
                    type: string
                  description: An array of 3-letter words that define days to ask, example ['Mon', 'Wed', 'Fri']
                questions:
                  type: array
                  items:
                    type: object
                    properties: {}
                  description: List of standup questions, an array of objects containing a "question" property.
                users:
                  type: array
                  items:
                    type: number
                  description: Array of user ids that will be included in the standup.
                sync_channel_members:
                  type: boolean
                  description: >-
                    Standup participants will be synced with channel members. If this is set to "false" you need to
                    provide the "users" parameter.
                personalised:
                  type: boolean
                  description: Allow users to change their personal schedule for the standup
              required:
                - wait_time
                - sync_channel_members
                - personalised
    put:
      tags:
        - Standup (legacy)
      summary: Replace standup
      operationId: ReplaceStandup
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: number
                    description: Standup unique id.
                  name:
                    type: string
                    description: Standup name.
                  time:
                    type: string
                    description: Time standup starts (HH:MM:SS).
                  wait_time:
                    type: number
                    description: Minutes to wait after login before asking (-1 = no automatic asking).
                  timezone:
                    type: string
                    description: Timezone used to calculate standup time.
                  days:
                    type: array
                    items:
                      type: string
                    description: Days when standup is active.
                  channel:
                    type: string
                    description: Channel where standup updates are posted.
                  questions:
                    type: array
                    items:
                      type: object
                      properties: {}
                    description: Standup questions.
                  users:
                    type: array
                    items:
                      type: object
                      properties: {}
                    description: Standup participants.
                  sync_channel_members:
                    type: boolean
                    description: Whether participants are synced from the channel.
      description: >-
        Replaces an existing standup configuration with the provided payload. All required fields must be included, and
        the authenticated user must have permission to edit the standup.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: number
          description: Standup unique id.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                channel:
                  type: string
                  description: Channel where the standup updates are posted.
                name:
                  type: string
                  description: Standup name.
                time:
                  type: string
                  description: Time to ask standup in HHMM format.
                timezone:
                  type: string
                  description: Timezone to use when calculating time to ask. If not specified, default is user local.
                wait_time:
                  type: number
                  description: >-
                    Minutes to wait after team member is online before asking a question. Set to null so that users do
                    not get asked at all automatically.
                days:
                  type: array
                  items:
                    type: string
                  description: An array of 3-letter words that define days to ask, example ['Mon', 'Wed', 'Fri']
                questions:
                  type: array
                  items:
                    type: object
                    properties: {}
                  description: >-
                    List of standup questions, an array of objects containing a "question" property. If ommited, 3
                    Geekbot recommended questions will be used.
                users:
                  type: array
                  items:
                    type: number
                  description: Array of user ids that will be included in the standup.
                sync_channel_members:
                  type: boolean
                  description: >-
                    Standup participants will be synced with channel members. If this is set to "false" you need to
                    provide the "users" parameter.
              required:
                - channel
                - name
                - time
                - timezone
                - wait_time
                - days
                - users
                - sync_channel_members
  /v1/standups/{id}/duplicate:
    post:
      tags:
        - Standup (legacy)
      summary: Duplicate standup
      operationId: DuplicateStandup
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: number
                    description: Standup unique id.
                  name:
                    type: string
                    description: Standup name.
                  time:
                    type: string
                    description: Time standup starts (HH:MM:SS).
                  wait_time:
                    type: number
                    description: Minutes to wait after login before asking (-1 = no automatic asking).
                  timezone:
                    type: string
                    description: Timezone used to calculate standup time.
                  days:
                    type: array
                    items:
                      type: string
                    description: Days when standup is active.
                  channel:
                    type: string
                    description: Channel where standup updates are posted.
                  questions:
                    type: array
                    items:
                      type: object
                      properties: {}
                    description: Standup questions.
                  users:
                    type: array
                    items:
                      type: object
                      properties: {}
                    description: Standup participants.
                  sync_channel_members:
                    type: boolean
                    description: Whether participants are synced from the channel.
      description: >-
        Creates a new standup by duplicating an existing one. Any fields provided in the request body override the
        copied configuration.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: Standup name (required).
                channel:
                  type: string
                  description: Channel where the standup updates are posted.
                time:
                  type: string
                  description: Time to ask standup in "HH:MM:SS" format.
                timezone:
                  type: string
                  description: Timezone to use when calculating time to ask. If not specified, default is user local.
                wait_time:
                  type: number
                  description: >-
                    Minutes to wait after team member is online before asking a question. Set to null so that users do
                    not get asked at all automatically.
                days:
                  type: array
                  items:
                    type: string
                  description: An array of 3-letter words that define days to ask, example ['Mon', 'Wed', 'Fri'].
                questions:
                  type: array
                  items:
                    type: object
                    properties: {}
                  description: >-
                    List of standup questions, an array of objects containing a "question" property. If ommited, 3
                    Geekbot recommended questions will be used.
                users:
                  type: array
                  items:
                    type: number
                  description: Array of user ids that will be included in the standup.
                sync_channel_members:
                  type: boolean
                  description: Standup participants will be synced with channel members..
                personalised:
                  type: boolean
                  description: Allow users to change their personal schedule for the standup
              required:
                - name
                - channel
                - time
                - timezone
                - days
                - users
                - sync_channel_members
                - personalised
  /v1/standups/{id}/start:
    post:
      tags:
        - Standup (legacy)
      summary: Start standup
      operationId: StartStandup
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: string
                description: Returns `"ok"` when standup jobs were queued.
                example: ok
      description: Starts a standup immediately. If `users` or `emails` are provided, the standup runs only for those participants.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: number
          description: Standup unique id.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                users:
                  type: array
                  items:
                    type: string
                  description: Array of user ids that will be included in the standup.
                emails:
                  type: array
                  items:
                    type: string
                  description: Array of user emails that will be included in the standup.
              required:
                - users
                - emails
  /v1/teams/:
    get:
      tags:
        - Team
      summary: List teams
      operationId: ListTeams
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: number
                    description: Team unique id.
                  name:
                    type: string
                    description: Team name.
                  users:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          description: User unique id.
                        role:
                          type: string
                          description: User role.
                        email:
                          type: string
                          description: User email.
                        username:
                          type: string
                          description: User username.
                        realname:
                          type: string
                          description: User real name.
                        profile_img:
                          type: string
                          description: User profile image URL.
                    description: Users participating in at least one standup visible to the authenticated user.
      description: Returns the team associated with the authenticated API key.
  /v2/polls:
    get:
      tags:
        - Poll
      summary: List polls
      operationId: ListV2Polls
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                          description: Poll id.
                        name:
                          type: string
                          description: Poll name.
                        state:
                          type: string
                          enum:
                            - active
                            - paused
                          description: Poll state.
                        time:
                          type: string
                          description: Time of day the poll triggers.
                        timezone:
                          type: string
                          description: Poll timezone.
                        days:
                          type: array
                          items:
                            type: string
                          description: Days the poll is active.
                        broadcast_channel:
                          type: object
                          properties:
                            id:
                              type: string
                              description: Channel id.
                            name:
                              type: string
                              description: Channel name.
                          description: Channel where the poll is posted. May be null.
                        is_anonymous:
                          type: boolean
                          description: Whether the poll is anonymous.
                        owner:
                          type: string
                          description: User id of the poll creator.
                        created:
                          type: string
                          description: ISO 8601 timestamp.
                        updated:
                          type: string
                          description: ISO 8601 timestamp.
                        members:
                          type: array
                          items:
                            type: object
                            properties:
                              id:
                                type: string
                                description: Member user id.
                              email:
                                type: string
                                description: Member email address. Returned only when `member_email` is in `include`.
                              username:
                                type: string
                                description: Member username. Returned only when `member_username` is in `include`.
                              realname:
                                type: string
                                description: Member display name. Returned only when `member_realname` is in `include`.
                          description: Members invited to the poll.
                        questions:
                          type: array
                          items:
                            type: object
                            properties:
                              id:
                                type: number
                                description: Question id.
                              text:
                                type: string
                                description: Question text shown to voters.
                              position:
                                type: number
                                description: Display order within the poll (0-indexed).
                              answer_type:
                                type: string
                                description: Answer type (e.g. multiple_choice, open_ended).
                              choices:
                                type: array
                                items:
                                  type: string
                                description: Answer choices (populated for multiple-choice questions; empty array otherwise).
                          description: Only present when include=questions.
                    description: List of polls.
                  next_cursor:
                    type: string
                    description: Cursor for the next page; null when has_more is false.
                  has_more:
                    type: boolean
                    description: Whether more pages exist.
        '400':
          description: '`INVALID_PARAMETER` — Validation failed (bad date, bad cursor, unknown include, etc.).'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: INVALID_PARAMETER
                      message:
                        type: string
      description: Returns active and paused polls created by the caller. Polls are only visible to their creator.
      parameters:
        - name: state
          in: query
          required: false
          schema:
            type: string
          description: 'Comma-separated subset of: active, paused. Default: both.'
        - name: is_anonymous
          in: query
          required: false
          schema:
            type: string
            enum:
              - 'true'
              - 'false'
          description: Filter by anonymity.
        - name: broadcast_channel
          in: query
          required: false
          schema:
            type: string
          description: Restrict to a specific channel id (e.g. "C12345").
        - name: created_since
          in: query
          required: false
          schema:
            type: string
          description: ISO 8601 or YYYY-MM-DD (inclusive).
        - name: created_until
          in: query
          required: false
          schema:
            type: string
          description: ISO 8601 or YYYY-MM-DD (exclusive).
        - name: cursor
          in: query
          required: false
          schema:
            type: string
          description: >-
            Opaque pagination cursor from a previous response. Must be replayed with the same filters that produced it;
            reusing it with different filters returns 400.
        - name: limit
          in: query
          required: false
          schema:
            type: number
            minimum: 1
            maximum: 100
            default: 25
          description: Page size.
        - name: include
          in: query
          required: false
          schema:
            type: string
            enum:
              - questions
              - member_username
              - member_realname
              - member_email
          description: >-
            Comma-separated extra fields to expand. The `member_*` values enrich each entry in `data.members` with the
            corresponding user field.
    post:
      tags:
        - Poll
      summary: Create poll
      operationId: CreateV2Poll
      responses:
        '201':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: number
                        description: Poll id.
                      name:
                        type: string
                        description: Poll name.
                      state:
                        type: string
                        enum:
                          - active
                          - paused
                        description: Poll state.
                      time:
                        type: string
                        description: Time of day the poll triggers.
                      timezone:
                        type: string
                        description: Poll timezone.
                      days:
                        type: array
                        items:
                          type: string
                        description: Days the poll is active.
                      broadcast_channel:
                        type: object
                        properties:
                          id:
                            type: string
                            description: Channel id.
                          name:
                            type: string
                            description: Channel name.
                        description: Channel where the poll is posted. May be null.
                      is_anonymous:
                        type: boolean
                        description: Whether the poll is anonymous.
                      owner:
                        type: string
                        description: User id of the poll creator.
                      created:
                        type: string
                        description: ISO 8601 timestamp.
                      updated:
                        type: string
                        description: ISO 8601 timestamp.
                      members:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: string
                              description: Member user id.
                            email:
                              type: string
                              description: Member email address. Returned only when `member_email` is in `include`.
                            username:
                              type: string
                              description: Member username. Returned only when `member_username` is in `include`.
                            realname:
                              type: string
                              description: Member display name. Returned only when `member_realname` is in `include`.
                        description: Members invited to the poll.
        '400':
          description: |-
            `INVALID_PARAMETER` — Validation failed (missing/invalid body field, or malformed Idempotency-Key).

            `CHANNEL_NOT_FOUND` — `broadcast_channel` could not be resolved.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: INVALID_PARAMETER
                      message:
                        type: string
        '422':
          description: '`MISMATCHED_IDEMPOTENCY_BODY` — Idempotency-Key reused with a different request body.'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: MISMATCHED_IDEMPOTENCY_BODY
                      message:
                        type: string
      description: >-
        Creates a one-shot poll that posts to `broadcast_channel` on publish. Members are auto-synced from the broadcast
        channel.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: Poll name.
                question:
                  type: string
                  description: Poll question text.
                choices:
                  type: array
                  items:
                    type: string
                  description: Answer choices (at least 2).
                broadcast_channel:
                  type: string
                  description: Channel id or name where the poll is posted.
                duration:
                  type: number
                  description: Duration the poll stays open, in minutes.
              required:
                - name
                - question
                - choices
                - broadcast_channel
  /v2/polls/{pollId}:
    get:
      tags:
        - Poll
      summary: Get poll
      operationId: GetV2Poll
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: number
                        description: Poll id.
                      name:
                        type: string
                        description: Poll name.
                      state:
                        type: string
                        enum:
                          - active
                          - paused
                        description: Poll state.
                      time:
                        type: string
                        description: Time of day the poll triggers.
                      timezone:
                        type: string
                        description: Poll timezone.
                      days:
                        type: array
                        items:
                          type: string
                        description: Days the poll is active.
                      broadcast_channel:
                        type: object
                        properties:
                          id:
                            type: string
                            description: Channel id.
                          name:
                            type: string
                            description: Channel name.
                        description: Channel where the poll is posted. May be null.
                      is_anonymous:
                        type: boolean
                        description: Whether the poll is anonymous.
                      owner:
                        type: string
                        description: User id of the poll creator.
                      created:
                        type: string
                        description: ISO 8601 timestamp.
                      updated:
                        type: string
                        description: ISO 8601 timestamp.
                      members:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: string
                              description: Member user id.
                            email:
                              type: string
                              description: Member email address. Returned only when `member_email` is in `include`.
                            username:
                              type: string
                              description: Member username. Returned only when `member_username` is in `include`.
                            realname:
                              type: string
                              description: Member display name. Returned only when `member_realname` is in `include`.
                        description: Members invited to the poll.
                      questions:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: number
                              description: Question id.
                            text:
                              type: string
                              description: Question text shown to voters.
                            position:
                              type: number
                              description: Display order within the poll (0-indexed).
                            answer_type:
                              type: string
                              description: Answer type (e.g. multiple_choice, open_ended).
                            choices:
                              type: array
                              items:
                                type: string
                              description: Answer choices (populated for multiple-choice questions; empty array otherwise).
                        description: Only present when include=questions.
        '404':
          description: '`NOT_FOUND` — The poll does not exist or is not visible to the caller.'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: NOT_FOUND
                      message:
                        type: string
      description: >-
        Returns one poll the caller created (active or paused). Returns 404 for any non-visible poll — including polls
        owned by other users or in archived/draft state — to avoid leaking existence.
      parameters:
        - name: pollId
          in: path
          required: true
          schema:
            type: number
          description: Poll id.
        - name: include
          in: query
          required: false
          schema:
            type: string
            enum:
              - questions
              - member_username
              - member_realname
              - member_email
          description: >-
            Comma-separated extra fields to expand. The `member_*` values enrich each entry in `data.members` with the
            corresponding user field.
  /v2/polls/{pollId}/votes:
    get:
      tags:
        - Poll
      summary: Get poll votes
      operationId: GetV2PollVotes
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      poll_id:
                        type: number
                        description: Poll id.
                      poll_name:
                        type: string
                        description: Poll name.
                      is_anonymous:
                        type: boolean
                        description: Whether the poll is anonymous.
                      instances:
                        type: array
                        items:
                          type: object
                          properties:
                            instance_id:
                              type: number
                              description: Poll instance id.
                            date:
                              type: string
                              description: Broadcast date (YYYY-MM-DD).
                            questions:
                              type: array
                              items:
                                type: object
                                properties:
                                  question_id:
                                    type: number
                                    description: Question id.
                                  text:
                                    type: string
                                    description: Question text.
                                  answer_type:
                                    type: string
                                    enum:
                                      - multiple_choice
                                      - open_ended
                                    description: Answer type.
                                  total_responses:
                                    type: number
                                    description: Total answers submitted.
                                  total_responders:
                                    type: number
                                    description: Distinct responders.
                                  choices:
                                    type: array
                                    items:
                                      type: object
                                      properties:
                                        text:
                                          type: string
                                          description: Choice label.
                                        votes:
                                          type: number
                                          description: Vote count for this choice.
                                        voters:
                                          type: array
                                          items:
                                            type: string
                                          description: Voter user ids. Null when is_anonymous.
                                    description: 'Multi-choice only: per-choice vote counts.'
                                  categorization_status:
                                    type: string
                                    description: 'Open-ended only: pending|processing|completed|failed|null.'
                                  categories:
                                    type: array
                                    items:
                                      type: object
                                      properties:
                                        name:
                                          type: string
                                          description: Category name.
                                        count:
                                          type: number
                                          description: >-
                                            Number of answers in this category (may sum to more than total_responses for
                                            multi-label).
                                    description: 'Open-ended only: counts per assigned category (when status=completed).'
                                  responses:
                                    type: array
                                    items:
                                      type: object
                                      properties:
                                        text:
                                          type: string
                                          description: Response text.
                                        categories:
                                          type: array
                                          items:
                                            type: string
                                          description: Categories assigned to this response (when status=completed).
                                        user_id:
                                          type: string
                                          description: Responder user id. Null when is_anonymous.
                                    description: 'Open-ended only: raw responses with category labels.'
                              description: Aggregated per-question results.
                        description: Instances in scope (latest only by default).
                    description: Poll-results object.
        '400':
          description: '`INVALID_PARAMETER` — Validation failed (bad date, reversed range, etc.).'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: INVALID_PARAMETER
                      message:
                        type: string
        '404':
          description: '`NOT_FOUND` — The poll does not exist or is not visible to the caller.'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: NOT_FOUND
                      message:
                        type: string
      description: >-
        Returns aggregated vote results for the poll. Without time filters, returns only the latest broadcast instance.
        With since/until, returns every instance whose broadcast date falls in the range.
      parameters:
        - name: pollId
          in: path
          required: true
          schema:
            type: number
          description: Poll id.
        - name: since
          in: query
          required: false
          schema:
            type: string
          description: ISO 8601 or YYYY-MM-DD (inclusive).
        - name: until
          in: query
          required: false
          schema:
            type: string
          description: ISO 8601 or YYYY-MM-DD (exclusive). Defaults to now.
  /v2/reports:
    get:
      tags:
        - Report
      summary: List reports
      operationId: ListV2Reports
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                          description: Report id.
                        standup_id:
                          type: number
                          description: Standup id the report belongs to.
                        standup_name:
                          type: string
                          description: Standup name.
                        user_id:
                          type: string
                          description: >-
                            User id of the report author. Null when the report is anonymous (standup or report-level
                            flag).
                        posted_at:
                          type: string
                          description: ISO 8601 timestamp when the report was submitted.
                        is_anonymous:
                          type: boolean
                          description: >-
                            Whether this report is anonymous (true if either the standup or the report itself was
                            anonymous at submission).
                        is_confidential:
                          type: boolean
                          description: Whether the standup is confidential.
                        answers:
                          type: array
                          items:
                            type: object
                            properties:
                              id:
                                type: number
                                description: Answer id.
                              question_id:
                                type: number
                                description: Question id the answer belongs to.
                              question:
                                type: string
                                description: Question text shown to the user.
                              answer:
                                type: string
                                description: Plain-text answer.
                          description: Per-question answers.
                    description: List of reports.
                  next_cursor:
                    type: string
                    description: Cursor for the next page; null when has_more is false.
                  has_more:
                    type: boolean
                    description: Whether more pages exist.
        '400':
          description: >-
            `INVALID_PARAMETER` — Validation failed (invalid date, range over 90 days, reversed range, bad cursor,
            etc.).
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: INVALID_PARAMETER
                      message:
                        type: string
      description: >-
        Returns submitted reports from active standups the caller can see. Time window defaults to the last 7 days when
        neither `since` nor `until` is provided. The window cannot exceed 90 days — wider ranges return 400.
      parameters:
        - name: since
          in: query
          required: false
          schema:
            type: string
          description: 'ISO 8601 or YYYY-MM-DD (inclusive). Default: now - 7 days.'
        - name: until
          in: query
          required: false
          schema:
            type: string
          description: 'ISO 8601 or YYYY-MM-DD (exclusive). Default: now.'
        - name: standup_id
          in: query
          required: false
          schema:
            type: number
          description: Restrict to a single standup.
        - name: user_id
          in: query
          required: false
          schema:
            type: string
          description: >-
            Restrict to a single user (Slack-style id, e.g. "U123"). When filtering by another user's id, reports from
            anonymous standups are excluded.
        - name: cursor
          in: query
          required: false
          schema:
            type: string
          description: >-
            Opaque pagination cursor from a previous response. Must be replayed with the same
            since/until/standup_id/user_id that produced it; reusing it with different filters returns 400.
        - name: limit
          in: query
          required: false
          schema:
            type: number
            minimum: 1
            maximum: 100
            default: 25
          description: Page size.
        - name: view
          in: query
          required: false
          schema:
            type: string
            enum:
              - summary
              - full
            default: full
          description: Response shape. Summary omits the answers block.
    post:
      tags:
        - Report
      summary: Create report
      operationId: CreateV2Report
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: number
                        description: Report id.
                      standup_id:
                        type: number
                        description: Standup id the report belongs to.
                      standup_name:
                        type: string
                        description: Standup name.
                      user_id:
                        type: string
                        description: >-
                          User id of the report author. Null when the report is anonymous (standup or report-level
                          flag).
                      posted_at:
                        type: string
                        description: ISO 8601 timestamp when the report was submitted.
                      is_anonymous:
                        type: boolean
                        description: >-
                          Whether this report is anonymous (true if either the standup or the report itself was
                          anonymous at submission).
                      is_confidential:
                        type: boolean
                        description: Whether the standup is confidential.
                      answers:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: number
                              description: Answer id.
                            question_id:
                              type: number
                              description: Question id the answer belongs to.
                            question:
                              type: string
                              description: Question text shown to the user.
                            answer:
                              type: string
                              description: Plain-text answer.
                        description: Per-question answers.
        '400':
          description: >-
            `INVALID_PARAMETER` — Missing/invalid field, wrong answer count, unknown question_id, or malformed
            Idempotency-Key.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: INVALID_PARAMETER
                      message:
                        type: string
        '404':
          description: '`NOT_FOUND` — The standup does not exist, is paused, is a poll, or the caller is not a member.'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: NOT_FOUND
                      message:
                        type: string
        '422':
          description: '`MISMATCHED_IDEMPOTENCY_BODY` — Idempotency-Key reused with a different request body.'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: MISMATCHED_IDEMPOTENCY_BODY
                      message:
                        type: string
      description: >-
        Submits a report for one of the caller's active standups. All standup questions must be answered in a single
        call. Broadcasts the report to the standup's channel on success.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                standup_id:
                  type: number
                  description: Standup id.
                answers:
                  type: array
                  items:
                    type: object
                    properties: {}
                  description: One entry per standup question.
                answers.question_id:
                  type: number
                  description: Question id (must belong to the standup).
                answers.text:
                  type: string
                  description: Plain-text answer.
              required:
                - standup_id
                - answers
                - answers.question_id
                - answers.text
  /v2/reports/{reportId}:
    get:
      tags:
        - Report
      summary: Get report
      operationId: GetV2Report
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: number
                        description: Report id.
                      standup_id:
                        type: number
                        description: Standup id the report belongs to.
                      standup_name:
                        type: string
                        description: Standup name.
                      user_id:
                        type: string
                        description: >-
                          User id of the report author. Null when the report is anonymous (standup or report-level
                          flag).
                      posted_at:
                        type: string
                        description: ISO 8601 timestamp when the report was submitted.
                      is_anonymous:
                        type: boolean
                        description: >-
                          Whether this report is anonymous (true if either the standup or the report itself was
                          anonymous at submission).
                      is_confidential:
                        type: boolean
                        description: Whether the standup is confidential.
                      answers:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: number
                              description: Answer id.
                            question_id:
                              type: number
                              description: Question id the answer belongs to.
                            question:
                              type: string
                              description: Question text shown to the user.
                            answer:
                              type: string
                              description: Plain-text answer.
                        description: Per-question answers.
        '404':
          description: '`NOT_FOUND` — The report does not exist or is not visible to the caller.'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: NOT_FOUND
                      message:
                        type: string
      description: >-
        Returns one submitted report from a standup the caller can see. Returns 404 for any non-visible report —
        including pending reports, reports from paused or confidential standups not owned by the caller, or other teams
        — to avoid leaking existence.
      parameters:
        - name: reportId
          in: path
          required: true
          schema:
            type: number
          description: Report id.
    patch:
      tags:
        - Report
      summary: Update report
      operationId: EditV2Report
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: number
                        description: Report id.
                      standup_id:
                        type: number
                        description: Standup id the report belongs to.
                      standup_name:
                        type: string
                        description: Standup name.
                      user_id:
                        type: string
                        description: >-
                          User id of the report author. Null when the report is anonymous (standup or report-level
                          flag).
                      posted_at:
                        type: string
                        description: ISO 8601 timestamp when the report was submitted.
                      is_anonymous:
                        type: boolean
                        description: >-
                          Whether this report is anonymous (true if either the standup or the report itself was
                          anonymous at submission).
                      is_confidential:
                        type: boolean
                        description: Whether the standup is confidential.
                      answers:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: number
                              description: Answer id.
                            question_id:
                              type: number
                              description: Question id the answer belongs to.
                            question:
                              type: string
                              description: Question text shown to the user.
                            answer:
                              type: string
                              description: Plain-text answer.
                        description: Per-question answers.
        '400':
          description: '`INVALID_PARAMETER` — Missing/invalid field or unknown question_id.'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: INVALID_PARAMETER
                      message:
                        type: string
        '404':
          description: '`NOT_FOUND` — The report does not exist or the caller is not the author.'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: NOT_FOUND
                      message:
                        type: string
      description: >-
        Updates one or more answers on a report the caller owns. Partial updates are allowed — only the supplied answers
        are changed. If the report was broadcasted, the broadcast message is updated.
      parameters:
        - name: reportId
          in: path
          required: true
          schema:
            type: number
          description: Report id.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                answers:
                  type: array
                  items:
                    type: object
                    properties: {}
                  description: One or more answers to update.
                answers.question_id:
                  type: number
                  description: Question id (must belong to the report's standup).
                answers.text:
                  type: string
                  description: New plain-text answer.
              required:
                - answers
                - answers.question_id
                - answers.text
    delete:
      tags:
        - Report
      summary: Delete report
      operationId: DeleteV2Report
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    description: Always true on success.
        '404':
          description: '`NOT_FOUND` — The report does not exist or the caller is not the author.'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: NOT_FOUND
                      message:
                        type: string
      description: >-
        Discards a report the caller owns. Removes the broadcast message if one was posted. Listings exclude the report,
        but its history is retained.
      parameters:
        - name: reportId
          in: path
          required: true
          schema:
            type: number
          description: Report id.
  /v2/standups:
    get:
      tags:
        - Standup
      summary: List standups
      operationId: ListV2Standups
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                          description: Standup id.
                        name:
                          type: string
                          description: Standup name.
                        state:
                          type: string
                          enum:
                            - active
                            - paused
                          description: Standup state.
                        time:
                          type: string
                          description: Time of day the standup runs.
                        wait_time:
                          type: number
                          description: Minutes to wait after login before asking. May be null.
                        timezone:
                          type: string
                          description: Standup timezone.
                        days:
                          type: array
                          items:
                            type: string
                          description: Days the standup is active.
                        broadcast_channel:
                          type: object
                          properties:
                            id:
                              type: string
                              description: Channel id.
                            name:
                              type: string
                              description: Channel name.
                          description: Channel where updates are posted. May be null.
                        is_anonymous:
                          type: boolean
                          description: Whether the standup is anonymous.
                        is_confidential:
                          type: boolean
                          description: Whether the standup is confidential.
                        owner:
                          type: string
                          description: User id of the standup creator.
                        created:
                          type: string
                          description: ISO 8601 timestamp.
                        updated:
                          type: string
                          description: ISO 8601 timestamp.
                        members:
                          type: array
                          items:
                            type: object
                            properties:
                              id:
                                type: string
                                description: Member user id.
                              email:
                                type: string
                                description: Member email address. Returned only when `member_email` is in `include`.
                              username:
                                type: string
                                description: Member username. Returned only when `member_username` is in `include`.
                              realname:
                                type: string
                                description: Member display name. Returned only when `member_realname` is in `include`.
                          description: Members participating in the standup.
                        questions:
                          type: array
                          items:
                            type: object
                            properties:
                              id:
                                type: number
                                description: Question id.
                              text:
                                type: string
                                description: Question text shown to members.
                              position:
                                type: number
                                description: Display order within the standup (0-indexed).
                              answer_type:
                                type: string
                                description: Answer type (e.g. text, multiple_choice).
                              choices:
                                type: array
                                items:
                                  type: string
                                description: Answer choices (populated for multiple-choice questions; empty array otherwise).
                          description: Only present when include=questions.
                    description: List of standups.
                  next_cursor:
                    type: string
                    description: Cursor for the next page; null when has_more is false.
                  has_more:
                    type: boolean
                    description: Whether more pages exist.
        '400':
          description: '`INVALID_PARAMETER` — Validation failed (bad date, bad cursor, unknown include, etc.).'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: INVALID_PARAMETER
                      message:
                        type: string
      description: >-
        Returns active and paused standups visible to the caller. A standup is visible when the caller is a member of it
        (for non-confidential standups) or its creator (for confidential standups). Polls are excluded.
      parameters:
        - name: state
          in: query
          required: false
          schema:
            type: string
          description: 'Comma-separated subset of: active, paused. Default: both.'
        - name: is_anonymous
          in: query
          required: false
          schema:
            type: string
            enum:
              - 'true'
              - 'false'
          description: Filter by anonymity.
        - name: broadcast_channel
          in: query
          required: false
          schema:
            type: string
          description: Restrict to a specific channel id (e.g. "C12345").
        - name: created_since
          in: query
          required: false
          schema:
            type: string
          description: ISO 8601 or YYYY-MM-DD (inclusive).
        - name: created_until
          in: query
          required: false
          schema:
            type: string
          description: ISO 8601 or YYYY-MM-DD (exclusive).
        - name: cursor
          in: query
          required: false
          schema:
            type: string
          description: >-
            Opaque pagination cursor from a previous response. Must be replayed with the same filters that produced it;
            reusing it with different filters returns 400.
        - name: limit
          in: query
          required: false
          schema:
            type: number
            minimum: 1
            maximum: 100
            default: 25
          description: Page size.
        - name: include
          in: query
          required: false
          schema:
            type: string
            enum:
              - questions
              - member_username
              - member_realname
              - member_email
          description: >-
            Comma-separated extra fields to expand. The `member_*` values enrich each entry in `data.members` with the
            corresponding user field.
    post:
      tags:
        - Standup
      summary: Create standup
      operationId: CreateV2Standup
      responses:
        '201':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: number
                        description: Standup id.
                      name:
                        type: string
                        description: Standup name.
                      state:
                        type: string
                        enum:
                          - active
                          - paused
                        description: Standup state.
                      time:
                        type: string
                        description: Time of day the standup runs.
                      wait_time:
                        type: number
                        description: Minutes to wait after login before asking. May be null.
                      timezone:
                        type: string
                        description: Standup timezone.
                      days:
                        type: array
                        items:
                          type: string
                        description: Days the standup is active.
                      broadcast_channel:
                        type: object
                        properties:
                          id:
                            type: string
                            description: Channel id.
                          name:
                            type: string
                            description: Channel name.
                        description: Channel where updates are posted. May be null.
                      is_anonymous:
                        type: boolean
                        description: Whether the standup is anonymous.
                      is_confidential:
                        type: boolean
                        description: Whether the standup is confidential.
                      owner:
                        type: string
                        description: User id of the standup creator.
                      created:
                        type: string
                        description: ISO 8601 timestamp.
                      updated:
                        type: string
                        description: ISO 8601 timestamp.
                      members:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: string
                              description: Member user id.
                            email:
                              type: string
                              description: Member email address. Returned only when `member_email` is in `include`.
                            username:
                              type: string
                              description: Member username. Returned only when `member_username` is in `include`.
                            realname:
                              type: string
                              description: Member display name. Returned only when `member_realname` is in `include`.
                        description: Members participating in the standup.
        '400':
          description: |-
            `INVALID_PARAMETER` — Validation failed (missing/invalid body field, or malformed Idempotency-Key).

            `CHANNEL_NOT_FOUND` — `broadcast_channel` or `sync_channel` could not be resolved.

            `USER_NOT_FOUND` — One or more ids in `users` are not known to the team.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: INVALID_PARAMETER
                      message:
                        type: string
        '422':
          description: '`MISMATCHED_IDEMPOTENCY_BODY` — Idempotency-Key reused with a different request body.'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: MISMATCHED_IDEMPOTENCY_BODY
                      message:
                        type: string
      description: >-
        Creates a non-confidential standup. Members are taken from `users` if provided; otherwise synced from
        `sync_channel` (falling back to `broadcast_channel`).
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Standup name. Defaults to "Standup #<broadcast channel>".'
                questions:
                  type: array
                  items:
                    type: object
                    properties: {}
                  description: >-
                    List of questions. Each item: { "text": String, "choices"?: String[] }. When `choices` is present
                    the question is multiple-choice.
                days:
                  type: array
                  items:
                    type: string
                  description: Workdays (e.g. ["Mon","Tue","Wed","Thu","Fri"]).
                time:
                  type: string
                  description: Time of day, "HH:MM" (or "HH:MM:SS").
                broadcast_channel:
                  type: string
                  description: Channel id or name where reports are posted.
                sync_channel:
                  type: string
                  description: Channel id or name to sync members from.
                users:
                  type: array
                  items:
                    type: string
                  description: Explicit list of user ids; mutually exclusive with `sync_channel` semantics.
                timezone:
                  type: string
                  description: Timezone used to compute the ask time.
                is_anonymous:
                  type: boolean
                  description: Whether responses are anonymous.
              required:
                - questions
                - days
                - time
                - broadcast_channel
  /v2/standups/{standupId}:
    get:
      tags:
        - Standup
      summary: Get standup
      operationId: GetV2Standup
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      id:
                        type: number
                        description: Standup id.
                      name:
                        type: string
                        description: Standup name.
                      state:
                        type: string
                        enum:
                          - active
                          - paused
                        description: Standup state.
                      time:
                        type: string
                        description: Time of day the standup runs.
                      wait_time:
                        type: number
                        description: Minutes to wait after login before asking. May be null.
                      timezone:
                        type: string
                        description: Standup timezone.
                      days:
                        type: array
                        items:
                          type: string
                        description: Days the standup is active.
                      broadcast_channel:
                        type: object
                        properties:
                          id:
                            type: string
                            description: Channel id.
                          name:
                            type: string
                            description: Channel name.
                        description: Channel where updates are posted. May be null.
                      is_anonymous:
                        type: boolean
                        description: Whether the standup is anonymous.
                      is_confidential:
                        type: boolean
                        description: Whether the standup is confidential.
                      owner:
                        type: string
                        description: User id of the standup creator.
                      created:
                        type: string
                        description: ISO 8601 timestamp.
                      updated:
                        type: string
                        description: ISO 8601 timestamp.
                      members:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: string
                              description: Member user id.
                            email:
                              type: string
                              description: Member email address. Returned only when `member_email` is in `include`.
                            username:
                              type: string
                              description: Member username. Returned only when `member_username` is in `include`.
                            realname:
                              type: string
                              description: Member display name. Returned only when `member_realname` is in `include`.
                        description: Members participating in the standup.
                      questions:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: number
                              description: Question id.
                            text:
                              type: string
                              description: Question text shown to members.
                            position:
                              type: number
                              description: Display order within the standup (0-indexed).
                            answer_type:
                              type: string
                              description: Answer type (e.g. text, multiple_choice).
                            choices:
                              type: array
                              items:
                                type: string
                              description: Answer choices (populated for multiple-choice questions; empty array otherwise).
                        description: Only present when include=questions.
        '404':
          description: '`NOT_FOUND` — The standup does not exist or is not visible to the caller.'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        example: NOT_FOUND
                      message:
                        type: string
      description: >-
        Returns one standup the caller can see (active or paused). Returns 404 for any non-visible standup — including
        draft/archived states, polls, other team, or confidential standups not owned by the caller — to avoid leaking
        existence.
      parameters:
        - name: standupId
          in: path
          required: true
          schema:
            type: number
          description: Standup id.
        - name: include
          in: query
          required: false
          schema:
            type: string
            enum:
              - questions
              - member_username
              - member_realname
              - member_email
          description: >-
            Comma-separated extra fields to expand. The `member_*` values enrich each entry in `data.members` with the
            corresponding user field.
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: API key for Geekbot public API.
security:
  - ApiKeyAuth: []
x-tagGroups:
  - name: Current
    tags:
      - User
      - Team
      - Poll
      - Report
      - Standup
  - name: Legacy
    tags:
      - Poll (legacy)
      - Report (legacy)
      - Standup (legacy)
