> ## Documentation Index
> Fetch the complete documentation index at: https://omniflow-vpn.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Get v1panelreportstraffic

> Requires customers.read. Node saturation and the heaviest users, read live from Remnawave on every request.
Omniflow stores none of it. Remnawave is authoritative for traffic, nodes, and connections, and this repository has no table for a node or for a byte a customer used — keeping one would be the first step towards Omniflow having an opinion about traffic. What Omniflow adds is the join: a Remnawave user identifier resolved to the customer who holds it.
`nodesReported` is false when the panel does not expose a node listing or could not be reached, and `nodesDetail` says which. An empty node list and no node data look identical on a screen and mean opposite things.
The consumer ranking pages the panel's user list and stops after ten pages. `scanned` and `total` say how far it got, so a truncated ranking is never presented as a complete one.



## OpenAPI

````yaml https://raw.githubusercontent.com/kewldan/omniflow/main/api/openapi.yaml get /v1/panel/reports/traffic
openapi: 3.0.3
info:
  title: Omniflow API
  version: 1.0.0
  description: >-
    Customer, commerce, payment, wallet, fulfillment, and operations API for
    Omniflow.
servers: []
security: []
paths:
  /v1/panel/reports/traffic:
    get:
      tags:
        - panel
      description: >-
        Requires customers.read. Node saturation and the heaviest users, read
        live from Remnawave on every request.

        Omniflow stores none of it. Remnawave is authoritative for traffic,
        nodes, and connections, and this repository has no table for a node or
        for a byte a customer used — keeping one would be the first step towards
        Omniflow having an opinion about traffic. What Omniflow adds is the
        join: a Remnawave user identifier resolved to the customer who holds it.

        `nodesReported` is false when the panel does not expose a node listing
        or could not be reached, and `nodesDetail` says which. An empty node
        list and no node data look identical on a screen and mean opposite
        things.

        The consumer ranking pages the panel's user list and stops after ten
        pages. `scanned` and `total` say how far it got, so a truncated ranking
        is never presented as a complete one.
      operationId: getPanelTrafficReport
      responses:
        '200':
          description: Traffic report
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PanelTrafficReport'
        '403':
          $ref: '#/components/responses/Problem'
components:
  schemas:
    PanelTrafficReport:
      type: object
      required:
        - nodes
        - nodesReported
        - consumers
        - scanned
        - total
      properties:
        nodes:
          type: array
          items:
            $ref: '#/components/schemas/PanelTrafficNode'
        nodesReported:
          type: boolean
          description: >-
            False when the panel did not answer. An empty list means neither
            thing.
        nodesDetail:
          type: string
          enum:
            - nodes_unsupported
            - nodes_unavailable
            - remnawave_not_configured
        consumers:
          type: array
          items:
            $ref: '#/components/schemas/PanelTrafficConsumer'
        scanned:
          type: integer
          description: How many users the ranking covers.
        total:
          type: integer
          description: How many the panel reports having.
    PanelTrafficNode:
      type: object
      required:
        - name
        - connected
        - disabled
        - usedBytes
        - limitBytes
      properties:
        name:
          type: string
        countryCode:
          type: string
        connected:
          type: boolean
        disabled:
          type: boolean
        usedBytes:
          type: integer
          format: int64
        limitBytes:
          type: integer
          format: int64
          description: Zero means the node has no limit, not that it is full.
        usedShare:
          type: number
          description: >-
            used ÷ limit. Absent when the node has no limit: it cannot be
            filling up.
        usersOnline:
          type: integer
    PanelTrafficConsumer:
      type: object
      required:
        - remnawaveId
        - username
        - usedBytes
        - lifetimeBytes
        - limitBytes
      properties:
        remnawaveId:
          type: integer
          format: int64
        username:
          type: string
        usedBytes:
          type: integer
          format: int64
          description: The current cycle, which resets.
        lifetimeBytes:
          type: integer
          format: int64
        limitBytes:
          type: integer
          format: int64
        customerId:
          type: string
          format: uuid
          description: >-
            Absent for a Remnawave user Omniflow did not create, which is a real
            state rather than an error.
        label:
          type: string
        status:
          type: string
    Problem:
      type: object
      required:
        - type
        - title
        - status
      properties:
        type:
          type: string
          format: uri
        title:
          type: string
        status:
          type: integer
        detail:
          type: string
        request_id:
          type: string
  responses:
    Problem:
      description: Request failed
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'

````

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