> ## Documentation Index
> Fetch the complete documentation index at: https://apidocs.neetoengage.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Add a voter to a feature request

> Records a customer's vote on a feature request and attaches a private note for your team. If the customer has already voted, no second vote is added and `already_voted` is `true`. The note is added on every call. When `customer` is left out, only the note is added.

Send an `operation_key` to make the call safe to retry. See [Idempotency](/api/idempotency).

<Info>Replace `{your-subdomain}` with your workspace's subdomain. <br /> Learn how to find your subdomain in [Workspace subdomain](/api/workspace-subdomain).</Info>


## OpenAPI

````yaml bundled/feature-requests.yaml POST /feature_requests/{id}/upvotes
openapi: 3.0.3
info:
  title: NeetoEngage Feature Requests APIs
  version: 1.0.0
servers:
  - description: NeetoEngage APIs
    url: https://{your-subdomain}.neetoengage.com/api/external/v1
    variables:
      your-subdomain:
        default: spinkart
        description: >-
          Replace **spinkart** with your [workspace's
          subdomain](/api/workspace-subdomain).
security: []
tags:
  - name: Feature requests
    description: APIs to search, file and follow up on feature requests.
paths:
  /feature_requests/{id}/upvotes:
    post:
      tags:
        - Feature requests
      summary: Add a voter to a feature request
      description: >-
        Records a customer's vote on a feature request and attaches a private
        note for your team. If the customer has already voted, no second vote is
        added and `already_voted` is `true`. The note is added on every call.
        When `customer` is left out, only the note is added.


        Send an `operation_key` to make the call safe to retry. See
        [Idempotency](/api/idempotency).
      operationId: addVoter
      parameters:
        - $ref: '#/components/parameters/api_key_header'
        - $ref: '#/components/parameters/accept_header'
        - $ref: '#/components/parameters/feature_request_id_param'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - reference_note
              properties:
                customer:
                  $ref: '#/components/schemas/customer'
                reference_note:
                  $ref: '#/components/schemas/reference_note'
                operation_key:
                  type: string
                  description: Retry token. See [Idempotency](/api/idempotency).
                  example: support-ticket-4822-vote
      responses:
        '200':
          description: >-
            The call succeeded. Check `vote_registered` and `already_voted` for
            the outcome.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/upvote_response'
              example:
                feature_request:
                  id: 5f0f3c2e-8d1b-4c53-9a6e-2b7d41c9e8a1
                  title: Export roadmap as CSV
                  url: >-
                    https://spinkart.neetoengage.com/feature-requests/120-export-roadmap-as-csv
                  admin_url: >-
                    https://spinkart.neetoengage.com/admin/feature-requests/120-export-roadmap-as-csv
                  status: Under consideration
                  track: Backlog
                  votes_count: 15
                  created_at: '2026-03-02T10:15:30Z'
                vote_registered: true
                already_voted: false
        '401':
          $ref: '#/components/responses/unauthorized'
        '404':
          $ref: '#/components/responses/feature_request_not_found'
components:
  parameters:
    api_key_header:
      in: header
      name: X-Api-Key
      description: >-
        API key. Refer to [Authentication](/api/authentication) for more
        information.
      required: true
      schema:
        type: string
    accept_header:
      in: header
      name: Accept
      description: Must be `application/json`.
      required: true
      schema:
        type: string
        enum:
          - application/json
        default: application/json
    feature_request_id_param:
      in: path
      name: id
      required: true
      description: >-
        The feature request's `id` (UUID) or its `slug`. The slug is the last
        segment of the feature request's admin URL, for example
        `120-export-roadmap-as-csv`. Both are accepted.
      schema:
        type: string
      example: 5f0f3c2e-8d1b-4c53-9a6e-2b7d41c9e8a1
  schemas:
    customer:
      type: object
      description: >-
        The customer who asked for the feature. The customer is found by email,
        or created if they do not exist, and is recorded as a voter.
      properties:
        email:
          type: string
          format: email
          description: Email address of the customer. Matched case-insensitively.
          example: sam@example.com
        name:
          type: string
          description: Full name of the customer. Used only when the customer is created.
          example: Sam Smith
    reference_note:
      type: object
      description: A private note for the team. Customers never see it.
      required:
        - body
      properties:
        body:
          type: string
          description: Body of the note. HTML is accepted.
          example: <p>Raised on a support call. See conversation 4821.</p>
        author_email:
          type: string
          format: email
          description: >-
            Email of the team member the note is attributed to. If it does not
            match a team member, the note is attributed to the workspace's
            oldest team member.
          example: oliver@example.com
    upvote_response:
      type: object
      properties:
        feature_request:
          $ref: '#/components/schemas/feature_request'
        vote_registered:
          type: boolean
          description: '`true` when this call added a new vote.'
          example: true
        already_voted:
          type: boolean
          description: '`true` when the customer had already voted, so no vote was added.'
          example: false
    feature_request:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Unique identifier of the feature request.
          example: 5f0f3c2e-8d1b-4c53-9a6e-2b7d41c9e8a1
        title:
          type: string
          description: Title of the feature request. Public on the roadmap.
          example: Export roadmap as CSV
        url:
          type: string
          description: Public URL of the feature request on the roadmap.
          example: >-
            https://spinkart.neetoengage.com/feature-requests/120-export-roadmap-as-csv
        admin_url:
          type: string
          description: URL of the feature request in the NeetoEngage admin panel.
          example: >-
            https://spinkart.neetoengage.com/admin/feature-requests/120-export-roadmap-as-csv
        status:
          type: string
          nullable: true
          description: >-
            Name of the public roadmap lane the feature request is shown in.
            `null` when the feature request's track does not map to a public
            lane.
          example: Under consideration
        track:
          type: string
          nullable: true
          description: Name of the track the feature request is on.
          example: Backlog
        votes_count:
          type: integer
          description: Number of votes on the feature request.
          example: 1
        created_at:
          type: string
          format: date-time
          description: Time the feature request was created.
          example: '2026-03-02T10:15:30Z'
    error:
      type: object
      properties:
        error:
          type: string
          description: A human readable error message.
  responses:
    unauthorized:
      description: The API key is missing, invalid, or expired.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
          example:
            error: Could not authenticate, invalid API Key
    feature_request_not_found:
      description: No feature request in this workspace matches the given `id` or `slug`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/error'
          example:
            error: FeatureRequest does not exist.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.