openapi: 3.0.1
info:
  title: AI Gateway API
  version: '1.0'
servers:
  - url: https://api.us-east-1.langdb.ai
    description: LangDB API Server
paths:
  /analytics:
    post:
      tags:
        - Analytics
      summary: Fetch analytics data
      parameters:
        - $ref: '#/components/parameters/XProjectId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                start_time_us:
                  type: integer
                  format: int64
                  description: "Start time in microseconds."
                  example: 1693062345678
                end_time_us:
                  type: integer
                  format: int64
                  description: "End time in microseconds."
                  example: 1693082345678

      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnalyticsResponse'
      security:
        - BearerAuth: []


  /analytics/summary:
    post:
      tags:
        - Analytics
      summary: Fetch analytics summary
      parameters:
        - $ref: '#/components/parameters/XProjectId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - groupBy
              properties:
                start_time_us:
                  type: integer
                  format: int64
                  example: 1693062345678
                end_time_us:
                  type: integer
                  format: int64
                  example: 1693082345678
                groupBy:
                  type: array
                  items:
                    type: string
                  example: ["provider"]
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnalyticsSummaryResponse'
      security:
        - BearerAuth: []
  /usage/total:
    post:
      tags:
        - Analytics
      summary: Get total usage
      parameters:
        - $ref: '#/components/parameters/XProjectId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                start_time_us:
                  type: integer
                  format: int64
                  example: 1693062345678
                end_time_us:
                  type: integer
                  format: int64

      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TotalUsageResponse'
      security:
        - BearerAuth: []


  /usage/models:
    post:
      tags:
        - Analytics
      summary: Get usage by model
      parameters:
        - $ref: '#/components/parameters/XProjectId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                start_time_us:
                  type: integer
                  format: int64
                  example: 1693062345678
                end_time_us:
                  type: integer
                  format: int64
                min_unit:
                  type: string
                  enum: [hour, day, month]
                  description: "The granularity of the returned usage data."
                  example: hour
  
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GranularUsageResponse'
      security:
        - BearerAuth: []


