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

# Check a user vote

> Answers whether a user is inside their current 12-hour vote window. This is the endpoint that makes vote-for-perks possible, so its limit is the highest on the API: 600 requests per minute per token.

`voted` is 0 or 1 because that is what bot code written against other lists expects; `hasVoted` is the readable alias for new code. `nextVoteAt` lets the bot tell the user when to come back without recomputing the cooldown.



## OpenAPI

````yaml /openapi.json get /api/v1/bots/{id}/check
openapi: 3.1.0
info:
  title: Discord Bot List API
  version: 1.0.0
  description: >-
    Everything under /api/v1 acts on one listing: the token identifies the bot,
    and the id in the path has to be that same bot. A mismatch answers 404
    rather than 403, so a token cannot be used to discover which other bots
    exist.
  contact:
    name: Support
    url: https://discordbotlist.lol/contact
  license:
    name: Terms of Service
    url: https://discordbotlist.lol/terms
servers:
  - url: https://discordbotlist.lol
    description: Production
security:
  - botToken: []
paths:
  /api/v1/bots/{id}/check:
    get:
      tags:
        - Votes
      summary: Check a user vote
      description: >-
        Answers whether a user is inside their current 12-hour vote window. This
        is the endpoint that makes vote-for-perks possible, so its limit is the
        highest on the API: 600 requests per minute per token.


        `voted` is 0 or 1 because that is what bot code written against other
        lists expects; `hasVoted` is the readable alias for new code.
        `nextVoteAt` lets the bot tell the user when to come back without
        recomputing the cooldown.
      operationId: checkVote
      parameters:
        - $ref: '#/components/parameters/botId'
        - name: userId
          in: query
          required: true
          description: The Discord user id to look up.
          schema:
            type: string
            pattern: ^\d{17,20}$
          example: '336878018143223809'
      responses:
        '200':
          description: The user's vote state for this bot.
          content:
            application/json:
              schema:
                type: object
                properties:
                  voted:
                    type: integer
                    enum:
                      - 0
                      - 1
                  hasVoted:
                    type: boolean
                  votedAt:
                    type:
                      - string
                      - 'null'
                    format: date-time
                  nextVoteAt:
                    type:
                      - string
                      - 'null'
                    format: date-time
                    description: >-
                      12 hours after the vote. Null when the user has not voted
                      inside the window.
              example:
                voted: 1
                hasVoted: true
                votedAt: '2026-09-12T08:15:00.000Z'
                nextVoteAt: '2026-09-12T20:15:00.000Z'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  parameters:
    botId:
      name: id
      in: path
      required: true
      description: >-
        The bot's Discord application id. It has to be the bot the token belongs
        to.
      schema:
        type: string
        pattern: ^\d{17,19}$
      example: '1092194789458481202'
  responses:
    BadRequest:
      description: The body or a query parameter is malformed.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Invalid JSON body.
    Unauthorized:
      description: Missing, malformed or unknown token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Invalid token.
    NotFound:
      description: No such bot, or the token belongs to a different one.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Bot not found.
    RateLimited:
      description: Rate limit exceeded.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Rate limit exceeded.
            retryAfter: 42
  schemas:
    Error:
      type: object
      properties:
        error:
          type: string
          description: One sentence, safe to show a developer.
        retryAfter:
          type: integer
          description: Seconds until the limit resets. Only on 429.
      required:
        - error
  securitySchemes:
    botToken:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        The bot's API token, generated on its edit page. Sent bare or as `Bearer
        <token>` -- both are accepted, because the libraries already posting to
        other lists send both. The token is shown once; generating a new one
        invalidates the old.

````