> ## Documentation Index
> Fetch the complete documentation index at: https://dev-doc.dualmindlab.tech/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> These are the DualMind developer and admin docs. The API base URL is https://api.dualmindlab.tech and the local API runs on http://localhost:5079.
> Never send POST, PUT, PATCH or DELETE requests to the production API while developing; use a local API and a development Supabase project.
> Environment variables are documented by name only. Never ask for or print secret values.
> Admin routes under /api/admin require a Supabase access token for a user whose public.users.role is admin. The PUT routes for users, models, providers and threads write every field, so send the full record; PUT /api/admin/keys/{keyId} writes only the fields you send (sending api_key replaces the key).

# Get vote statistics

> Totals, ties, wins per model, votes per day over the last 30 days and the top 10 models by wins. It runs one count per model, so it is slower than the other admin reads.

<Badge color="purple" icon="shield-check" stroke>AdminOnly</Badge> <Badge color="surface" icon="key-round">Bearer token, role admin</Badge>


## OpenAPI

````yaml api-reference/openapi-admin.json GET /api/admin/votes/stats
openapi: 3.1.0
info:
  title: DualMind Admin API
  version: 1.0.0
  description: >-
    Admin routes of the DualMind API (`/api/admin/*`). Every route requires a
    Supabase access token for an account whose `public.users.role` is `admin`
    (the `AdminOnly` policy). Responses use the `{ success, data, total, page,
    pageSize, message, error }` envelope.
servers:
  - url: https://api.dualmindlab.tech
    description: Production
  - url: http://localhost:5079
    description: Local (dotnet run)
security:
  - bearerAuth: []
tags:
  - name: Dashboard
  - name: Users
  - name: AI models
  - name: Providers
  - name: API keys
  - name: Comparisons
  - name: Votes
  - name: Threads
  - name: Messages
paths:
  /api/admin/votes/stats:
    get:
      tags:
        - Votes
      summary: Get vote statistics
      description: >-
        Totals, ties, wins per model, votes per day over the last 30 days and
        the top 10 models by wins. It runs one count per model, so it is slower
        than the other admin reads.
      operationId: adminVoteStats
      responses:
        '200':
          description: Stats
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    type: object
                    properties:
                      total_votes:
                        type: integer
                      tie_count:
                        type: integer
                      votes_by_model:
                        type: array
                        items:
                          type: object
                          properties:
                            model_id:
                              type: string
                              format: uuid
                            model_name:
                              type: string
                            wins:
                              type: integer
                      votes_by_day:
                        type: array
                        items:
                          type: object
                          properties:
                            date:
                              type: string
                              format: date
                            count:
                              type: integer
                            vote_count:
                              type: integer
                      votes_over_time:
                        type: array
                        items:
                          type: object
                          properties:
                            date:
                              type: string
                              format: date
                            vote_count:
                              type: integer
                      top_10_models:
                        type: array
                        items:
                          type: object
                          properties:
                            model_name:
                              type: string
                            win_rate:
                              type: number
                            wins:
                              type: integer
        '401':
          description: Missing, expired or invalid bearer token.
        '403':
          description: Signed in, but `public.users.role` is not `admin`.
        '500':
          description: Unexpected error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    Error:
      type: object
      properties:
        success:
          type: boolean
          description: Always `false`.
          example: false
        error:
          type: string
          description: What went wrong.
          example: 'Role must be one of: admin, user'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Supabase access token of an account with `role = 'admin'` in
        `public.users`.

````

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