---
openapi: 3.1.0
info:
  title: LiveVoice Server API
  version: '2'
  description: |
    Manage events, channels, glossaries, screens, webhooks, recordings,
    transcripts and invoices of your LiveVoice account, and read its
    details and statistics. Send the server API key of your account as
    Bearer token, i.e. in the header "Authorization: Bearer <key>".
    Responses always contain a status (success or error), except for
    downloads. Disabled features only render their enabled field. Enabling
    a feature again restores its previous settings, unless new ones are
    given. Lists of records (e.g. the sections of glossaries) replace all
    existing ones.
servers:
- url: https://livevoice.io/api/v2
security:
- bearer: []
tags:
- name: Events
- name: Channels
- name: Screens
- name: Glossaries
- name: Webhooks
- name: Recordings
- name: Transcripts
- name: Invoices
- name: Account
paths:
  "/events":
    get:
      tags:
      - Events
      summary: List events
      operationId: index_events
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  events:
                    type: array
                    items:
                      "$ref": "#/components/schemas/Event"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    post:
      tags:
      - Events
      summary: Create an event
      operationId: create_events
      requestBody:
        required: true
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/Event"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  event:
                    "$ref": "#/components/schemas/Event"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/events/{id}":
    get:
      tags:
      - Events
      summary: Show an event
      operationId: show_event
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  event:
                    "$ref": "#/components/schemas/Event"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    patch:
      tags:
      - Events
      summary: Update an event
      operationId: update_event
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/Event"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  event:
                    "$ref": "#/components/schemas/Event"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    delete:
      tags:
      - Events
      summary: Delete an event
      operationId: destroy_event
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/events/{id}/header-image":
    put:
      tags:
      - Events
      summary: Upload the header image of an event
      description: |
        Requires the branding feature. Upload an image (e.g. JPEG or PNG) of
        up to 10 MB as file field. It is cropped to 2200x530 pixels and stored
        as JPEG, transparent backgrounds become white. Replaces the
        existing one. Missing, wrong or broken files are invalid params,
        e.g. { "file": ["invalid"] }.
      operationId: set_header_image_event
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
              - file
              properties:
                file:
                  type: string
                  format: binary
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  event:
                    "$ref": "#/components/schemas/Event"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    delete:
      tags:
      - Events
      summary: Remove the header image of an event
      operationId: remove_header_image_event
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  event:
                    "$ref": "#/components/schemas/Event"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/events/{id}/logo-image":
    put:
      tags:
      - Events
      summary: Upload the logo of an event
      description: |
        Requires the branding feature. Upload an image (e.g. JPEG or PNG) of
        up to 10 MB as file field. It is cropped to 400x225 pixels and stored
        as JPEG, transparent backgrounds become white. Replaces the
        existing one. Missing, wrong or broken files are invalid params,
        e.g. { "file": ["invalid"] }.
      operationId: set_logo_image_event
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
              - file
              properties:
                file:
                  type: string
                  format: binary
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  event:
                    "$ref": "#/components/schemas/Event"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    delete:
      tags:
      - Events
      summary: Remove the logo of an event
      operationId: remove_logo_image_event
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  event:
                    "$ref": "#/components/schemas/Event"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/events/{id}/statistics":
    get:
      tags:
      - Events
      summary: Show the statistics of an event
      description: |
        Peak participants per day. Days are those of the time zone of the
        account.
      operationId: statistics_event
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      - name: from
        in: query
        required: false
        description: |
          First day, 30 days before the last day if not given. Statistics are
          kept for 14 months, so it can't be earlier. It can't be after the
          last day.
        schema:
          type: string
          format: date
      - name: to
        in: query
        required: false
        description: Last day, today if not given. It can't be in the future.
        schema:
          type: string
          format: date
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  statistics:
                    "$ref": "#/components/schemas/Statistics"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/events/{event_id}/channels":
    get:
      tags:
      - Channels
      summary: List channels
      operationId: index_channels
      parameters:
      - name: event_id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  channels:
                    type: array
                    items:
                      "$ref": "#/components/schemas/Channel"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    post:
      tags:
      - Channels
      summary: Create a channel
      operationId: create_channels
      parameters:
      - name: event_id
        in: path
        required: true
        schema:
          type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/Channel"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  channel:
                    "$ref": "#/components/schemas/Channel"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/channels/{id}":
    get:
      tags:
      - Channels
      summary: Show a channel
      operationId: show_channel
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  channel:
                    "$ref": "#/components/schemas/Channel"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    patch:
      tags:
      - Channels
      summary: Update a channel
      operationId: update_channel
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/Channel"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  channel:
                    "$ref": "#/components/schemas/Channel"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    delete:
      tags:
      - Channels
      summary: Delete a channel
      operationId: destroy_channel
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/channels/{id}/start-ai":
    post:
      tags:
      - Channels
      summary: Start the AI translation of a channel
      operationId: start_ai_channel
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/channels/{id}/stop-ai":
    post:
      tags:
      - Channels
      summary: Stop the AI translation of a channel
      operationId: stop_ai_channel
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/channels/{id}/start-import":
    post:
      tags:
      - Channels
      summary: Start importing audio into a channel
      operationId: start_import_channel
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/channels/{id}/stop-import":
    post:
      tags:
      - Channels
      summary: Stop importing audio into a channel
      operationId: stop_import_channel
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/channels/{id}/statistics":
    get:
      tags:
      - Channels
      summary: Show the statistics of a channel
      description: |
        Peak participants per day. Days are those of the time zone of the
        account.
      operationId: statistics_channel
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      - name: from
        in: query
        required: false
        description: |
          First day, 30 days before the last day if not given. Statistics are
          kept for 14 months, so it can't be earlier. It can't be after the
          last day.
        schema:
          type: string
          format: date
      - name: to
        in: query
        required: false
        description: Last day, today if not given. It can't be in the future.
        schema:
          type: string
          format: date
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  statistics:
                    "$ref": "#/components/schemas/Statistics"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/events/{event_id}/screens":
    get:
      tags:
      - Screens
      summary: List screens
      operationId: index_screens
      parameters:
      - name: event_id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  screens:
                    type: array
                    items:
                      "$ref": "#/components/schemas/Screen"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    post:
      tags:
      - Screens
      summary: Create a screen
      operationId: create_screens
      parameters:
      - name: event_id
        in: path
        required: true
        schema:
          type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/Screen"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  screen:
                    "$ref": "#/components/schemas/Screen"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/screens/{id}":
    get:
      tags:
      - Screens
      summary: Show a screen
      operationId: show_screen
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  screen:
                    "$ref": "#/components/schemas/Screen"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    patch:
      tags:
      - Screens
      summary: Update a screen
      operationId: update_screen
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/Screen"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  screen:
                    "$ref": "#/components/schemas/Screen"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    delete:
      tags:
      - Screens
      summary: Delete a screen
      operationId: destroy_screen
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/screen-presets":
    get:
      tags:
      - Screens
      summary: List screen presets
      operationId: index_screen_presets
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  screen_presets:
                    type: array
                    items:
                      "$ref": "#/components/schemas/ScreenPreset"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/glossaries":
    get:
      tags:
      - Glossaries
      summary: List glossaries
      description: Requires the glossary feature.
      operationId: index_glossaries
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  glossaries:
                    type: array
                    items:
                      "$ref": "#/components/schemas/Glossary"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    post:
      tags:
      - Glossaries
      summary: Create a glossary
      description: Requires the glossary feature.
      operationId: create_glossaries
      requestBody:
        required: true
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/Glossary"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  glossary:
                    "$ref": "#/components/schemas/Glossary"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/glossaries/{id}":
    get:
      tags:
      - Glossaries
      summary: Show a glossary
      description: Requires the glossary feature.
      operationId: show_glossary
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  glossary:
                    "$ref": "#/components/schemas/Glossary"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    patch:
      tags:
      - Glossaries
      summary: Update a glossary
      description: Requires the glossary feature.
      operationId: update_glossary
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/Glossary"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  glossary:
                    "$ref": "#/components/schemas/Glossary"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    delete:
      tags:
      - Glossaries
      summary: Delete a glossary
      description: Requires the glossary feature.
      operationId: destroy_glossary
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/webhooks":
    get:
      tags:
      - Webhooks
      summary: List webhooks
      operationId: index_webhooks
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  webhooks:
                    type: array
                    items:
                      "$ref": "#/components/schemas/Webhook"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    post:
      tags:
      - Webhooks
      summary: Create a webhook
      operationId: create_webhooks
      requestBody:
        required: true
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/Webhook"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  webhook:
                    "$ref": "#/components/schemas/Webhook"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/webhooks/{id}":
    get:
      tags:
      - Webhooks
      summary: Show a webhook
      operationId: show_webhook
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  webhook:
                    "$ref": "#/components/schemas/Webhook"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    patch:
      tags:
      - Webhooks
      summary: Update a webhook
      operationId: update_webhook
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              "$ref": "#/components/schemas/Webhook"
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  webhook:
                    "$ref": "#/components/schemas/Webhook"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    delete:
      tags:
      - Webhooks
      summary: Delete a webhook
      operationId: destroy_webhook
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/channels/{channel_id}/recordings":
    get:
      tags:
      - Recordings
      summary: List recordings of a channel
      operationId: index_recordings
      parameters:
      - name: channel_id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  recordings:
                    type: array
                    items:
                      "$ref": "#/components/schemas/Recording"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/recordings/{id}":
    get:
      tags:
      - Recordings
      summary: Show a recording
      operationId: show_recording
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  recording:
                    "$ref": "#/components/schemas/Recording"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    delete:
      tags:
      - Recordings
      summary: Delete a recording
      operationId: destroy_recording
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/recordings/{id}/download":
    get:
      tags:
      - Recordings
      summary: Download a recording
      description: |
        Redirects to a temporary URL of the file, which expires after 5
        minutes. HTTP clients don't send the Authorization header along
        to it.
      operationId: download_recording
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      - name: format
        in: query
        required: false
        description: One of the formats of the recording, the first one if
          not given. Other formats return not_found.
        schema:
          type: string
          enum:
          - mp3
          - ogg
          - webm
      responses:
        '302':
          description: Redirect to the file
          headers:
            Location:
              schema:
                type: string
                format: uri
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/channels/{channel_id}/transcript":
    get:
      tags:
      - Transcripts
      summary: Download the transcript of a channel
      description: Downloads the captions of the channel as a file in the
        given format.
      operationId: download_transcript
      parameters:
      - name: channel_id
        in: path
        required: true
        schema:
          type: integer
      - name: format
        in: query
        required: true
        description: Format of the file
        schema:
          type: string
          enum:
          - csv
          - srt
          - vtt
          - txt
          - json
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: array
                items:
                  "$ref": "#/components/schemas/TranscriptFragment"
            text/plain:
              schema:
                type: string
            application/octet-stream:
              schema:
                type: string
                description: SRT file
            text/vtt:
              schema:
                type: string
            text/csv:
              schema:
                type: string
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
    delete:
      tags:
      - Transcripts
      summary: Delete the transcript of a channel
      operationId: destroy_transcript
      parameters:
      - name: channel_id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/invoices":
    get:
      tags:
      - Invoices
      summary: List invoices
      description: Lists paid and manual invoices, the newest first.
      operationId: index_invoices
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  invoices:
                    type: array
                    items:
                      "$ref": "#/components/schemas/Invoice"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/invoices/{id}":
    get:
      tags:
      - Invoices
      summary: Show an invoice
      operationId: show_invoice
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  invoice:
                    "$ref": "#/components/schemas/Invoice"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/invoices/{id}/download":
    get:
      tags:
      - Invoices
      summary: Download an invoice as PDF
      operationId: download_invoice
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/account":
    get:
      tags:
      - Account
      summary: Show the account
      description: |
        The account of the API key. Its features tell which feature groups
        can be used, others return 403 feature_not_available.
      operationId: show_account
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  account:
                    "$ref": "#/components/schemas/Account"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
  "/account/statistics":
    get:
      tags:
      - Account
      summary: Show the statistics of the account
      description: |
        Peak participants per day of all events together. Days are those of
        the time zone of the account.
      operationId: statistics_account
      parameters:
      - name: from
        in: query
        required: false
        description: |
          First day, 30 days before the last day if not given. Statistics are
          kept for 14 months, so it can't be earlier. It can't be after the
          last day.
        schema:
          type: string
          format: date
      - name: to
        in: query
        required: false
        description: Last day, today if not given. It can't be in the future.
        schema:
          type: string
          format: date
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                    - success
                  statistics:
                    "$ref": "#/components/schemas/Statistics"
        '400':
          "$ref": "#/components/responses/400"
        '401':
          "$ref": "#/components/responses/401"
        '403':
          "$ref": "#/components/responses/403"
        '404':
          "$ref": "#/components/responses/404"
        '413':
          "$ref": "#/components/responses/413"
        '422':
          "$ref": "#/components/responses/422"
        '429':
          "$ref": "#/components/responses/429"