components:
  parameters:
    XProjectId:
      name: X-Project-Id
      in: header
      description: "LangDB project ID"
      required: true
      schema:
        type: string
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
  schemas:
    AnalyticsResponse:
      type: object
      required:
        - timeseries
        - start_time_us
        - end_time_us
      properties:
        timeseries:
          type: array
          description: "An array of analytics timeseries records."
          items:
            type: object
            required:
              - hour
              - total_cost
              - total_requests
              - avg_duration
              - duration
              - duration_p99
              - duration_p95
              - duration_p90
              - duration_p50
              - total_duration
              - total_input_tokens
              - total_output_tokens
              - error_rate
              - error_request_count
              - avg_ttft
              - ttft
              - ttft_p99
              - ttft_p95
              - ttft_p90
              - ttft_p50
              - tps
              - tps_p99
              - tps_p95
              - tps_p90
              - tps_p50
              - tpot
              - tpot_p99
              - tpot_p95
              - tpot_p90
              - tpot_p50
              - tag_tuple
            properties:
              hour:
                type: string
                description: "The timestamp for the record (e.g. 'YYYY-MM-DD HH:mm:ss')."
                example: "2025-02-20 18:00:00"
              total_cost:
                type: number
                format: double
                description: "Total cost incurred during this period."
                example: 12.34
              total_requests:
                type: integer
                description: "Total number of requests."
                example: 1000
              avg_duration:
                type: number
                format: double
                description: "Average duration (in milliseconds) of requests."
                example: 250.5
              duration:
                type: number
                format: double
                description: "Duration (in milliseconds) of requests."
                example: 245.7
              duration_p99:
                type: number
                format: double
                description: "99th percentile of request durations."
                example: 750.2
              duration_p95:
                type: number
                format: double
                description: "95th percentile of request durations."
                example: 500.1
              duration_p90:
                type: number
                format: double
                description: "90th percentile of request durations."
                example: 400.8
              duration_p50:
                type: number
                format: double
                description: "50th percentile of request durations."
                example: 200.3
              total_duration:
                type: number
                format: double
                description: "Total duration (in milliseconds) of all requests."
              total_input_tokens:
                type: integer
                description: "Total number of input tokens used."
              total_output_tokens:
                type: integer
                description: "Total number of output tokens generated."
              error_rate:
                type: number
                format: double
                description: "Error rate (as a percentage) over the period."
              error_request_count:
                type: integer
                description: "Number of error requests."
              avg_ttft:
                type: number
                format: double
                description: "Average time to first byte (TTFT) in milliseconds."
              ttft:
                type: number
                format: double
                description: "Time to first byte (TTFT) in milliseconds."
              ttft_p99:
                type: number
                format: double
                description: "99th percentile of TTFT."
              ttft_p95:
                type: number
                format: double
                description: "95th percentile of TTFT."
              ttft_p90:
                type: number
                format: double
                description: "90th percentile of TTFT."
              ttft_p50:
                type: number
                format: double
                description: "50th percentile of TTFT."
              tps:
                type: number
                format: double
                description: "Transactions per second."
              tps_p99:
                type: number
                format: double
                description: "99th percentile TPS."
              tps_p95:
                type: number
                format: double
                description: "95th percentile TPS."
              tps_p90:
                type: number
                format: double
                description: "90th percentile TPS."
              tps_p50:
                type: number
                format: double
                description: "50th percentile TPS."
              tpot:
                type: number
                format: double
                description: "Average transactions per output token (Tpot)."
                example: 0.85
              tpot_p99:
                type: number
                format: double
                description: "99th percentile of Tpot."
                example: 1.5
              tpot_p95:
                type: number
                format: double
                description: "95th percentile of Tpot."
                example: 1.2
              tpot_p90:
                type: number
                format: double
                description: "90th percentile of Tpot."
                example: 1.0
              tpot_p50:
                type: number
                format: double
                description: "50th percentile of Tpot."
                example: 0.75
              tag_tuple:
                type: array
                items:
                  type: string
                description: "A tuple of tags associated with the record."
        start_time_us:
          type: integer
          format: int64
          description: "Start time in microseconds since epoch."
        end_time_us:
          type: integer
          format: int64
          description: "End time in microseconds since epoch."

    AnalyticsSummaryItem:
      type: object
      required:
        - tag_tuple
        - total_cost
        - total_requests
        - total_duration
        - avg_duration
        - duration
        - duration_p99
        - duration_p95
        - duration_p90
        - duration_p50
        - total_input_tokens
        - total_output_tokens
        - avg_ttft
        - ttft
        - ttft_p99
        - ttft_p95
        - ttft_p90
        - ttft_p50
        - tps
        - tps_p99
        - tps_p95
        - tps_p90
        - tps_p50
        - tpot
        - tpot_p99
        - tpot_p95
        - tpot_p90
        - tpot_p50
        - error_rate
        - error_request_count
      properties:
        tag_tuple:
          type: array
          items:
            type: string
          description: >
            The grouping key(s) used for this summary. In this example the key is returned as tag_tuple.
            (Depending on the groupBy parameter, this field might contain provider names or model names.)
          example: ["openai", "gpt-4"]
        total_cost:
          type: number
          format: double
          description: "Aggregated total cost in USD for the group."
          example: 156.78
        total_requests:
          type: integer
          description: "Aggregated total number of requests for the group."
          example: 5000
        total_duration:
          type: number
          format: double
          description: "Aggregated total duration (in milliseconds) for the group."
          example: 1250000.0
        avg_duration:
          type: number
          format: double
          description: "Average duration (in milliseconds) of requests for the group."
          example: 250.0
        duration:
          type: number
          format: double
          description: "Representative duration (in milliseconds) for the group."
          example: 245.5
        duration_p99:
          type: number
          format: double
          description: "99th percentile of request durations."
          example: 750.0
        duration_p95:
          type: number
          format: double
          description: "95th percentile of request durations."
          example: 500.0
        duration_p90:
          type: number
          format: double
          description: "90th percentile of request durations."
          example: 400.0
        duration_p50:
          type: number
          format: double
          description: "50th percentile of request durations."
          example: 200.0
        total_input_tokens:
          type: integer
          description: "Aggregated total input tokens used in the group."
          example: 100000
        total_output_tokens:
          type: integer
          description: "Aggregated total output tokens generated in the group."
          example: 50000
        avg_ttft:
          type: number
          format: double
          description: "Average time-to-first-byte (TTFT) in milliseconds for the group."
          example: 100.0
        ttft:
          type: number
          format: double
          description: "Representative TTFT value in milliseconds for the group."
          example: 98.5
        ttft_p99:
          type: number
          format: double
          description: "99th percentile of TTFT."
          example: 300.0
        ttft_p95:
          type: number
          format: double
          description: "95th percentile of TTFT."
          example: 200.0
        ttft_p90:
          type: number
          format: double
          description: "90th percentile of TTFT."
          example: 150.0
        ttft_p50:
          type: number
          format: double
          description: "50th percentile of TTFT."
          example: 80.0
        tps:
          type: number
          format: double
          description: "Aggregated transactions per second (TPS) for the group."
          example: 10.5
        tps_p99:
          type: number
          format: double
          description: "99th percentile of TPS."
          example: 20.0
        tps_p95:
          type: number
          format: double
          description: "95th percentile of TPS."
          example: 15.0
        tps_p90:
          type: number
          format: double
          description: "90th percentile of TPS."
          example: 12.0
        tps_p50:
          type: number
          format: double
          description: "50th percentile of TPS."
          example: 8.0
        tpot:
          type: number
          format: double
          description: "Aggregated average transactions per output token (TPOT) for the group."
          example: 0.85
        tpot_p99:
          type: number
          format: double
          description: "99th percentile of TPOT."
          example: 1.5
        tpot_p95:
          type: number
          format: double
          description: "95th percentile of TPOT."
          example: 1.2
        tpot_p90:
          type: number
          format: double
          description: "90th percentile of TPOT."
          example: 1.0
        tpot_p50:
          type: number
          format: double
          description: "50th percentile of TPOT."
          example: 0.75
        error_rate:
          type: number
          format: double
          description: "Error rate (as a percentage) for the group."
        error_request_count:
          type: integer
          description: "Total number of error requests in the group."

    AnalyticsSummaryResponse:
      type: object
      required:
        - summary
        - start_time_us
        - end_time_us
      properties:
        summary:
          type: array
          description: "An array of aggregated analytics summary records."
          items:
            $ref: '#/components/schemas/AnalyticsSummaryItem'
        start_time_us:
          type: integer
          format: int64
          description: "Start time in microseconds since epoch."
        end_time_us:
          type: integer
          format: int64
          description: "End time in microseconds since epoch."
    TotalUsageResponse:
      type: object
      properties:
        models:
          type: array
          items:
            type: object
            properties:
              provider:
                type: string
                example: openai
              model_name:
                type: string
                example: gpt-4o
              total_input_tokens:
                type: integer
                example: 3196182
              total_output_tokens:
                type: integer
                example: 74096
              total_cost:
                type: number
                format: float
                example: 10.4776979999
              cost_per_input_token:
                type: number
                format: float
                example: 3.0
              cost_per_output_token:
                type: number
                format: float
                example: 12.0
        total:
          type: object
          properties:
            total_input_tokens:
              type: integer
              example: 4181386
            total_output_tokens:
              type: integer
              example: 206547
            total_cost:
              type: number
              format: float
              example: 11.8904386859
        period_start:
          type: integer
          format: int64
          example: 1737504000000000
        period_end:
          type: integer
          format: int64
          example: 1740120949421000
      required:
        - models
        - total
        - period_start
        - period_end

    GranularModelUsage:
      type: object
      required:
        - time
        - provider
        - model_name
        - total_input_tokens
        - total_output_tokens
        - total_cost
      properties:
        time:
          type: string
          description: >
            The timestamp corresponding to the usage data. The format depends on the requested granularity:
            - Hourly: "YYYY-MM-DD HH:mm:ss"
            - Daily: "YYYY-MM-DD"
            - Monthly: "YYYY-MM"
        provider:
          type: string
          description: "The provider of the model (e.g. openai, gemini, etc.)"
        model_name:
          type: string
          description: "The name of the model"
        total_input_tokens:
          type: integer
          description: "Total number of input tokens used"
        total_output_tokens:
          type: integer
          description: "Total number of output tokens generated"
        total_cost:
          type: number
          format: double
          description: "Total cost in USD"
    GranularUsageResponse:
      type: object
      properties:
        models:
          type: array
          description: "Usage statistics for each model at the specified granularity (hourly, daily, or monthly)"
          items:
            type: object
            properties:
              hour:
                type: string
                description: "Timestamp for the record"
                example: "2025-02-15 09:00:00"
              provider:
                type: string
                example: "openai"
              model_name:
                type: string
                example: "gpt-4o"
              total_input_tokens:
                type: integer
                example: 451235
              total_output_tokens:
                type: integer
                example: 2553
              total_cost:
                type: number
                format: float
                example: 1.3843410000000005
        period_start:
          type: integer
          format: int64
          description: "Start of the usage period in microseconds since epoch"
          example: 1737504000000000
        period_end:
          type: integer
          format: int64
          description: "End of the usage period in microseconds since epoch"
          example: 1740121147931000
      required:
        - models
        - period_start
        - period_end
    TotalUsageSummary:
      type: object
      required:
        - total_input_tokens
        - total_output_tokens
        - total_cost
      properties:
        total_input_tokens:
          type: integer
          description: Total input tokens across all models
        total_output_tokens:
          type: integer
          description: Total output tokens across all models
        total_cost:
          type: number
          format: double
          description: Total cost across all models in USD

    ModelUsage:
      type: object
      required:
        - provider
        - model_name
        - total_input_tokens
        - total_output_tokens
        - total_cost
        - cost_per_input_token
        - cost_per_output_token