swagger: '2.0'

info:
    title: MiroTalk P2P API
    description: API description for external applications that integrates with MiroTalk P2P.
    version: 1.0.1

basePath: /api/v1

schemes:
    - https
    - http

paths:
    /stats:
        get:
            tags:
                - 'stats'
            summary: 'Get stats'
            description: 'Get stats'
            produces:
                - 'application/json'
            security:
                - secretApiKey: []
            responses:
                '200':
                    description: 'Get Stats done'
                    schema:
                        $ref: '#/definitions/StatsResponse'
                '403':
                    description: 'Unauthorized!'
    /meetings:
        get:
            tags:
                - 'meetings'
            summary: 'Get meetings'
            description: 'Get meetings'
            produces:
                - 'application/json'
            security:
                - secretApiKey: []
            responses:
                '200':
                    description: 'Get Meetings done'
                    schema:
                        $ref: '#/definitions/MeetingsResponse'
                '403':
                    description: 'Unauthorized!'
    /meeting:
        post:
            tags:
                - 'meeting'
            summary: 'Create meeting'
            description: 'Create meeting'
            consumes:
                - 'application/json'
            produces:
                - 'application/json'
            security:
                - secretApiKey: []
            responses:
                '200':
                    description: 'Meeting created'
                    schema:
                        $ref: '#/definitions/MeetingResponse'
                '403':
                    description: 'Unauthorized!'
    /join:
        post:
            tags:
                - 'join'
            summary: 'Create direct join'
            description: 'Create join'
            parameters:
                - in: body
                  name: Join
                  description: Custom Join URL.
                  schema:
                      type: object
                      properties:
                          room:
                              type: string
                              default: 'test'
                          name:
                              type: string
                              default: 'mirotalk'
                          avatar:
                              type: ['boolean', 'string'] # Allow boolean or string type
                              default: false
                          audio:
                              type: boolean
                              default: false
                          video:
                              type: boolean
                              default: false
                          screen:
                              type: boolean
                              default: false
                          chat:
                              type: boolean
                              default: false
                          hide:
                              type: boolean
                              default: false
                          notify:
                              type: boolean
                              default: false
                          token:
                              type: object
                              description: |
                                  Object containing authentication token details.
                                  This token is required when HOST_PROTECTED or HOST_USER_AUTH is enabled in the .env file.
                                  It includes properties such as username, password, presenter, and expire.
                              properties:
                                  username:
                                      type: string
                                      default: 'username'
                                  password:
                                      type: string
                                      default: 'password'
                                  presenter:
                                      type: boolean
                                      default: true
                                  expire:
                                      type: string
                                      default: '1h'
            consumes:
                - 'application/json'
            produces:
                - 'application/json'
            security:
                - secretApiKey: []
            responses:
                '200':
                    description: 'Direct join created'
                    schema:
                        $ref: '#/definitions/JoinResponse'
                '403':
                    description: 'Unauthorized!'

    /token:
        post:
            tags:
                - 'token'
            summary: 'Get token'
            description: 'Get token'
            parameters:
                - in: body
                  name: token
                  description: Custom Token.
                  schema:
                      $ref: '#/definitions/TokenRequest'
            consumes:
                - 'application/json'
            produces:
                - 'application/json'
            security:
                - secretApiKey: []
            responses:
                '200':
                    description: 'Get token done'
                    schema:
                        $ref: '#/definitions/TokenResponse'
                '403':
                    description: 'Unauthorized!'

securityDefinitions:
    secretApiKey:
        type: 'apiKey'
        name: 'authorization'
        in: 'header'
        description: 'Format like this: authorization: {API_KEY_SECRET}'

definitions:
    StatsResponse:
        type: object
        properties:
            success:
                type: boolean
            timestamp:
                type: string
                format: date-time
                example: '2025-12-21T12:00:00Z'
            totalRooms:
                type: integer
            totalPeers:
                type: integer

    MeetingsResponse:
        type: object
        properties:
            meetings:
                type: array
                items:
                    $ref: '#/definitions/Meeting'
    MeetingResponse:
        type: 'object'
        properties:
            meeting:
                type: 'string'
    JoinResponse:
        type: 'object'
        properties:
            join:
                type: 'string'
    TokenRequest:
        type: object
        properties:
            username:
                type: string
                default: 'username'
            password:
                type: string
                default: 'password'
            presenter:
                type: boolean
                default: true
            expire:
                type: string
                default: '1h'
    TokenResponse:
        type: 'object'
        properties:
            token:
                type: string
    Peer:
        type: object
        properties:
            peer_name:
                type: string
            peer_avatar:
                type: string
            peer_presenter:
                type: boolean
            peer_video:
                type: boolean
            peer_audio:
                type: boolean
            peer_video_status:
                type: boolean
            peer_audio_status:
                type: boolean
            peer_screen_status:
                type: boolean
            peer_hand_status:
                type: boolean
            peer_privacy_status:
                type: boolean
            os:
                type: string
            browser:
                type: string

    Meeting:
        type: object
        properties:
            roomId:
                type: string
            peers:
                type: array
                items:
                    $ref: '#/definitions/Peer'