webhooks:
  channel_state_changed:
    post:
      tags:
      - Webhooks
      summary: Channel state changed
      description: |
        Sent to the url of your webhook when a channel changes its state.

        Each request carries two headers: Webhook-Timestamp (Unix time in
        seconds) and Webhook-Signature. To check that a request really
        comes from LiveVoice, compute an HMAC-SHA256 over the string
        "{Webhook-Timestamp}.{raw request body}", using your webhook
        secret as the key, and hex-encode the result. Compare it to
        Webhook-Signature with a constant-time comparison, and reject the
        request if they differ. Use the raw body exactly as received, not
        re-encoded JSON. To prevent replay attacks, also reject requests
        whose timestamp is more than 5 minutes old.

        Respond with any 2xx status within 10 seconds. Otherwise the
        request is retried with growing pauses, 5 attempts in total, and
        the account owner gets an email after the last one. Retries of
        the same delivery keep the same id, so use it to skip duplicates.
      operationId: channel_state_changed_webhook
      security: []
      parameters:
      - name: Webhook-Timestamp
        in: header
        required: true
        description: Unix time in seconds when the request was sent
        schema:
          type: string
      - name: Webhook-Signature
        in: header
        required: true
        description: |
          Hex-encoded HMAC-SHA256 of "{Webhook-Timestamp}.{raw request
          body}", keyed with your webhook secret
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
                  format: uuid
                  description: Id of this delivery, the same for all retries
                event:
                  type: string
                  enum:
                  - channel_state_changed
                occurred_at:
                  type: string
                  format: date-time
                sent_at:
                  type: string
                  format: date-time
                data:
                  type: object
                  properties:
                    event_id:
                      type: integer
                      description: Id of the LiveVoice event
                    channel_id:
                      type: integer
                    old_state:
                      type: string
                      enum:
                      - offline
                      - speaking
                      - importing_source
                      - importing_channel
                      - ai_translating
                    new_state:
                      type: string
                      enum:
                      - offline
                      - speaking
                      - importing_source
                      - importing_channel
                      - ai_translating
      responses:
        '200':
          description: Any 2xx status confirms the delivery
components:
  securitySchemes:
    bearer:
      type: http
      scheme: bearer
  schemas:
    Event:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
        description:
          type:
          - string
          - 'null'
        state:
          type: string
          description: |
            Events without use for months become stale, which only
            LiveVoice sets. Their codes are released. The state of stale
            events can't be changed, reactivate them in the web app.
          enum:
          - active
          - inactive
          - stale
        code:
          type:
          - string
          - 'null'
          readOnly: true
        speaker_password:
          type: object
          description: Requires the speaker_password feature.
          properties:
            enabled:
              type: boolean
            password:
              type: string
        participant_password:
          type: object
          description: Requires the participant_password feature.
          properties:
            enabled:
              type: boolean
            password:
              type: string
        access_codes:
          type: object
          description: Requires the access_codes feature.
          properties:
            enabled:
              type: boolean
            new_codes:
              type: string
              writeOnly: true
        contact_info:
          type: object
          description: Requires the contact_info feature.
          properties:
            website:
              type:
              - string
              - 'null'
            email:
              type:
              - string
              - 'null'
            phone:
              type:
              - string
              - 'null'
        event_messages:
          type: object
          description: Requires the event_messages feature.
          properties:
            speaker_message:
              type:
              - string
              - 'null'
            participant_message:
              type:
              - string
              - 'null'
        speaker_chat:
          type: object
          description: Requires the speaker_chat feature.
          properties:
            enabled:
              type: boolean
        language_switching:
          type: object
          description: Requires the language_switching feature.
          properties:
            enabled:
              type: boolean
            groups:
              type: array
              items:
                description: Channel ids speakers can switch between, at least two
                type: array
                items:
                  type: integer
        multi_listen_in:
          type: object
          description: Requires the multi_listen_in feature.
          properties:
            speaker_enabled:
              type: boolean
            participant_enabled:
              type: boolean
        headphones_only:
          type: object
          description: Requires the headphones_only feature.
          properties:
            enabled:
              type: boolean
        geolocation:
          type: object
          description: Requires the geolocation feature.
          properties:
            enabled:
              type: boolean
            street:
              type: string
            postalcode:
              type: string
            city:
              type: string
            radius:
              type: integer
              enum:
              - 100
              - 1000
              - 3000
              - 10000
        glossary:
          type: object
          description: Requires the glossary feature.
          properties:
            enabled:
              type: boolean
            glossary_id:
              type:
              - integer
              - 'null'
        participant_limit:
          type: object
          description: Requires the participant_limit feature.
          properties:
            enabled:
              type: boolean
            limit:
              type: integer
        operator:
          type: object
          description: Requires the operator feature.
          properties:
            enabled:
              type: boolean
        profanity_filter:
          type: object
          description: Requires the profanity_filter feature.
          properties:
            enabled:
              type: boolean
        ai_cost_control_vad:
          type: object
          properties:
            enabled:
              type: boolean
            pause_minutes:
              type: integer
              enum:
              - 15
              - 30
              - 60
              - 180
        ai_cost_control_participants:
          type: object
          properties:
            enabled:
              type: boolean
            pause_minutes:
              type: integer
              enum:
              - 10
              - 15
              - 30
              - 60
              - 180
        request_language:
          type: object
          description: Requires the request_language feature.
          properties:
            enabled:
              type: boolean
            base_channel_id:
              type: integer
            voice:
              type: string
              description: |
                Voice of requested languages. Premium voices are billed
                separately.
              enum:
              - male
              - female
              - male_premium
              - female_premium
            auto_approve_limit:
              type: integer
              enum:
              - 0
              - 1
              - 2
              - 3
              - 4
              - 5
              - 6
              - 7
              - 8
              - 9
              - 10
              - 11
              - 12
              - 13
              - 14
              - 15
              - 16
              - 17
              - 18
              - 19
              - 20
              - 21
              - 22
              - 23
              - 24
              - 25
              - 26
              - 27
              - 28
              - 29
              - 30
              - 10000
            delete_channel_minutes:
              type: integer
              enum:
              - 15
              - 30
              - 120
              - 300
              - 1440
              - 10080
              - 40320
              - -1
            ai_vad_pause_minutes:
              type: integer
              enum:
              - 15
              - 30
              - 60
              - 180
            ai_participant_pause_minutes:
              type: integer
              enum:
              - 10
              - 15
              - 30
              - 60
              - 180
        header_image_url:
          type:
          - string
          - 'null'
          format: uri
          readOnly: true
          description: URL of the header image, see its upload
        logo_image_url:
          type:
          - string
          - 'null'
          format: uri
          readOnly: true
          description: URL of the logo, see its upload
        qr_code_image_url:
          type:
          - string
          - 'null'
          format: uri
          readOnly: true
          description: URL of a QR code image (PNG) linking to the participant
            URL. It is generated shortly after the event is created and is null
            until then.
        participant_url:
          type:
          - string
          - 'null'
          format: uri
          readOnly: true
          description: URL for participants to join the event
        operator_url:
          type:
          - string
          - 'null'
          format: uri
          readOnly: true
          description: URL for operators, if the operator is enabled
    Channel:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        event_id:
          type: integer
          readOnly: true
        state:
          type: string
          enum:
          - offline
          - speaking
          - importing_source
          - importing_channel
          - ai_translating
          readOnly: true
        code:
          type:
          - string
          - 'null'
          readOnly: true
        name:
          type: string
        spoken_languages:
          type: array
          items:
            type: string
        audio_input:
          type: object
          description: Requires the audio_input feature.
          properties:
            enabled:
              type: boolean
        video_input:
          type: object
          description: Requires the video_input feature.
          properties:
            enabled:
              type: boolean
            speaker_video_enabled:
              type: boolean
            participant_video_only:
              type: boolean
        recording:
          type: object
          description: Requires the recording feature.
          properties:
            enabled:
              type: boolean
        hiding:
          type: object
          description: Requires the hiding feature.
          properties:
            enabled:
              type: boolean
            hidden_on_app:
              type: boolean
            hidden_on_web:
              type: boolean
            hidden_on_iframe:
              type: boolean
        floor_distribution:
          type: object
          description: Requires the floor_distribution feature.
          properties:
            enabled:
              type: boolean
            floor_id:
              type: integer
        auto_listen_in:
          type: object
          description: Requires the auto_listen_in feature.
          properties:
            enabled:
              type: boolean
            channel_id:
              type: integer
        protection:
          type: object
          description: Requires the protection feature.
          properties:
            enabled:
              type: boolean
            password:
              type: string
        ai_live_captions:
          type: object
          description: Requires the ai_live_captions feature.
          properties:
            enabled:
              type: boolean
            languages:
              type: array
              description: Spoken languages which get captions
              items:
                "$ref": "#/components/schemas/InputLanguage"
        ai_translation:
          type: object
          description: Requires the ai_translation feature.
          properties:
            enabled:
              type: boolean
            source_channel_id:
              type: integer
            languages:
              type: array
              description: Spoken languages of the source channel to translate
              items:
                "$ref": "#/components/schemas/InputLanguage"
            target_language:
              type: string
              enum:
              - af-ZA
              - am-ET
              - ar-AE
              - az-AZ
              - bg-BG
              - bn-IN
              - bs-BA
              - ca-ES
              - cs-CZ
              - da-DK
              - de-DE
              - el-GR
              - en-US
              - es-ES
              - es-MX
              - et-EE
              - eu-ES
              - fa-IR
              - fi-FI
              - fil-PH
              - fr-FR
              - ga-IE
              - gl-ES
              - he-IL
              - hi-IN
              - hr-HR
              - hu-HU
              - hy-AM
              - id-ID
              - is-IS
              - it-IT
              - ja-JP
              - ka-GE
              - kk-KZ
              - km-KH
              - ko-KR
              - lo-LA
              - lt-LT
              - lv-LV
              - ne-NP
              - nl-NL
              - no-NO
              - mk-MK
              - ml-IN
              - mn-MN
              - mr-IN
              - ms-MY
              - mt-MT
              - my-MM
              - pa-IN
              - pl-PL
              - pt-PT
              - pt-BR
              - ro-RO
              - ru-RU
              - sk-SK
              - sl-SI
              - so-SO
              - sq-AL
              - sr-RS
              - sv-SE
              - sw-KE
              - ta-IN
              - te-IN
              - th-TH
              - tr-TR
              - uk-UA
              - ur-IN
              - vi-VN
              - zh-HK
              - zh-CN
              - zh-TW
            voice:
              type:
              - string
              - 'null'
              description: |
                Required if speaker_enabled, null for translated captions
                only. Premium voices are billed separately.
              enum:
              - male
              - female
              - male_premium
              - female_premium
              - null
            speaker_enabled:
              type: boolean
            translated_captions_enabled:
              type: boolean
            start_stop_mode:
              type: string
              enum:
              - source
              - schedule
              - manual
            start_stop_schedule:
              type: array
              items:
                type: object
                properties:
                  start_date:
                    type: string
                    format: date
                  start_time:
                    type: string
                    description: HH:MM
                  end_date:
                    type: string
                    format: date
                  end_time:
                    type: string
                    description: HH:MM
                required:
                - start_date
                - start_time
                - end_date
                - end_time
        speaker_url:
          type:
          - string
          - 'null'
          format: uri
          readOnly: true
          description: URL for speakers, if the channel has audio input
    Screen:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        event_id:
          type: integer
          readOnly: true
        name:
          type: string
        preset_id:
          type: integer
        channel_groups:
          type: array
          description: |
            Up to 3 groups. Scrolling presets show the enabled groups side
            by side (split screen), overlay presets only the first one.
            Use one group per channel to split a screen.
          items:
            type: object
            properties:
              type:
                type: string
                enum:
                - captions
                - cross_translation
              channel_ids:
                type: array
                description: |
                  captions: one channel with captions. cross_translation:
                  two channels with translated captions of the same source
                  channel, each into a language spoken there.
                items:
                  type: integer
              enabled:
                type: boolean
        url:
          type: string
          format: uri
          readOnly: true
          description: URL of the screen, e.g. for a browser source
    ScreenPreset:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        type:
          type: string
          enum:
          - scrolling
          - overlay
    Glossary:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        name:
          type: string
        sections:
          type: array
          items:
            type: object
            properties:
              type:
                type: string
                enum:
                - transcription
                - translation
              from_language:
                "$ref": "#/components/schemas/InputLanguage"
              to_language:
                type:
                - string
                - 'null'
                description: |
                  Language to translate into, for translation sections,
                  null for transcription sections. Only these target
                  languages of channels support glossaries.
                enum:
                - ar-AE
                - bg-BG
                - cs-CZ
                - da-DK
                - de-DE
                - el-GR
                - en-US
                - es-ES
                - es-MX
                - et-EE
                - fi-FI
                - fr-FR
                - hu-HU
                - id-ID
                - it-IT
                - ja-JP
                - ko-KR
                - lt-LT
                - lv-LV
                - nl-NL
                - no-NO
                - pl-PL
                - pt-PT
                - pt-BR
                - ro-RO
                - ru-RU
                - sk-SK
                - sl-SI
                - sv-SE
                - tr-TR
                - uk-UA
                - zh-CN
                - zh-TW
                - null
              entries:
                type: array
                items:
                  type: object
                  properties:
                    from_token:
                      type: string
                    to_token:
                      type:
                      - string
                      - 'null'
    Webhook:
      type: object
      properties:
        id:
          type: integer
          readOnly: true
        event:
          type: string
          enum:
          - channel_state_changed
        url:
          type: string
        secret:
          type: string
          writeOnly: true
          description: |
            Your own random string of 32 to 255 characters. LiveVoice
            uses it to sign each request, see the webhooks section.
    Recording:
      type: object
      properties:
        id:
          type: integer
        channel_id:
          type: integer
        type:
          type: string
          enum:
          - audio
          - video
        concatenated:
          type: boolean
          description: Whether it was concatenated from other recordings
        started_at:
          type: string
          format: date-time
        ended_at:
          type: string
          format: date-time
        formats:
          type: array
          description: Formats which can be downloaded
          items:
            type: string
            enum:
            - mp3
            - ogg
            - webm
    TranscriptFragment:
      type: object
      properties:
        time:
          type: string
          format: date-time
        content:
          type: string
        source_content:
          type:
          - string
          - 'null'
          description: Transcription the content was translated from, if
            it is a translation
    Invoice:
      type: object
      description: Amounts are decimals as strings, e.g. "12.5".
      properties:
        id:
          type: integer
        number:
          type:
          - string
          - 'null'
          description: Invoice number, e.g. A-2026-000001
        type:
          type: string
          enum:
          - manual
          - ai_bookings
          - auto_upgrade
          - day_bookings
          - plan_change
          - scheduled_plan_change
          - new_subscription
          - subscription_renewal
        state:
          type: string
          enum:
          - draft
          - processing
          - paid
          - failed
          - uncollectible
        created_at:
          type: string
          format: date-time
        paid_at:
          type:
          - string
          - 'null'
          format: date-time
        currency:
          type: string
          description: ISO currency code, e.g. EUR
        net_amount:
          type: string
        total_amount:
          type: string
        tax:
          type: string
        tax_percentage:
          type: string
        items:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              net_amount:
                type: string
    Account:
      type: object
      properties:
        id:
          type: integer
        email:
          type: string
        name:
          type: string
          description: First and last name, empty if not given
        organization:
          type:
          - string
          - 'null'
        time_zone:
          type: string
          description: Time zone of statistics and dates, e.g. Europe/Vienna
        language:
          type: string
          description: Language of the web app and emails, e.g. en
        currency:
          type: string
          description: Currency of invoices, e.g. EUR
        tier:
          type:
          - string
          - 'null'
          description: |
            Plan of the account, e.g. light, smart or pro. Without an active
            plan it is null, the features of the last plan then stay
            available in test mode.
        has_payment_method:
          type: boolean
          description: |
            AI channels need free minutes left or a payment method,
            otherwise start-ai returns not_configured
        free_minutes:
          type: object
          description: Free minutes left
          properties:
            ai_translation:
              type: integer
            ai_live_captions:
              type: integer
        features:
          type: array
          description: Features of the plan and extra ones
          items:
            type: string
        participant_limit:
          type: integer
          description: |
            Participants allowed at the same time right now, of all events
            together (3 in test mode)
    Statistics:
      type: object
      properties:
        peak_participants:
          type: integer
          description: Most participants at the same time, ever
        current_participants:
          type: integer
        days:
          type: array
          description: |
            Most participants at the same time per day. Participants are all
            clients, which listen, view and/or read. Each metric peaks on its
            own, so they don't add up.
          items:
            type: object
            properties:
              date:
                type: string
                format: date
              participants:
                type: integer
              listeners:
                type: integer
              viewers:
                type: integer
              readers:
                type: integer
    Error:
      type: object
      properties:
        status:
          type: string
          enum:
          - error
        error:
          type: string
        details:
          description: Invalid fields or features
    InputLanguage:
      type: string
      description: Spoken language, e.g. de
      enum:
      - af
      - am
      - ar
      - az
      - bg
      - bn
      - bs
      - ca
      - cs
      - da
      - de
      - el
      - en
      - es
      - et
      - eu
      - fa
      - fi
      - fil
      - fr
      - ga
      - gl
      - he
      - hi
      - hr
      - hu
      - hy
      - id
      - is
      - it
      - ja
      - ka
      - kk
      - km
      - ko
      - lo
      - lt
      - lv
      - ne
      - nl
      - 'no'
      - mk
      - ml
      - mn
      - mr
      - ms
      - mt
      - my
      - pl
      - pa
      - pt-PT
      - pt-BR
      - ro
      - ru
      - sk
      - sl
      - so
      - sq
      - sr
      - sv
      - sw
      - ta
      - te
      - th
      - tr
      - uk
      - ur
      - vi
      - zh-HK
      - zh-CN
      - zh-TW
  responses:
    '400':
      description: Invalid JSON
      content:
        application/json:
          schema:
            allOf:
            - "$ref": "#/components/schemas/Error"
            - properties:
                error:
                  enum:
                  - invalid_json
    '401':
      description: Invalid API key or disabled API
      content:
        application/json:
          schema:
            allOf:
            - "$ref": "#/components/schemas/Error"
            - properties:
                error:
                  enum:
                  - invalid_api_key
                  - disabled_api
    '403':
      description: Feature not available or user banned
      content:
        application/json:
          schema:
            allOf:
            - "$ref": "#/components/schemas/Error"
            - properties:
                error:
                  enum:
                  - feature_not_available
                  - user_banned
    '404':
      description: Not found
      content:
        application/json:
          schema:
            allOf:
            - "$ref": "#/components/schemas/Error"
            - properties:
                error:
                  enum:
                  - not_found
    '413':
      description: Request body larger than 1 MB (10 MB for image uploads)
      content:
        application/json:
          schema:
            allOf:
            - "$ref": "#/components/schemas/Error"
            - properties:
                error:
                  enum:
                  - request_too_large
    '422':
      description: 'Invalid fields, nested like the fields, e.g. { "geolocation":
        { "radius": ["inclusion"] } } or, for records of lists, { "channel_groups":
        { "channel_ids": ["too_long"] } }. Errors of list records are not nested by
        index, those without a field stay on the list, e.g. { "channel_groups":
        ["invalid"] }. Field errors are unknown, read_only, wrong_type,
        invalid or those of the validations, e.g. blank, inclusion, too_long or limit_reached.
        Actions return already_in_state, not_in_state or not_configured.
        Transcript downloads return invalid_format for unknown formats.'
      content:
        application/json:
          schema:
            allOf:
            - "$ref": "#/components/schemas/Error"
            - properties:
                error:
                  enum:
                  - invalid_params
                  - already_in_state
                  - not_in_state
                  - not_configured
                  - invalid_format
    '429':
      description: Too many requests (60 per minute and 300 per hour, per IP address).
        The body is plain text, not JSON.
