{
  "openapi": "3.0.1",
  "info": {
    "title": "Voice kit API",
    "description": "**Authentication (direct):** `X-Api-Key` or `Authorization: Bearer`.\r\n\r\n**Authentication (RapidAPI Hub):** consumers send `X-RapidAPI-Key` and `X-RapidAPI-Host`.\r\nThe Rapid Runtime forwards `X-RapidAPI-Key` to this API.",
    "contact": {
      "name": "Voice kit API",
      "url": "https://ttsapi.ru"
    },
    "license": {
      "name": "Proprietary"
    },
    "version": "1.0.0"
  },
  "paths": {
    "/v1/analyze": {
      "post": {
        "tags": [
          "Analysis"
        ],
        "summary": "Start an asynchronous analysis job.",
        "description": "Upload an audio file (wav, mp3, ogg, flac up to 25 MB / 15 min).\r\nReturns a job ID immediately. Poll `GET /v1/analyze/{jobId}`\r\nfor the result.\r\n            \r\nFor short files (≤ 3 min) use the synchronous `POST /v1/analyze/sync`.",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "audio": {
                    "type": "string",
                    "format": "binary"
                  },
                  "language": {
                    "enum": [
                      "af",
                      "am",
                      "ar",
                      "as",
                      "az",
                      "ba",
                      "be",
                      "bg",
                      "bn",
                      "bo",
                      "br",
                      "bs",
                      "ca",
                      "cs",
                      "cy",
                      "da",
                      "de",
                      "el",
                      "en",
                      "es",
                      "et",
                      "eu",
                      "fa",
                      "fi",
                      "fo",
                      "fr",
                      "gl",
                      "gu",
                      "ha",
                      "haw",
                      "he",
                      "hi",
                      "hr",
                      "ht",
                      "hu",
                      "hy",
                      "id",
                      "is",
                      "it",
                      "ja",
                      "jw",
                      "ka",
                      "kk",
                      "km",
                      "kn",
                      "ko",
                      "la",
                      "lb",
                      "ln",
                      "lo",
                      "lt",
                      "lv",
                      "mg",
                      "mi",
                      "mk",
                      "ml",
                      "mn",
                      "mr",
                      "ms",
                      "mt",
                      "my",
                      "ne",
                      "nl",
                      "nn",
                      "no",
                      "oc",
                      "pa",
                      "pl",
                      "ps",
                      "pt",
                      "ro",
                      "ru",
                      "sa",
                      "sd",
                      "si",
                      "sk",
                      "sl",
                      "sn",
                      "so",
                      "sq",
                      "sr",
                      "su",
                      "sv",
                      "sw",
                      "ta",
                      "te",
                      "tg",
                      "th",
                      "tk",
                      "tl",
                      "tr",
                      "tt",
                      "uk",
                      "ur",
                      "uz",
                      "vi",
                      "yi",
                      "yo",
                      "zh",
                      "yue"
                    ],
                    "type": "string",
                    "description": "Optional language code (ISO 639-1). Omit to auto-detect. Supported values are language codes (ISO 639-1)."
                  },
                  "diarization": {
                    "type": "boolean",
                    "default": false
                  },
                  "webhookUrl": {
                    "type": "string"
                  },
                  "keyterms": {
                    "type": "string"
                  },
                  "clean": {
                    "type": "boolean",
                    "default": false
                  }
                }
              },
              "encoding": {
                "audio": {
                  "style": "form"
                },
                "language": {
                  "style": "form"
                },
                "diarization": {
                  "style": "form"
                },
                "webhookUrl": {
                  "style": "form"
                },
                "keyterms": {
                  "style": "form"
                },
                "clean": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnalysisJobResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/analyze/sync": {
      "post": {
        "tags": [
          "Analysis"
        ],
        "summary": "Analyze a short audio file synchronously.",
        "description": "Upload an audio file (wav, mp3, ogg, flac up to 10 MB / 3 min).\r\nReturns transcript, per-segment emotions, overall sentiment, keywords\r\nand entities. For longer files use `POST /v1/analyze` (async) and\r\npoll the returned job ID.",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "audio": {
                    "type": "string",
                    "format": "binary"
                  },
                  "language": {
                    "enum": [
                      "af",
                      "am",
                      "ar",
                      "as",
                      "az",
                      "ba",
                      "be",
                      "bg",
                      "bn",
                      "bo",
                      "br",
                      "bs",
                      "ca",
                      "cs",
                      "cy",
                      "da",
                      "de",
                      "el",
                      "en",
                      "es",
                      "et",
                      "eu",
                      "fa",
                      "fi",
                      "fo",
                      "fr",
                      "gl",
                      "gu",
                      "ha",
                      "haw",
                      "he",
                      "hi",
                      "hr",
                      "ht",
                      "hu",
                      "hy",
                      "id",
                      "is",
                      "it",
                      "ja",
                      "jw",
                      "ka",
                      "kk",
                      "km",
                      "kn",
                      "ko",
                      "la",
                      "lb",
                      "ln",
                      "lo",
                      "lt",
                      "lv",
                      "mg",
                      "mi",
                      "mk",
                      "ml",
                      "mn",
                      "mr",
                      "ms",
                      "mt",
                      "my",
                      "ne",
                      "nl",
                      "nn",
                      "no",
                      "oc",
                      "pa",
                      "pl",
                      "ps",
                      "pt",
                      "ro",
                      "ru",
                      "sa",
                      "sd",
                      "si",
                      "sk",
                      "sl",
                      "sn",
                      "so",
                      "sq",
                      "sr",
                      "su",
                      "sv",
                      "sw",
                      "ta",
                      "te",
                      "tg",
                      "th",
                      "tk",
                      "tl",
                      "tr",
                      "tt",
                      "uk",
                      "ur",
                      "uz",
                      "vi",
                      "yi",
                      "yo",
                      "zh",
                      "yue"
                    ],
                    "type": "string",
                    "description": "Optional language code (ISO 639-1). Omit to auto-detect. Supported values are language codes (ISO 639-1)."
                  },
                  "diarization": {
                    "type": "boolean",
                    "default": false
                  },
                  "emotions": {
                    "type": "boolean",
                    "default": true
                  },
                  "keywords": {
                    "type": "boolean",
                    "default": true
                  },
                  "entities": {
                    "type": "boolean",
                    "default": true
                  },
                  "keyterms": {
                    "type": "string"
                  },
                  "clean": {
                    "type": "boolean",
                    "default": false
                  }
                }
              },
              "encoding": {
                "audio": {
                  "style": "form"
                },
                "language": {
                  "style": "form"
                },
                "diarization": {
                  "style": "form"
                },
                "emotions": {
                  "style": "form"
                },
                "keywords": {
                  "style": "form"
                },
                "entities": {
                  "style": "form"
                },
                "keyterms": {
                  "style": "form"
                },
                "clean": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnalysisResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/analyze/{jobId}": {
      "get": {
        "tags": [
          "Analysis"
        ],
        "summary": "Poll an analysis job by ID.",
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnalysisJobStatusResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/detect-language": {
      "post": {
        "tags": [
          "Analysis"
        ],
        "summary": "Detect the language of a text snippet (no audio upload).",
        "description": "Text-only operation: returns the detected language code and confidence.\r\nUseful as a pre-step before choosing a voice or forcing a transcription language.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LanguageDetectionRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/LanguageDetectionRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/LanguageDetectionRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LanguageDetectionResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/redact": {
      "post": {
        "tags": [
          "Analysis"
        ],
        "summary": "Redact PII (names, phones, emails, ...) from raw text.",
        "description": "Text-only operation: returns the masked text plus the redacted spans with\r\ntheir character offsets. No audio upload.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RedactRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RedactRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RedactRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RedactResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/analyze/topics": {
      "post": {
        "tags": [
          "Analysis"
        ],
        "summary": "Classify raw text into topic buckets (no audio upload).",
        "description": "Text-only operation: returns the most relevant topics with relevance\r\nscores. No audio upload.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AnalyzeTopicsRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AnalyzeTopicsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AnalyzeTopicsRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnalyzeTopicsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/analyze/summarize": {
      "post": {
        "tags": [
          "Analysis"
        ],
        "summary": "Produce an extractive summary of raw text (no audio upload).",
        "description": "Text-only operation: returns the summary plus the selected sentences in\r\ntheir original order. No audio upload.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SummarizeRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SummarizeRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SummarizeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SummarizeResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/moderate": {
      "post": {
        "tags": [
          "Analysis"
        ],
        "summary": "Flag profanity, insults and hate speech in raw text (no audio upload).",
        "description": "Text-only operation: returns whether the text was flagged, an overall\r\nscore (0..1) and the matched terms with their categories. No audio upload.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ModerateRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ModerateRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ModerateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModerateResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/audio/clean": {
      "post": {
        "tags": [
          "AudioCleaning"
        ],
        "summary": "Start an asynchronous audio-cleaning job.",
        "description": "Upload an audio file (wav, mp3, ogg, flac up to 50 MB) plus optional\r\n`options` JSON and an optional `output_format`\r\n(wav | mp3 | ogg, default wav). Returns a job ID immediately.\r\n            \r\nWith no `options` the one-click preset is applied: moderate\r\ndenoise + peak normalization.\r\n            \r\n    {\"denoise\": {\"strength\": 0.8, \"stationary\": true},\r\n     \"normalize\": {\"target_db\": -1.0},\r\n     \"high_pass\": 80,\r\n     \"low_pass\": 12000}",
        "parameters": [
          {
            "name": "webhookUrl",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "audio": {
                    "type": "string",
                    "format": "binary"
                  },
                  "options": {
                    "type": "string"
                  },
                  "output_format": {
                    "type": "string"
                  }
                }
              },
              "encoding": {
                "audio": {
                  "style": "form"
                },
                "options": {
                  "style": "form"
                },
                "output_format": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AudioCleaningJobResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/audio/clean/{jobId}": {
      "get": {
        "tags": [
          "AudioCleaning"
        ],
        "summary": "Poll an audio-cleaning job by ID.",
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AudioCleaningJobStatusResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/audio/clean/{jobId}/audio": {
      "get": {
        "tags": [
          "AudioCleaning"
        ],
        "summary": "Download the cleaned audio for a completed audio-cleaning job.",
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/audio/effects": {
      "post": {
        "tags": [
          "AudioEffects"
        ],
        "summary": "Start an asynchronous audio-effects job.",
        "description": "Upload an audio file (wav, mp3, ogg, flac up to 50 MB) plus an\r\n`effects` JSON array and an optional `output_format`\r\n(wav | mp3 | ogg, default wav). Returns a job ID immediately.\r\n            \r\nExample `effects`:\r\n            \r\n    [\r\n      {\"type\": \"reverb\", \"room_size\": 0.5, \"wet_level\": 0.4},\r\n      {\"type\": \"compressor\", \"threshold_db\": -20, \"ratio\": 4},\r\n      {\"type\": \"eq\", \"bands\": [{\"freq\": 8000, \"gain_db\": 6, \"q\": 1.0}]}\r\n    ]",
        "parameters": [
          {
            "name": "webhookUrl",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "audio": {
                    "type": "string",
                    "format": "binary"
                  },
                  "effects": {
                    "type": "string"
                  },
                  "output_format": {
                    "type": "string"
                  }
                }
              },
              "encoding": {
                "audio": {
                  "style": "form"
                },
                "effects": {
                  "style": "form"
                },
                "output_format": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AudioEffectsJobResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/audio/effects/{jobId}": {
      "get": {
        "tags": [
          "AudioEffects"
        ],
        "summary": "Poll an audio-effects job by ID.",
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AudioEffectsJobStatusResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/audio/effects/{jobId}/audio": {
      "get": {
        "tags": [
          "AudioEffects"
        ],
        "summary": "Download the produced audio for a completed audio-effects job.",
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/batch/synthesize": {
      "post": {
        "tags": [
          "Batch"
        ],
        "summary": "Queue a batch of synthesis tasks.",
        "description": "Up to 20 items. Returns a batch ID immediately; poll\r\n`GET /v1/batch/{batchId}` for per-item audio (base64).",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BatchSynthesizeRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BatchSynthesizeRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BatchSynthesizeRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BatchAcceptedResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "200": {
            "description": "Binary audio. Content-Type matches the requested format (mp3 → audio/mpeg, wav, ogg).",
            "headers": {
              "X-Voice": {
                "description": "Resolved voice id, e.g. preset_anna.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Cache": {
                "description": "HIT if audio was served from cache, otherwise MISS.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Queue-Lane": {
                "description": "priority for Business, otherwise standard.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Characters": {
                "description": "Characters billed for this request.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Characters-Used": {
                "description": "Characters used in the current billing period after this request.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Characters-Limit": {
                "description": "Monthly character quota for the API key plan.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Characters-Remaining": {
                "description": "Characters left in the current period.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Audio-Duration-Ms": {
                "description": "Duration of the returned audio in milliseconds.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Correlation id for support and logs.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "audio/mpeg": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "audio/wav": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "audio/ogg": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/batch/analyze": {
      "post": {
        "tags": [
          "Batch"
        ],
        "summary": "Queue a batch of audio analysis tasks.",
        "description": "Up to 10 items, each with inline base64 audio. Returns a batch ID\r\nimmediately; poll `GET /v1/batch/{batchId}` for per-item analysis.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BatchAnalyzeRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BatchAnalyzeRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BatchAnalyzeRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BatchAcceptedResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/batch/{batchId}": {
      "get": {
        "tags": [
          "Batch"
        ],
        "summary": "Poll a batch by ID.",
        "parameters": [
          {
            "name": "batchId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BatchStatusResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/billing/balance": {
      "get": {
        "tags": [
          "Billing"
        ],
        "summary": "Current balance, plan and a page of transactions for the authenticated key.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 1
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BillingBalanceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/billing/topup": {
      "post": {
        "tags": [
          "Billing"
        ],
        "summary": "Create a card top-up payment for the authenticated key.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TopUpRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/TopUpRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/TopUpRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TopUpResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/usage": {
      "get": {
        "tags": [
          "Billing"
        ],
        "summary": "Current monthly character usage for the authenticated key.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UsageResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/eval": {
      "post": {
        "tags": [
          "Evaluation"
        ],
        "summary": "Evaluate speech quality against a reference text (WER).",
        "description": "Upload an audio file (wav, mp3, ogg, flac up to 25 MB / 3 min) and the\r\ntext it should contain. The clip is transcribed and the transcript is\r\naligned to the reference with a word error rate. Set\r\n`normalize=false` to keep case and punctuation in the comparison.\r\nTranscription seconds are billed against the plan's monthly quota.",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "audio": {
                    "type": "string",
                    "format": "binary"
                  },
                  "reference": {
                    "type": "string"
                  },
                  "language": {
                    "enum": [
                      "af",
                      "am",
                      "ar",
                      "as",
                      "az",
                      "ba",
                      "be",
                      "bg",
                      "bn",
                      "bo",
                      "br",
                      "bs",
                      "ca",
                      "cs",
                      "cy",
                      "da",
                      "de",
                      "el",
                      "en",
                      "es",
                      "et",
                      "eu",
                      "fa",
                      "fi",
                      "fo",
                      "fr",
                      "gl",
                      "gu",
                      "ha",
                      "haw",
                      "he",
                      "hi",
                      "hr",
                      "ht",
                      "hu",
                      "hy",
                      "id",
                      "is",
                      "it",
                      "ja",
                      "jw",
                      "ka",
                      "kk",
                      "km",
                      "kn",
                      "ko",
                      "la",
                      "lb",
                      "ln",
                      "lo",
                      "lt",
                      "lv",
                      "mg",
                      "mi",
                      "mk",
                      "ml",
                      "mn",
                      "mr",
                      "ms",
                      "mt",
                      "my",
                      "ne",
                      "nl",
                      "nn",
                      "no",
                      "oc",
                      "pa",
                      "pl",
                      "ps",
                      "pt",
                      "ro",
                      "ru",
                      "sa",
                      "sd",
                      "si",
                      "sk",
                      "sl",
                      "sn",
                      "so",
                      "sq",
                      "sr",
                      "su",
                      "sv",
                      "sw",
                      "ta",
                      "te",
                      "tg",
                      "th",
                      "tk",
                      "tl",
                      "tr",
                      "tt",
                      "uk",
                      "ur",
                      "uz",
                      "vi",
                      "yi",
                      "yo",
                      "zh",
                      "yue"
                    ],
                    "type": "string",
                    "description": "Optional language code (ISO 639-1). Omit to auto-detect. Supported values are language codes (ISO 639-1)."
                  },
                  "normalize": {
                    "type": "boolean"
                  }
                }
              },
              "encoding": {
                "audio": {
                  "style": "form"
                },
                "reference": {
                  "style": "form"
                },
                "language": {
                  "style": "form"
                },
                "normalize": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EvaluationResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/integrations/connections": {
      "get": {
        "tags": [
          "Integrations"
        ],
        "summary": "List the client's external connections (active and revoked).",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationConnectionsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Integrations"
        ],
        "summary": "Connect (or re-connect) an external system. The secret is encrypted at\r\nrest and never returned.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConnectIntegrationRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ConnectIntegrationRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ConnectIntegrationRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IntegrationConnectionResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/integrations/connections/{id}": {
      "delete": {
        "tags": [
          "Integrations"
        ],
        "summary": "Revoke a connection.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/integrations/{provider}/authorize": {
      "post": {
        "tags": [
          "Integrations"
        ],
        "summary": "Start an interactive OAuth handshake (roadmap: meeting autocapture).\r\nMeeting providers require `consent = true`.",
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OAuthAuthorizeRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/OAuthAuthorizeRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/OAuthAuthorizeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OAuthAuthorizeResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/integrations/{provider}/callback": {
      "get": {
        "tags": [
          "Integrations"
        ],
        "summary": "OAuth redirect target. Anonymous: the signed `state` proves the flow\r\nwas started by us, and the browser comes from the provider.",
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "code",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "state",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "error",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/v1/integrations/zoom/webhook": {
      "post": {
        "tags": [
          "Integrations"
        ],
        "summary": "Provider webhook (Zoom). Anonymous but signature-verified: the provider has\r\nno API key, and Zoom retries on non-2xx, so unknown events still answer 200.",
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/v1/meetings/protocol": {
      "post": {
        "tags": [
          "Meetings"
        ],
        "summary": "Generate a meeting protocol from a recording's transcript.",
        "description": "The `template` tailors the extraction to a meeting type\r\n(`custom`, `standup`, `demo`, `interview`,\r\n`retro`, `one_on_one`). The response includes the protocol\r\nfields, a Markdown rendering and the LLM model used.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MeetingProtocolRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MeetingProtocolRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MeetingProtocolRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MeetingProtocolResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/meetings/events": {
      "get": {
        "tags": [
          "Meetings"
        ],
        "summary": "List automatically captured meetings (roadmap: meeting autocapture).",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MeetingEventsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/meetings/events/{id}": {
      "get": {
        "tags": [
          "Meetings"
        ],
        "summary": "Fetch one captured meeting.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MeetingEventResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/meetings/events/{id}/target": {
      "put": {
        "tags": [
          "Meetings"
        ],
        "summary": "Point a captured meeting at a CRM target. A provider webhook has no deal\r\nid, so this is how an automation attaches the protocol to a deal.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MeetingEventTargetRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MeetingEventTargetRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MeetingEventTargetRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MeetingEventResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/meetings/events/{id}/retry": {
      "post": {
        "tags": [
          "Meetings"
        ],
        "summary": "Retry a captured meeting: reset its budget and make it due now.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MeetingEventResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/meetings/calendar": {
      "get": {
        "tags": [
          "Meetings"
        ],
        "summary": "List the calendar events stored by the pre-trigger pass (roadmap: calendar).",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CalendarEventsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/meetings/calendar/sync": {
      "post": {
        "tags": [
          "Meetings"
        ],
        "summary": "Read the client's calendar now instead of waiting for the next pass.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": { }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/meetings/events/{id}/calendar": {
      "post": {
        "tags": [
          "Meetings"
        ],
        "summary": "Write the meeting's protocol into its calendar event on demand.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CalendarWritebackResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/meetings/protocols": {
      "get": {
        "tags": [
          "Meetings"
        ],
        "summary": "List the client's persisted meeting protocols, newest first.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MeetingProtocolsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/meetings/protocols/{id}": {
      "get": {
        "tags": [
          "Meetings"
        ],
        "summary": "Fetch one persisted meeting protocol.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MeetingProtocolSummaryResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      },
      "put": {
        "tags": [
          "Meetings"
        ],
        "summary": "Edit a protocol's Markdown; an edit returns it to draft.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMeetingProtocolRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMeetingProtocolRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMeetingProtocolRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MeetingProtocolSummaryResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/meetings/protocols/{id}/approve": {
      "post": {
        "tags": [
          "Meetings"
        ],
        "summary": "Approve a draft protocol for CRM/SED delivery.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MeetingProtocolSummaryResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/meetings/protocols/{id}/export": {
      "get": {
        "tags": [
          "Meetings"
        ],
        "summary": "Export a meeting protocol as Markdown, DOCX or PDF.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "format",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/meetings/protocol/custom": {
      "post": {
        "tags": [
          "Meetings"
        ],
        "summary": "Generate a protocol against a client-defined schema (custom template).\r\nThe structure comes either inline or from a saved template.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomProtocolRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomProtocolRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CustomProtocolRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomProtocolResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/meetings/templates": {
      "get": {
        "tags": [
          "Meetings"
        ],
        "summary": "List the client's saved protocol templates.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProtocolTemplatesResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      },
      "post": {
        "tags": [
          "Meetings"
        ],
        "summary": "Create a reusable protocol template.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProtocolTemplateRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ProtocolTemplateRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ProtocolTemplateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProtocolTemplateResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/meetings/templates/{id}": {
      "put": {
        "tags": [
          "Meetings"
        ],
        "summary": "Update a saved protocol template.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProtocolTemplateRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ProtocolTemplateRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ProtocolTemplateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProtocolTemplateResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Meetings"
        ],
        "summary": "Delete a saved protocol template.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/qa/evaluate": {
      "post": {
        "tags": [
          "Qa"
        ],
        "summary": "Evaluate a recording against a QA checklist.",
        "description": "Each checklist item has an `id`, a `kind` (`required` or\r\n`forbidden`), a `description` and an optional `weight`.\r\nThe response returns a per-item verdict (`passed|failed|partial`)\r\nwith a reason, an evidence quote with timestamps, and a weighted\r\n0..100 score.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QaEvaluateRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/QaEvaluateRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/QaEvaluateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QaEvaluationResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/qa/analytics": {
      "get": {
        "tags": [
          "Qa"
        ],
        "summary": "Aggregated QA analytics for the caller over a time window.",
        "parameters": [
          {
            "name": "days",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 30
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QaAnalyticsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/qa/evaluations": {
      "get": {
        "tags": [
          "Qa"
        ],
        "summary": "List the caller's persisted QA evaluations, newest first.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 20
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QaEvaluationsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/qa/evaluations/export": {
      "get": {
        "tags": [
          "Qa"
        ],
        "summary": "Export the caller's QA evaluations as CSV or JSON for CRM import.",
        "parameters": [
          {
            "name": "format",
            "in": "query",
            "schema": {
              "type": "string",
              "default": "csv"
            }
          },
          {
            "name": "days",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 30
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "text/csv": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "text/csv": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "text/csv": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/recordings": {
      "get": {
        "tags": [
          "Recordings"
        ],
        "summary": "List the client's recordings, newest first.",
        "parameters": [
          {
            "name": "source",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "tag",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "folder",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32",
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecordingsListResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/recordings/tags": {
      "get": {
        "tags": [
          "Recordings"
        ],
        "summary": "Distinct tags across the client's recordings (for facets/autocomplete).",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecordingFacetsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/recordings/folders": {
      "get": {
        "tags": [
          "Recordings"
        ],
        "summary": "Distinct folders across the client's recordings (for facets/autocomplete).",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecordingFacetsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/recordings/from-link": {
      "post": {
        "tags": [
          "Recordings"
        ],
        "summary": "Start a diarized transcription from a public audio URL (Link channel, 7.9).\r\nThe server downloads the file; the recording is tagged with source \"link\".",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LinkRecordingRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/LinkRecordingRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/LinkRecordingRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TranscriptionJobResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/recordings/{id}": {
      "get": {
        "tags": [
          "Recordings"
        ],
        "summary": "Fetch a single recording's metadata.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecordingResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      },
      "patch": {
        "tags": [
          "Recordings"
        ],
        "summary": "Update a recording's tags and/or folder. Fields are optional and follow\r\nPATCH semantics: `null` clears a field, an absent field is left\r\nuntouched.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": { }
            },
            "text/json": {
              "schema": { }
            },
            "application/*+json": {
              "schema": { }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecordingResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Recordings"
        ],
        "summary": "Delete a recording and its stored audio.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/recordings/{id}/transcript": {
      "get": {
        "tags": [
          "Recordings"
        ],
        "summary": "Fetch a recording's transcript.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TranscriptionResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/recordings/{id}/speakers": {
      "get": {
        "tags": [
          "Recordings"
        ],
        "summary": "Fetch a recording's speakers, timeline and conversation metrics.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecordingSpeakersResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/recordings/{id}/speakers/{speakerId}": {
      "patch": {
        "tags": [
          "Recordings"
        ],
        "summary": "Rename a speaker or assign a role (operator/client/participant).",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "speakerId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": { }
            },
            "text/json": {
              "schema": { }
            },
            "application/*+json": {
              "schema": { }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecordingSpeakerResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/recordings/{id}/audio": {
      "get": {
        "tags": [
          "Recordings"
        ],
        "summary": "Download a recording's stored audio.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/recordings/{id}/export": {
      "get": {
        "tags": [
          "Recordings"
        ],
        "summary": "Export a recording's transcript (txt, md, srt, vtt, docx, pdf).",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "format",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/recordings/{id}/share": {
      "post": {
        "tags": [
          "Recordings"
        ],
        "summary": "Create a public share link for a recording.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ShareCreateRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ShareCreateRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ShareCreateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecordingShareResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      },
      "get": {
        "tags": [
          "Recordings"
        ],
        "summary": "List the active share links for a recording.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/RecordingShareResponse"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/recordings/{id}/share/{token}": {
      "delete": {
        "tags": [
          "Recordings"
        ],
        "summary": "Revoke a share link.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "token",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/recordings/{id}/push": {
      "post": {
        "tags": [
          "Recordings"
        ],
        "summary": "Push a recording artefact (transcript, protocol or QA report) to a\r\nconnected CRM/SED. Idempotent per (recording, provider, kind).",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecordingCrmPushRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RecordingCrmPushRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RecordingCrmPushRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecordingCrmPushResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/recordings/{id}/pushes": {
      "get": {
        "tags": [
          "Recordings"
        ],
        "summary": "List the CRM/SED pushes recorded for a recording.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecordingCrmPushesResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/recordings/{id}/pushes/{provider}/{kind}/retry": {
      "post": {
        "tags": [
          "Recordings"
        ],
        "summary": "Retry a previous push, reusing the target stored with it.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "kind",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecordingCrmPushResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/search": {
      "post": {
        "tags": [
          "Search"
        ],
        "summary": "Search the client's recording transcripts semantically.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SearchRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SearchRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SearchRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/ask": {
      "post": {
        "tags": [
          "Search"
        ],
        "summary": "Answer a question from the client's recordings (RAG), with citations.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AskRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AskRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AskRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AskResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/synthesize": {
      "post": {
        "tags": [
          "Speech"
        ],
        "summary": "Synthesize Russian speech and return an audio file.",
        "description": "Returns **binary audio** (not JSON). Set `Accept` if you prefer a specific Content-Type; otherwise `format` in the body selects it.\r\n            \r\nExample:\r\n            \r\n    POST /v1/synthesize\r\n    X-Api-Key: YOUR_KEY\r\n    {\r\n       \"text\": \"Привет! Это демонстрация синтеза русской речи.\",\r\n       \"voice\": \"preset_anna\",\r\n       \"format\": \"mp3\",\r\n       \"sample_rate\": 24000,\r\n       \"speed\": 1.0,\r\n       \"emotion\": \"neutral\",\r\n       \"effects\": \"[{\\\"type\\\": \\\"reverb\\\", \\\"room_size\\\": 0.5}]\"\r\n    }\r\n            \r\n`effects` is an optional JSON-encoded string holding an array of effect\r\ndescriptors (reverb, compressor, eq, distortion, chorus, pitch, timestretch).\r\nIt requires a Pro/Business plan and is applied to the audio after synthesis,\r\nbefore it is encoded into the requested format.\r\n            \r\nErrors are RFC 7807 Problem Details with a `code` field.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SynthesizeRequestDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SynthesizeRequestDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SynthesizeRequestDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Binary audio. Content-Type matches the requested format (mp3 → audio/mpeg, wav, ogg).",
            "headers": {
              "X-Voice": {
                "description": "Resolved voice id, e.g. preset_anna.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Cache": {
                "description": "HIT if audio was served from cache, otherwise MISS.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Queue-Lane": {
                "description": "priority for Business, otherwise standard.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Characters": {
                "description": "Characters billed for this request.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Characters-Used": {
                "description": "Characters used in the current billing period after this request.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Characters-Limit": {
                "description": "Monthly character quota for the API key plan.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Characters-Remaining": {
                "description": "Characters left in the current period.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Audio-Duration-Ms": {
                "description": "Duration of the returned audio in milliseconds.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Correlation id for support and logs.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "audio/mpeg": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "audio/wav": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "audio/ogg": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/synthesize/stream": {
      "post": {
        "tags": [
          "Speech"
        ],
        "summary": "Stream audio chunks as they are produced. Pro and Business plans only.",
        "description": "Same body as /v1/synthesize. Response is an unbuffered audio byte stream.\r\nFree/Basic receive 403 `streaming_forbidden`. Audio effects (`effects`) are\r\nnot supported for streaming synthesis.",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SynthesizeRequestDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SynthesizeRequestDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SynthesizeRequestDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Binary audio. Content-Type matches the requested format (mp3 → audio/mpeg, wav, ogg).",
            "headers": {
              "X-Voice": {
                "description": "Resolved voice id, e.g. preset_anna.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Cache": {
                "description": "HIT if audio was served from cache, otherwise MISS.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Queue-Lane": {
                "description": "priority for Business, otherwise standard.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Characters": {
                "description": "Characters billed for this request.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Characters-Used": {
                "description": "Characters used in the current billing period after this request.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Characters-Limit": {
                "description": "Monthly character quota for the API key plan.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Characters-Remaining": {
                "description": "Characters left in the current period.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Audio-Duration-Ms": {
                "description": "Duration of the returned audio in milliseconds.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Correlation id for support and logs.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "audio/mpeg": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "audio/wav": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "audio/ogg": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/synthesize/async": {
      "post": {
        "tags": [
          "Speech"
        ],
        "summary": "Start an asynchronous long-form synthesis job (audiobook / long article).",
        "description": "Queue a long text (up to the deployment's long-form character limit) and\r\nget a job ID immediately. The text is split into paragraphs, each\r\nsynthesized through the standard pipeline, and the clips are concatenated\r\ninto a single sample-accurate **WAV** with a timed audiobook manifest.\r\n            \r\nPoll `GET /v1/synthesize/async/{jobId}` for the manifest, then\r\ndownload the audio from `GET /v1/synthesize/async/{jobId}/audio`.\r\nPass `webhookUrl` as a query parameter to be notified on completion.",
        "parameters": [
          {
            "name": "webhookUrl",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SynthesizeRequestDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SynthesizeRequestDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SynthesizeRequestDto"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SynthesisJobResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/synthesize/async/{jobId}": {
      "get": {
        "tags": [
          "Speech"
        ],
        "summary": "Poll a long-form synthesis job by ID.",
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SynthesisJobStatusResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/synthesize/async/{jobId}/audio": {
      "get": {
        "tags": [
          "Speech"
        ],
        "summary": "Download the produced audio for a completed long-form synthesis job.",
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/transcribe": {
      "post": {
        "tags": [
          "Transcription"
        ],
        "summary": "Start an asynchronous transcription job.",
        "description": "Upload an audio file (wav, mp3, ogg, flac up to 25 MB / 15 min).\r\nReturns a job ID immediately. Poll `GET /v1/transcribe/{jobId}`\r\nfor the result.\r\n            \r\nFor short files (≤ 3 min) use the synchronous `POST /v1/transcribe/sync`.\r\nFor long files (up to 512 MB / 4 h) pass `long_form=true` — the file\r\nis split on VAD pauses and transcribed in chunks (Pro/Business plans).",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "audio": {
                    "type": "string",
                    "format": "binary"
                  },
                  "language": {
                    "enum": [
                      "af",
                      "am",
                      "ar",
                      "as",
                      "az",
                      "ba",
                      "be",
                      "bg",
                      "bn",
                      "bo",
                      "br",
                      "bs",
                      "ca",
                      "cs",
                      "cy",
                      "da",
                      "de",
                      "el",
                      "en",
                      "es",
                      "et",
                      "eu",
                      "fa",
                      "fi",
                      "fo",
                      "fr",
                      "gl",
                      "gu",
                      "ha",
                      "haw",
                      "he",
                      "hi",
                      "hr",
                      "ht",
                      "hu",
                      "hy",
                      "id",
                      "is",
                      "it",
                      "ja",
                      "jw",
                      "ka",
                      "kk",
                      "km",
                      "kn",
                      "ko",
                      "la",
                      "lb",
                      "ln",
                      "lo",
                      "lt",
                      "lv",
                      "mg",
                      "mi",
                      "mk",
                      "ml",
                      "mn",
                      "mr",
                      "ms",
                      "mt",
                      "my",
                      "ne",
                      "nl",
                      "nn",
                      "no",
                      "oc",
                      "pa",
                      "pl",
                      "ps",
                      "pt",
                      "ro",
                      "ru",
                      "sa",
                      "sd",
                      "si",
                      "sk",
                      "sl",
                      "sn",
                      "so",
                      "sq",
                      "sr",
                      "su",
                      "sv",
                      "sw",
                      "ta",
                      "te",
                      "tg",
                      "th",
                      "tk",
                      "tl",
                      "tr",
                      "tt",
                      "uk",
                      "ur",
                      "uz",
                      "vi",
                      "yi",
                      "yo",
                      "zh",
                      "yue"
                    ],
                    "type": "string",
                    "description": "Optional language code (ISO 639-1). Omit to auto-detect. Supported values are language codes (ISO 639-1)."
                  },
                  "diarization": {
                    "type": "boolean",
                    "default": false
                  },
                  "webhookUrl": {
                    "type": "string"
                  },
                  "keyterms": {
                    "type": "string"
                  },
                  "clean": {
                    "type": "boolean",
                    "default": false
                  },
                  "longForm": {
                    "type": "boolean",
                    "default": false
                  }
                }
              },
              "encoding": {
                "audio": {
                  "style": "form"
                },
                "language": {
                  "style": "form"
                },
                "diarization": {
                  "style": "form"
                },
                "webhookUrl": {
                  "style": "form"
                },
                "keyterms": {
                  "style": "form"
                },
                "clean": {
                  "style": "form"
                },
                "longForm": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TranscriptionJobResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/transcribe/sync": {
      "post": {
        "tags": [
          "Transcription"
        ],
        "summary": "Transcribe a short audio file synchronously.",
        "description": "Maximum 3 minutes. For longer files use `POST /v1/transcribe` (async)\r\nand poll the returned job ID.",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "audio": {
                    "type": "string",
                    "format": "binary"
                  },
                  "language": {
                    "enum": [
                      "af",
                      "am",
                      "ar",
                      "as",
                      "az",
                      "ba",
                      "be",
                      "bg",
                      "bn",
                      "bo",
                      "br",
                      "bs",
                      "ca",
                      "cs",
                      "cy",
                      "da",
                      "de",
                      "el",
                      "en",
                      "es",
                      "et",
                      "eu",
                      "fa",
                      "fi",
                      "fo",
                      "fr",
                      "gl",
                      "gu",
                      "ha",
                      "haw",
                      "he",
                      "hi",
                      "hr",
                      "ht",
                      "hu",
                      "hy",
                      "id",
                      "is",
                      "it",
                      "ja",
                      "jw",
                      "ka",
                      "kk",
                      "km",
                      "kn",
                      "ko",
                      "la",
                      "lb",
                      "ln",
                      "lo",
                      "lt",
                      "lv",
                      "mg",
                      "mi",
                      "mk",
                      "ml",
                      "mn",
                      "mr",
                      "ms",
                      "mt",
                      "my",
                      "ne",
                      "nl",
                      "nn",
                      "no",
                      "oc",
                      "pa",
                      "pl",
                      "ps",
                      "pt",
                      "ro",
                      "ru",
                      "sa",
                      "sd",
                      "si",
                      "sk",
                      "sl",
                      "sn",
                      "so",
                      "sq",
                      "sr",
                      "su",
                      "sv",
                      "sw",
                      "ta",
                      "te",
                      "tg",
                      "th",
                      "tk",
                      "tl",
                      "tr",
                      "tt",
                      "uk",
                      "ur",
                      "uz",
                      "vi",
                      "yi",
                      "yo",
                      "zh",
                      "yue"
                    ],
                    "type": "string",
                    "description": "Optional language code (ISO 639-1). Omit to auto-detect. Supported values are language codes (ISO 639-1)."
                  },
                  "diarization": {
                    "type": "boolean",
                    "default": false
                  },
                  "keyterms": {
                    "type": "string"
                  },
                  "clean": {
                    "type": "boolean",
                    "default": false
                  }
                }
              },
              "encoding": {
                "audio": {
                  "style": "form"
                },
                "language": {
                  "style": "form"
                },
                "diarization": {
                  "style": "form"
                },
                "keyterms": {
                  "style": "form"
                },
                "clean": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TranscriptionResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/transcribe/{jobId}": {
      "get": {
        "tags": [
          "Transcription"
        ],
        "summary": "Poll a transcription job by ID.",
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobStatusResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/transcribe/{jobId}/subtitles": {
      "get": {
        "tags": [
          "Transcription"
        ],
        "summary": "Download subtitles (VTT or SRT) for a completed transcription job.",
        "description": "Requires the job to be `completed`. Pass `format=vtt` (default)\r\nor `format=srt`. Optionally translate the captions with\r\n`target_language=en` and mark fast/unclear speech with\r\n`hot_marks=true`. Returns subtitle text, not JSON.",
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "format",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "target_language",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "hot_marks",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "text/vtt": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/x-subrip": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "text/vtt": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/x-subrip": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "text/vtt": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/x-subrip": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "text/vtt": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/x-subrip": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "text/vtt": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/x-subrip": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/transcribe/{jobId}/translate": {
      "post": {
        "tags": [
          "Transcription"
        ],
        "summary": "Translate a completed transcription job's transcript.",
        "description": "Requires the job to be `completed`. The transcript is translated\r\nsegment by segment (timestamps and speakers are preserved) and billed\r\nagainst the plan's monthly LLM token budget.",
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TranslateTranscriptRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/TranslateTranscriptRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/TranslateTranscriptRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TranslateTranscriptResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/vad": {
      "post": {
        "tags": [
          "Transcription"
        ],
        "summary": "Detect speech segments in an audio file (Silero VAD / turn detection).",
        "description": "Upload an audio file (wav, mp3, ogg, flac up to 25 MB / 15 min) and get\r\nthe list of speech intervals. A turn-detection primitive and a pre-step\r\nbefore real-time streaming (`WS /v1/transcribe/stream`).",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "audio": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              },
              "encoding": {
                "audio": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VadResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/video/effects": {
      "post": {
        "tags": [
          "VideoEffects"
        ],
        "summary": "Start an asynchronous video-effects job.",
        "description": "Upload a video file (mp4/webm up to the deployment limit) plus an\r\n`effects` JSON array, a `mode` (mux | audio) and an optional\r\n`output_format` (mp4 | webm for mux, wav | mp3 | ogg for audio).\r\nFor `mode=mux` an optional `audio` file is applied and muxed\r\ninto the video; without it the video's own audio track is processed.",
        "parameters": [
          {
            "name": "webhookUrl",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "video": {
                    "type": "string",
                    "format": "binary"
                  },
                  "audio": {
                    "type": "string",
                    "format": "binary"
                  },
                  "effects": {
                    "type": "string"
                  },
                  "mode": {
                    "type": "string"
                  },
                  "output_format": {
                    "type": "string"
                  }
                }
              },
              "encoding": {
                "video": {
                  "style": "form"
                },
                "audio": {
                  "style": "form"
                },
                "effects": {
                  "style": "form"
                },
                "mode": {
                  "style": "form"
                },
                "output_format": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VideoEffectsJobResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/video/effects/{jobId}": {
      "get": {
        "tags": [
          "VideoEffects"
        ],
        "summary": "Poll a video-effects job by ID.",
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VideoEffectsJobStatusResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/video/effects/{jobId}/file": {
      "get": {
        "tags": [
          "VideoEffects"
        ],
        "summary": "Download the produced artifact for a completed video-effects job.",
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "video/mp4": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "video/webm": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "video/mp4": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "video/webm": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/wav": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/mpeg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "audio/ogg": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/voice-id": {
      "post": {
        "tags": [
          "VoiceId"
        ],
        "summary": "Analyze a voice recording and return a voice passport.",
        "description": "Upload an audio file (wav, mp3, ogg, flac up to 25 MB / 3 min). Returns\r\nlanguage, gender, age group, emotional background, a speaker embedding\r\n(fingerprint) and an AI-vs-human probability (beta).\r\n            \r\nThe AI-vs-human probability is only present when the anti-spoofing\r\ndetector is configured; otherwise it is null and\r\n`fake_detection_available` is false.",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "audio": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              },
              "encoding": {
                "audio": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VoiceIdResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/voice-id/enroll": {
      "post": {
        "tags": [
          "VoiceId"
        ],
        "summary": "Enroll an audio clip as a reusable voice profile (voiceprint).",
        "description": "Set `consent=true` after obtaining the speaker's explicit consent.",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "audio": {
                    "type": "string",
                    "format": "binary"
                  },
                  "name": {
                    "type": "string"
                  },
                  "consent": {
                    "type": "boolean",
                    "default": false
                  }
                }
              },
              "encoding": {
                "audio": {
                  "style": "form"
                },
                "name": {
                  "style": "form"
                },
                "consent": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EnrollVoiceProfileResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/voice-id/verify": {
      "post": {
        "tags": [
          "VoiceId"
        ],
        "summary": "Verify an audio clip against an enrolled profile (1:1).",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "audio": {
                    "type": "string",
                    "format": "binary"
                  },
                  "profile_id": {
                    "type": "string"
                  }
                }
              },
              "encoding": {
                "audio": {
                  "style": "form"
                },
                "profile_id": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VoiceVerificationResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/voice-id/identify": {
      "post": {
        "tags": [
          "VoiceId"
        ],
        "summary": "Identify the closest matching profile for an audio clip (1:N).",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "audio": {
                    "type": "string",
                    "format": "binary"
                  },
                  "profile_ids": {
                    "type": "string"
                  }
                }
              },
              "encoding": {
                "audio": {
                  "style": "form"
                },
                "profile_ids": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VoiceIdentificationResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/voice-id/profiles": {
      "get": {
        "tags": [
          "VoiceId"
        ],
        "summary": "List the caller's enrolled voice profiles.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/VoiceProfileResponse"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/voice-id/profiles/{profileId}": {
      "delete": {
        "tags": [
          "VoiceId"
        ],
        "summary": "Delete an enrolled voice profile by id.",
        "parameters": [
          {
            "name": "profileId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/voices/clone": {
      "post": {
        "tags": [
          "Voices"
        ],
        "summary": "Create a cloned voice from one reference audio sample and its transcript.",
        "description": "Upload one clean audio sample of the speaker (wav/mp3/ogg/flac/m4a/aac,\r\nup to 10 MB) together with `prompt_text` — the exact transcript of the\r\nreference clip (CosyVoice zero-shot conditioning). The returned id is used\r\nas `voice` together with `model=premium` in `/v1/synthesize`.\r\n            \r\nSet `consent=true` only after the speaker has explicitly agreed to voice\r\ncloning; the attestation version and expiry are stored with the clone.\r\nThe service prepares the reference itself: the sample is denoised and\r\nnormalized, converted to the model's 24 kHz mono, transcribed, and\r\ntrimmed to a window of complete sentences (8-15 s) when the upload is\r\nlonger. The stored transcript always matches the stored audio, so a\r\n`prompt_text` that drifted from the recording is corrected automatically.\r\n`clean` is kept for compatibility and no longer changes anything.\r\n            \r\nAfter saving, the engine reads a short canary phrase with the new clone.\r\nA reference that conditions the engine poorly makes CosyVoice stop\r\nspeaking before the text ends, so such a clone would return truncated\r\naudio for every long request. In that case the clone is removed and the\r\nrequest fails with 400 `clone_samples_invalid`, describing how far the\r\ncanary got and how to fix the reference (use a clean 8-15 second\r\nrecording of a single speaker whose transcript matches word for word).",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "prompt_text": {
                    "type": "string"
                  },
                  "samples": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "language": {
                    "enum": [
                      "af",
                      "am",
                      "ar",
                      "as",
                      "az",
                      "ba",
                      "be",
                      "bg",
                      "bn",
                      "bo",
                      "br",
                      "bs",
                      "ca",
                      "cs",
                      "cy",
                      "da",
                      "de",
                      "el",
                      "en",
                      "es",
                      "et",
                      "eu",
                      "fa",
                      "fi",
                      "fo",
                      "fr",
                      "gl",
                      "gu",
                      "ha",
                      "haw",
                      "he",
                      "hi",
                      "hr",
                      "ht",
                      "hu",
                      "hy",
                      "id",
                      "is",
                      "it",
                      "ja",
                      "jw",
                      "ka",
                      "kk",
                      "km",
                      "kn",
                      "ko",
                      "la",
                      "lb",
                      "ln",
                      "lo",
                      "lt",
                      "lv",
                      "mg",
                      "mi",
                      "mk",
                      "ml",
                      "mn",
                      "mr",
                      "ms",
                      "mt",
                      "my",
                      "ne",
                      "nl",
                      "nn",
                      "no",
                      "oc",
                      "pa",
                      "pl",
                      "ps",
                      "pt",
                      "ro",
                      "ru",
                      "sa",
                      "sd",
                      "si",
                      "sk",
                      "sl",
                      "sn",
                      "so",
                      "sq",
                      "sr",
                      "su",
                      "sv",
                      "sw",
                      "ta",
                      "te",
                      "tg",
                      "th",
                      "tk",
                      "tl",
                      "tr",
                      "tt",
                      "uk",
                      "ur",
                      "uz",
                      "vi",
                      "yi",
                      "yo",
                      "zh",
                      "yue"
                    ],
                    "type": "string",
                    "description": "Optional language code (ISO 639-1). Omit to auto-detect. Supported values are language codes (ISO 639-1)."
                  },
                  "clean": {
                    "type": "boolean",
                    "default": false
                  },
                  "consent": {
                    "type": "boolean",
                    "default": false
                  }
                }
              },
              "encoding": {
                "name": {
                  "style": "form"
                },
                "prompt_text": {
                  "style": "form"
                },
                "samples": {
                  "style": "form"
                },
                "language": {
                  "style": "form"
                },
                "clean": {
                  "style": "form"
                },
                "consent": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CloneVoiceResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request. Body is RFC 7807 with extension field `code`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Plan does not allow this operation (streaming or premium engine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "Text exceeds the plan or request character limit.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The synthesis engine is unavailable, or the premium engine was requested but is not enabled.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      },
      "get": {
        "tags": [
          "Voices"
        ],
        "summary": "List the caller's cloned voices.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CloneVoiceResponse"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/voices/clone/{id}": {
      "get": {
        "tags": [
          "Voices"
        ],
        "summary": "Get one cloned voice by id.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CloneVoiceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      },
      "delete": {
        "tags": [
          "Voices"
        ],
        "summary": "Delete a cloned voice (and its reference latents).",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "No Content"
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "429": {
            "description": "Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/voices": {
      "get": {
        "tags": [
          "Voices"
        ],
        "summary": "List available voices and supported synthesis settings.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/VoiceDto"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/voices/{id}": {
      "get": {
        "tags": [
          "Voices"
        ],
        "summary": "Get one voice by id.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Voice id, e.g. preset_anna.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VoiceDto"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/v1/webhooks/secret": {
      "get": {
        "tags": [
          "WebhookSettings"
        ],
        "summary": "Get (or lazily create) the webhook signing secret.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookSecretResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    },
    "/v1/webhooks/secret/rotate": {
      "post": {
        "tags": [
          "WebhookSettings"
        ],
        "summary": "Rotate the webhook signing secret. The old secret stops working immediately.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookSecretResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Voice was not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              },
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKey": [ ]
          },
          {
            "RapidApiKey": [ ]
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "AnalysisJobResponse": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "description": "Job id to poll via GET /v1/analyze/{jobId}."
          },
          "status": {
            "type": "string",
            "description": "Initial job status (always \"queued\")."
          },
          "estimated_seconds": {
            "type": "integer",
            "description": "Rough estimate of processing time in seconds.",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Async analysis job acceptance response (HTTP 202)."
      },
      "AnalysisJobStatusResponse": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "description": "Job id."
          },
          "status": {
            "type": "string",
            "description": "queued | processing | completed | failed."
          },
          "result": {
            "$ref": "#/components/schemas/AnalysisResponse"
          },
          "error_code": {
            "type": "string",
            "description": "Error code (present when status=failed).",
            "nullable": true
          },
          "error_message": {
            "type": "string",
            "description": "Error message (present when status=failed).",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Analysis job status poll response."
      },
      "AnalysisResponse": {
        "type": "object",
        "properties": {
          "transcript": {
            "type": "string",
            "description": "Complete transcript."
          },
          "segments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TranscriptionSegmentResponse"
            },
            "description": "Time-sliced segments."
          },
          "language": {
            "type": "string",
            "description": "Detected language code."
          },
          "language_confidence": {
            "type": "number",
            "description": "Language confidence (0..1).",
            "format": "double"
          },
          "duration_seconds": {
            "type": "number",
            "description": "Audio duration in seconds.",
            "format": "double"
          },
          "processing_time_ms": {
            "type": "integer",
            "description": "Processing time in milliseconds.",
            "format": "int64"
          },
          "sentiment": {
            "$ref": "#/components/schemas/SentimentResponse"
          },
          "keywords": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KeywordResponse"
            },
            "description": "Extracted keywords (when enabled)."
          },
          "entities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EntityResponse"
            },
            "description": "Named entities (when enabled)."
          },
          "speakers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SpeakerResponse"
            },
            "description": "Speaker summary (when diarization enabled).",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Full audio analysis response."
      },
      "AnalyzeTopicsRequest": {
        "required": [
          "text"
        ],
        "type": "object",
        "properties": {
          "text": {
            "maxLength": 5000,
            "minLength": 1,
            "type": "string",
            "description": "Text to classify. Required. Max 5000 characters."
          },
          "language": {
            "type": "string",
            "description": "Optional source language hint (e.g. \"ru\").",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request body for POST /v1/analyze/topics."
      },
      "AnalyzeTopicsResponse": {
        "type": "object",
        "properties": {
          "topics": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TopicScoreResponse"
            },
            "description": "Detected topics ordered by relevance (most relevant first)."
          }
        },
        "additionalProperties": false,
        "description": "Result of topic classification."
      },
      "AskCitationResponse": {
        "type": "object",
        "properties": {
          "recording_id": {
            "type": "string"
          },
          "quote": {
            "type": "string"
          },
          "start": {
            "type": "number",
            "format": "double"
          },
          "end": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "AskRequest": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Question to answer from the client's recordings."
          }
        },
        "additionalProperties": false,
        "description": "Request body for `POST /v1/ask`."
      },
      "AskResponse": {
        "type": "object",
        "properties": {
          "answer": {
            "type": "string"
          },
          "citations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AskCitationResponse"
            }
          },
          "llm_model": {
            "type": "string",
            "description": "LLM model that produced the answer (null when no context found).",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Response for `POST /v1/ask`."
      },
      "AudioCleaningJobResponse": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "description": "Job id to poll via GET /v1/audio/clean/{jobId}."
          },
          "status": {
            "type": "string",
            "description": "Initial job status (always \"queued\")."
          },
          "estimated_seconds": {
            "type": "integer",
            "description": "Rough estimate of processing time in seconds.",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Async audio-cleaning acceptance response (HTTP 202)."
      },
      "AudioCleaningJobStatusResponse": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "description": "Job id."
          },
          "status": {
            "type": "string",
            "description": "queued | processing | completed | failed."
          },
          "result": {
            "$ref": "#/components/schemas/AudioCleaningManifestResponse"
          },
          "error_code": {
            "type": "string",
            "description": "Error code (present when status=failed).",
            "nullable": true
          },
          "error_message": {
            "type": "string",
            "description": "Error message (present when status=failed).",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Audio-cleaning job poll response."
      },
      "AudioCleaningManifestResponse": {
        "type": "object",
        "properties": {
          "duration_milliseconds": {
            "type": "integer",
            "description": "Cleaned audio duration in milliseconds.",
            "format": "int32"
          },
          "format": {
            "type": "string",
            "description": "Output format: wav | mp3 | ogg."
          },
          "audio_size_bytes": {
            "type": "integer",
            "description": "Output audio size in bytes.",
            "format": "int32"
          },
          "audio_path": {
            "type": "string",
            "description": "Relative path to download the audio."
          }
        },
        "additionalProperties": false,
        "description": "Result manifest of a completed audio-cleaning job."
      },
      "AudioEffectsJobResponse": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "description": "Job id to poll via GET /v1/audio/effects/{jobId}."
          },
          "status": {
            "type": "string",
            "description": "Initial job status (always \"queued\")."
          },
          "estimated_seconds": {
            "type": "integer",
            "description": "Rough estimate of processing time in seconds.",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Async audio-effects acceptance response (HTTP 202)."
      },
      "AudioEffectsJobStatusResponse": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "description": "Job id."
          },
          "status": {
            "type": "string",
            "description": "queued | processing | completed | failed."
          },
          "result": {
            "$ref": "#/components/schemas/AudioEffectsManifestResponse"
          },
          "error_code": {
            "type": "string",
            "description": "Error code (present when status=failed).",
            "nullable": true
          },
          "error_message": {
            "type": "string",
            "description": "Error message (present when status=failed).",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Audio-effects job poll response."
      },
      "AudioEffectsManifestResponse": {
        "type": "object",
        "properties": {
          "duration_milliseconds": {
            "type": "integer",
            "description": "Processed audio duration in milliseconds.",
            "format": "int32"
          },
          "format": {
            "type": "string",
            "description": "Output format: wav | mp3 | ogg."
          },
          "audio_size_bytes": {
            "type": "integer",
            "description": "Output audio size in bytes.",
            "format": "int32"
          },
          "audio_path": {
            "type": "string",
            "description": "Relative path to download the audio."
          }
        },
        "additionalProperties": false,
        "description": "Result manifest of a completed audio-effects job."
      },
      "BalanceTransactionItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "type": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "amount_rub": {
            "type": "number",
            "format": "double"
          },
          "method": {
            "type": "string"
          },
          "tx_hash": {
            "type": "string",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "A single ledger entry."
      },
      "BatchAcceptedResponse": {
        "type": "object",
        "properties": {
          "batch_id": {
            "type": "string",
            "description": "Batch id to poll via GET /v1/batch/{batchId}."
          },
          "status": {
            "type": "string",
            "description": "Initial batch status (always \"queued\")."
          },
          "item_count": {
            "type": "integer",
            "description": "Number of items in the batch.",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Batch acceptance response (HTTP 202)."
      },
      "BatchAnalyzeItemDto": {
        "required": [
          "audio"
        ],
        "type": "object",
        "properties": {
          "audio": {
            "minLength": 1,
            "type": "string",
            "description": "Audio file as base64 (wav, mp3, ogg, flac)."
          },
          "language": {
            "type": "string",
            "description": "Language code (auto-detected when omitted).",
            "nullable": true
          },
          "diarization": {
            "type": "boolean",
            "description": "Speaker diarization (requires Basic or higher)."
          },
          "emotions": {
            "type": "boolean",
            "description": "Per-segment emotion labels. Default true."
          },
          "keywords": {
            "type": "boolean",
            "description": "Keyword extraction. Default true."
          },
          "entities": {
            "type": "boolean",
            "description": "Named entity extraction. Default true."
          },
          "keyterms": {
            "type": "string",
            "description": "Comma-separated keyterms for keyterm prompting (max 20).",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One analysis task inside a batch."
      },
      "BatchAnalyzeRequest": {
        "required": [
          "items"
        ],
        "type": "object",
        "properties": {
          "items": {
            "maxItems": 10,
            "minItems": 1,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BatchAnalyzeItemDto"
            },
            "description": "Up to 10 analysis requests. Audio is inline base64."
          }
        },
        "additionalProperties": false,
        "description": "Request body for POST /v1/batch/analyze."
      },
      "BatchItemStatusResponse": {
        "type": "object",
        "properties": {
          "index": {
            "type": "integer",
            "description": "Zero-based item index.",
            "format": "int32"
          },
          "status": {
            "type": "string",
            "description": "queued | completed | failed."
          },
          "audio_base64": {
            "type": "string",
            "description": "Synthesis result: base64 audio (synthesis batches only).",
            "nullable": true
          },
          "content_type": {
            "type": "string",
            "description": "Synthesis result: audio content type.",
            "nullable": true
          },
          "format": {
            "type": "string",
            "description": "Synthesis result: audio format.",
            "nullable": true
          },
          "sample_rate": {
            "type": "integer",
            "description": "Synthesis result: sample rate in Hz.",
            "format": "int32",
            "nullable": true
          },
          "duration_ms": {
            "type": "integer",
            "description": "Synthesis result: duration in milliseconds.",
            "format": "int32",
            "nullable": true
          },
          "result": {
            "$ref": "#/components/schemas/AnalysisResponse"
          },
          "error_code": {
            "type": "string",
            "description": "Error code (when failed).",
            "nullable": true
          },
          "error_message": {
            "type": "string",
            "description": "Error message (when failed).",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One batch item: status plus (for completed items) the result."
      },
      "BatchStatusResponse": {
        "type": "object",
        "properties": {
          "batch_id": {
            "type": "string",
            "description": "Batch id."
          },
          "status": {
            "type": "string",
            "description": "queued | processing | completed | failed."
          },
          "item_count": {
            "type": "integer",
            "description": "Total number of items.",
            "format": "int32"
          },
          "completed": {
            "type": "integer",
            "description": "Number of completed items.",
            "format": "int32"
          },
          "failed": {
            "type": "integer",
            "description": "Number of failed items.",
            "format": "int32"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BatchItemStatusResponse"
            },
            "description": "Per-item statuses and results."
          }
        },
        "additionalProperties": false,
        "description": "Batch status poll response."
      },
      "BatchSynthesizeRequest": {
        "required": [
          "items"
        ],
        "type": "object",
        "properties": {
          "items": {
            "maxItems": 20,
            "minItems": 1,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SynthesizeRequestDto"
            },
            "description": "Up to 20 synthesis requests. Each item has the same shape as POST /v1/synthesize."
          }
        },
        "additionalProperties": false,
        "description": "Request body for POST /v1/batch/synthesize."
      },
      "BillingBalanceResponse": {
        "type": "object",
        "properties": {
          "balance_rub": {
            "type": "number",
            "format": "double"
          },
          "plan": {
            "type": "string"
          },
          "plan_name": {
            "type": "string"
          },
          "subscription_expires_at_utc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "auto_renew_enabled": {
            "type": "boolean"
          },
          "transactions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BalanceTransactionItem"
            }
          },
          "total_count": {
            "type": "integer",
            "description": "Total number of ledger entries (all pages).",
            "format": "int32"
          },
          "page": {
            "type": "integer",
            "description": "One-based page number of the returned page.",
            "format": "int32"
          },
          "page_size": {
            "type": "integer",
            "description": "Page size used for the returned page.",
            "format": "int32"
          },
          "has_next": {
            "type": "boolean",
            "description": "Whether a page after the current one exists."
          },
          "has_previous": {
            "type": "boolean",
            "description": "Whether a page before the current one exists."
          }
        },
        "additionalProperties": false,
        "description": "Response for GET /v1/billing/balance."
      },
      "CalendarEventResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "provider": {
            "type": "string"
          },
          "provider_name": {
            "type": "string"
          },
          "external_event_id": {
            "type": "string"
          },
          "topic": {
            "type": "string",
            "nullable": true
          },
          "join_url": {
            "type": "string",
            "nullable": true
          },
          "meeting_code": {
            "type": "string",
            "nullable": true
          },
          "starts_at_utc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "ends_at_utc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "organizer_email": {
            "type": "string",
            "nullable": true
          },
          "attendees": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "synced_at_utc": {
            "type": "string",
            "format": "date-time"
          },
          "writeback_at_utc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "writeback_detail": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One event stored from the client's calendar (roadmap: calendar)."
      },
      "CalendarEventsResponse": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CalendarEventResponse"
            }
          }
        },
        "additionalProperties": false,
        "description": "A page of stored calendar events."
      },
      "CalendarWritebackResponse": {
        "type": "object",
        "properties": {
          "written": {
            "type": "boolean"
          },
          "detail": {
            "type": "string"
          }
        },
        "additionalProperties": false,
        "description": "Outcome of a manual protocol writeback into a calendar event."
      },
      "CloneVoiceResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "language": {
            "type": "string"
          },
          "sample_count": {
            "type": "integer",
            "format": "int32"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "ConnectIntegrationRequest": {
        "type": "object",
        "properties": {
          "provider": {
            "type": "string",
            "description": "Provider id: `bitrix24` | `amocrm` | `s1`."
          },
          "display_name": {
            "type": "string",
            "description": "Optional label shown in the cabinet (e.g. the portal host).",
            "nullable": true
          },
          "base_url": {
            "type": "string",
            "description": "Optional tenant root URL (portal/instance).",
            "nullable": true
          },
          "secret": {
            "type": "string",
            "description": "Credential: incoming-webhook URL or access token. Never echoed back."
          },
          "refresh_token": {
            "type": "string",
            "description": "Optional OAuth refresh token.",
            "nullable": true
          },
          "expires_at_utc": {
            "type": "string",
            "description": "Optional credential expiry.",
            "format": "date-time",
            "nullable": true
          },
          "scopes": {
            "type": "string",
            "description": "Optional granted scopes, for diagnostics.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request body for `POST /v1/integrations/connections`. The\r\nRussianTts.Api.Contracts.ConnectIntegrationRequest.Secret is the provider credential: an incoming-webhook URL\r\n(Bitrix24) or an OAuth access token (amoCRM, 1С)."
      },
      "CustomProtocolRequest": {
        "type": "object",
        "properties": {
          "recording_id": {
            "type": "string",
            "description": "Recording id to summarise (32 hex chars)."
          },
          "template_id": {
            "type": "string",
            "description": "Id of a saved template to use instead of an inline schema.",
            "nullable": true
          },
          "schema": {
            "description": "Inline template definition:\r\n`{ \"title\": \"…\", \"sections\": [ { \"key\": \"summary\", \"title\": \"Итог\", \"type\": \"text\" } ] }`.\r\nIgnored when RussianTts.Api.Contracts.CustomProtocolRequest.TemplateId is set.",
            "nullable": true
          },
          "webhook_url": {
            "type": "string",
            "description": "Optional webhook URL for the `meeting.completed` event.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request body for `POST /v1/meetings/protocol/custom`."
      },
      "CustomProtocolResponse": {
        "type": "object",
        "properties": {
          "protocol_id": {
            "type": "string",
            "description": "Identifier of the persisted protocol."
          },
          "recording_id": {
            "type": "string"
          },
          "template_id": {
            "type": "string",
            "description": "Template used, when the caller referenced a saved one.",
            "nullable": true
          },
          "data": {
            "description": "The data the model produced, matching the requested schema."
          },
          "markdown": {
            "type": "string",
            "description": "Protocol rendered as Markdown."
          },
          "llm_model": {
            "type": "string",
            "description": "LLM model that produced the protocol.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Response for `POST /v1/meetings/protocol/custom`."
      },
      "DecisionResponse": {
        "type": "object",
        "properties": {
          "decision": {
            "type": "string"
          },
          "quote": {
            "type": "string",
            "nullable": true
          },
          "start": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "end": {
            "type": "number",
            "format": "double",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "EnrollVoiceProfileResponse": {
        "type": "object",
        "properties": {
          "profile_id": {
            "type": "string"
          }
        },
        "additionalProperties": false,
        "description": "Result of a successful voice-profile enrollment."
      },
      "EntityResponse": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "Entity text as it appears in the transcript."
          },
          "type": {
            "type": "string",
            "description": "Entity type label (PER, LOC, ORG, DATE, MONEY)."
          }
        },
        "additionalProperties": false,
        "description": "Named entity extracted from the transcript."
      },
      "ErrorResponse": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "Error documentation URL, e.g. https://ttsapi.ru/docs#errors."
          },
          "title": {
            "type": "string",
            "description": "Short title, e.g. Quota exceeded."
          },
          "status": {
            "type": "integer",
            "description": "HTTP status code.",
            "format": "int32"
          },
          "detail": {
            "type": "string",
            "description": "Human-readable explanation."
          },
          "instance": {
            "type": "string",
            "description": "Request path that failed.",
            "nullable": true
          },
          "code": {
            "type": "string",
            "description": "Machine-readable code: validation_error, text_too_long, quota_exceeded, queue_saturated,\r\nstreaming_forbidden, voice_not_found, engine_unavailable, model_unavailable, invalid_voice,\r\ninvalid_format, invalid_sample_rate, invalid_ssml, text_required, internal_error."
          },
          "trace_id": {
            "type": "string",
            "description": "Correlation id (also returned as X-Request-Id on success).",
            "nullable": true
          },
          "errors": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Field errors for validation_error. Keys are snake_case parameter names.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "RFC 7807 Problem Details plus TTS-specific extension fields."
      },
      "EvaluationResponse": {
        "type": "object",
        "properties": {
          "wer": {
            "type": "number",
            "description": "Word error rate, 0..1 (lower is better).",
            "format": "double"
          },
          "accuracy": {
            "type": "number",
            "description": "1 - wer, 0..1 (higher is better).",
            "format": "double"
          },
          "hits": {
            "type": "integer",
            "format": "int32"
          },
          "substitutions": {
            "type": "integer",
            "format": "int32"
          },
          "insertions": {
            "type": "integer",
            "format": "int32"
          },
          "deletions": {
            "type": "integer",
            "format": "int32"
          },
          "reference_words": {
            "type": "integer",
            "format": "int32"
          },
          "hypothesis_words": {
            "type": "integer",
            "format": "int32"
          },
          "normalized_reference": {
            "type": "string",
            "description": "Reference text after normalisation (for auditing the alignment)."
          },
          "transcript": {
            "type": "string",
            "description": "Raw transcript produced by the speech engine."
          },
          "language": {
            "type": "string"
          },
          "duration_seconds": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "Response for `POST /v1/eval`."
      },
      "IntegrationConnectionResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "provider": {
            "type": "string"
          },
          "provider_name": {
            "type": "string"
          },
          "display_name": {
            "type": "string",
            "nullable": true
          },
          "base_url": {
            "type": "string",
            "nullable": true
          },
          "active": {
            "type": "boolean"
          },
          "expired": {
            "type": "boolean"
          },
          "scopes": {
            "type": "string",
            "nullable": true
          },
          "created_at_utc": {
            "type": "string",
            "format": "date-time"
          },
          "expires_at_utc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "external_account_id": {
            "type": "string",
            "description": "Provider-side tenant id (e.g. the Zoom account), when known.",
            "nullable": true
          },
          "meeting_capture_enabled": {
            "type": "boolean",
            "description": "True when meeting autocapture is enabled (consent given)."
          }
        },
        "additionalProperties": false,
        "description": "Safe representation of a client's external connection (no credential)."
      },
      "IntegrationConnectionsResponse": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/IntegrationConnectionResponse"
            }
          }
        },
        "additionalProperties": false,
        "description": "Response for `GET /v1/integrations/connections`."
      },
      "JobStatusResponse": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "description": "Job id."
          },
          "status": {
            "type": "string",
            "description": "queued | processing | completed | failed."
          },
          "result": {
            "$ref": "#/components/schemas/TranscriptionResponse"
          },
          "error_code": {
            "type": "string",
            "description": "Error code (present when status=failed).",
            "nullable": true
          },
          "error_message": {
            "type": "string",
            "description": "Error message (present when status=failed).",
            "nullable": true
          },
          "progress": {
            "type": "integer",
            "description": "Progress 0..100 (present for long-form jobs).",
            "format": "int32",
            "nullable": true
          },
          "chunks_completed": {
            "type": "integer",
            "description": "Completed chunks (present for long-form jobs).",
            "format": "int32",
            "nullable": true
          },
          "chunks_total": {
            "type": "integer",
            "description": "Total chunks (present for long-form jobs).",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Job status poll response."
      },
      "KeywordResponse": {
        "type": "object",
        "properties": {
          "keyword": {
            "type": "string",
            "description": "Keyword text."
          },
          "score": {
            "type": "number",
            "description": "Relevance score (lower = more important, YAKE convention).",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "Extracted keyword with relevance score."
      },
      "LanguageDetectionRequest": {
        "required": [
          "text"
        ],
        "type": "object",
        "properties": {
          "text": {
            "maxLength": 5000,
            "minLength": 1,
            "type": "string",
            "description": "Text to analyze. Required. Max 5000 characters.",
            "example": "Привет! Это пример текста на русском языке."
          }
        },
        "additionalProperties": false,
        "description": "Request body for POST /v1/detect-language."
      },
      "LanguageDetectionResponse": {
        "type": "object",
        "properties": {
          "language": {
            "type": "string",
            "description": "ISO 639-1 language code, e.g. \"ru\", \"en\"."
          },
          "confidence": {
            "type": "number",
            "description": "Detection confidence (0..1).",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "Detected language with the detector's confidence."
      },
      "LinkRecordingRequest": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "Public http(s) URL of an audio file (wav, mp3, ogg, flac)."
          },
          "language": {
            "type": "string",
            "description": "Optional ISO language code hint (e.g. \"ru\", \"en\").",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request body for `POST /v1/recordings/from-link`."
      },
      "MeetingEventResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "provider": {
            "type": "string"
          },
          "provider_name": {
            "type": "string"
          },
          "external_meeting_id": {
            "type": "string"
          },
          "topic": {
            "type": "string",
            "nullable": true
          },
          "host_email": {
            "type": "string",
            "nullable": true
          },
          "join_url": {
            "type": "string",
            "nullable": true
          },
          "started_at_utc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "duration_seconds": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "participants_count": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "status": {
            "type": "string"
          },
          "status_name": {
            "type": "string"
          },
          "job_id": {
            "type": "string",
            "nullable": true
          },
          "recording_id": {
            "type": "string",
            "nullable": true
          },
          "protocol_id": {
            "type": "string",
            "nullable": true
          },
          "deal_id": {
            "type": "string",
            "nullable": true
          },
          "phone": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "attempts": {
            "type": "integer",
            "format": "int32"
          },
          "next_attempt_at_utc": {
            "type": "string",
            "format": "date-time"
          },
          "last_attempt_at_utc": {
            "type": "string",
            "format": "date-time"
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "created_at_utc": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at_utc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "One automatically captured meeting."
      },
      "MeetingEventTargetRequest": {
        "type": "object",
        "properties": {
          "deal_id": {
            "type": "string",
            "nullable": true
          },
          "phone": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "CRM target the protocol of a captured meeting is pushed to."
      },
      "MeetingEventsResponse": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MeetingEventResponse"
            }
          }
        },
        "additionalProperties": false,
        "description": "A page of captured meetings."
      },
      "MeetingProtocolRequest": {
        "type": "object",
        "properties": {
          "recording_id": {
            "type": "string",
            "description": "Recording id to summarise (32 hex chars)."
          },
          "template": {
            "type": "string",
            "description": "Protocol template: `custom` | `standup` | `demo` |\r\n`interview` | `retro` | `one_on_one`. Defaults to\r\n`custom`.",
            "nullable": true
          },
          "webhook_url": {
            "type": "string",
            "description": "Optional webhook URL. When set, a `meeting.completed` event is\r\nenqueued once the protocol has been generated and persisted.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request body for `POST /v1/meetings/protocol`."
      },
      "MeetingProtocolResponse": {
        "type": "object",
        "properties": {
          "protocol_id": {
            "type": "string",
            "description": "Identifier of the persisted protocol. Use it to export (md/docx/pdf),\r\nshare or push the protocol to a CRM."
          },
          "recording_id": {
            "type": "string"
          },
          "template": {
            "type": "string"
          },
          "tl_dr": {
            "type": "string"
          },
          "decisions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DecisionResponse"
            }
          },
          "tasks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TaskResponse"
            }
          },
          "risks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RiskResponse"
            }
          },
          "open_questions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "next_steps": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "markdown": {
            "type": "string",
            "description": "Protocol rendered as Markdown."
          },
          "llm_model": {
            "type": "string",
            "description": "LLM model that produced the protocol.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Response for `POST /v1/meetings/protocol`."
      },
      "MeetingProtocolSummaryResponse": {
        "type": "object",
        "properties": {
          "protocol_id": {
            "type": "string"
          },
          "recording_id": {
            "type": "string"
          },
          "template": {
            "type": "string"
          },
          "template_id": {
            "type": "string",
            "description": "Custom template used for this protocol, when applicable.",
            "nullable": true
          },
          "tl_dr": {
            "type": "string"
          },
          "decisions": {
            "type": "integer",
            "format": "int32"
          },
          "tasks": {
            "type": "integer",
            "format": "int32"
          },
          "risks": {
            "type": "integer",
            "format": "int32"
          },
          "next_steps": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "llm_model": {
            "type": "string",
            "nullable": true
          },
          "markdown": {
            "type": "string"
          },
          "created_at_utc": {
            "type": "string",
            "format": "date-time"
          },
          "status": {
            "type": "string"
          },
          "approved_at_utc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "approved_by": {
            "type": "string",
            "nullable": true
          },
          "pushed_at_utc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "updated_at_utc": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Compact representation of a persisted meeting protocol."
      },
      "MeetingProtocolsResponse": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MeetingProtocolSummaryResponse"
            }
          }
        },
        "additionalProperties": false,
        "description": "Response for `GET /v1/meetings/protocols`."
      },
      "ModerateRequest": {
        "required": [
          "text"
        ],
        "type": "object",
        "properties": {
          "text": {
            "maxLength": 5000,
            "minLength": 1,
            "type": "string",
            "description": "Text to check. Required. Max 5000 characters.",
            "example": "Это оскорбительное сообщение."
          },
          "language": {
            "type": "string",
            "description": "Optional source language hint (e.g. \"ru\").",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request body for POST /v1/moderate."
      },
      "ModerateResponse": {
        "type": "object",
        "properties": {
          "flagged": {
            "type": "boolean",
            "description": "True when at least one flagged term was found."
          },
          "score": {
            "type": "number",
            "description": "Overall flag score (0..1).",
            "format": "double"
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Categories that matched (profanity, insult, hate)."
          },
          "matches": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ModerationMatchResponse"
            },
            "description": "The offending terms with their categories."
          }
        },
        "additionalProperties": false,
        "description": "Result of content moderation."
      },
      "ModerationMatchResponse": {
        "type": "object",
        "properties": {
          "term": {
            "type": "string",
            "description": "The term as it appeared in the source text."
          },
          "category": {
            "type": "string",
            "description": "Category label (profanity, insult, hate)."
          }
        },
        "additionalProperties": false,
        "description": "A single moderation hit: the offending term and its category."
      },
      "OAuthAuthorizeRequest": {
        "type": "object",
        "properties": {
          "consent": {
            "type": "boolean",
            "description": "Required for meeting providers (Zoom): confirms the client is allowed to\r\nrecord and process the meetings being pulled in."
          }
        },
        "additionalProperties": false,
        "description": "Starts an OAuth handshake for a provider."
      },
      "OAuthAuthorizeResponse": {
        "type": "object",
        "properties": {
          "provider": {
            "type": "string"
          },
          "authorize_url": {
            "type": "string"
          },
          "state": {
            "type": "string"
          }
        },
        "additionalProperties": false,
        "description": "Where to send the browser to continue an OAuth handshake."
      },
      "ProtocolTemplateRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Human-readable template name."
          },
          "schema": {
            "description": "Template definition (see `POST /v1/meetings/protocol/custom`).",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request body for protocol-template create/update endpoints."
      },
      "ProtocolTemplateResponse": {
        "type": "object",
        "properties": {
          "template_id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "schema": {
            "description": "Canonical template definition."
          },
          "created_at_utc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "One saved protocol template."
      },
      "ProtocolTemplatesResponse": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProtocolTemplateResponse"
            }
          }
        },
        "additionalProperties": false,
        "description": "Response for `GET /v1/meetings/templates`."
      },
      "QaAnalyticsResponse": {
        "type": "object",
        "properties": {
          "total_evaluations": {
            "type": "integer",
            "format": "int32"
          },
          "average_score": {
            "type": "number",
            "format": "double"
          },
          "violations": {
            "type": "integer",
            "format": "int32"
          },
          "passed_checks": {
            "type": "integer",
            "format": "int32"
          },
          "failed_checks": {
            "type": "integer",
            "format": "int32"
          },
          "partial_checks": {
            "type": "integer",
            "format": "int32"
          },
          "trend": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QaScorePointResponse"
            }
          },
          "top_violations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QaTopViolationResponse"
            }
          },
          "by_operator": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QaOperatorScoreResponse"
            }
          },
          "recent": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QaEvaluationSummaryResponse"
            }
          }
        },
        "additionalProperties": false,
        "description": "Response for `GET /v1/qa/analytics`."
      },
      "QaChecklistItemRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "description": "`required` or `forbidden`."
          },
          "description": {
            "type": "string"
          },
          "weight": {
            "type": "number",
            "format": "double",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "One checklist item in a save request."
      },
      "QaEvaluateRequest": {
        "type": "object",
        "properties": {
          "recording_id": {
            "type": "string",
            "description": "Recording id to evaluate (32 hex chars)."
          },
          "checklist": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QaChecklistItemRequest"
            },
            "description": "Checklist to evaluate against."
          },
          "webhook_url": {
            "type": "string",
            "description": "Optional webhook URL. When the evaluation is flagged as a violation, a\r\n`qa.violation` event is POSTed here.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request body for `POST /v1/qa/evaluate`."
      },
      "QaEvaluationResponse": {
        "type": "object",
        "properties": {
          "recording_id": {
            "type": "string"
          },
          "score": {
            "type": "number",
            "description": "Weighted 0..100 pass score.",
            "format": "double"
          },
          "total_checks": {
            "type": "integer",
            "format": "int32"
          },
          "passed": {
            "type": "integer",
            "format": "int32"
          },
          "failed": {
            "type": "integer",
            "format": "int32"
          },
          "llm_model": {
            "type": "string",
            "description": "LLM model that produced the verdicts.",
            "nullable": true
          },
          "evaluation_id": {
            "type": "string",
            "description": "Persisted evaluation id (for analytics/CRM export).",
            "nullable": true
          },
          "violation": {
            "type": "boolean",
            "description": "True when the call was flagged as a violation."
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QaItemResponse"
            }
          }
        },
        "additionalProperties": false,
        "description": "Response for `POST /v1/qa/evaluate`."
      },
      "QaEvaluationSummaryResponse": {
        "type": "object",
        "properties": {
          "evaluation_id": {
            "type": "string"
          },
          "recording_id": {
            "type": "string"
          },
          "operator_name": {
            "type": "string",
            "nullable": true
          },
          "score": {
            "type": "number",
            "format": "double"
          },
          "is_violation": {
            "type": "boolean"
          },
          "passed": {
            "type": "integer",
            "format": "int32"
          },
          "failed": {
            "type": "integer",
            "format": "int32"
          },
          "partial": {
            "type": "integer",
            "format": "int32"
          },
          "created_at_utc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "A compact evaluation row."
      },
      "QaEvaluationsResponse": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "format": "int32"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QaEvaluationSummaryResponse"
            }
          }
        },
        "additionalProperties": false,
        "description": "Response for `GET /v1/qa/evaluations`."
      },
      "QaItemResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "verdict": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "quote": {
            "type": "string",
            "nullable": true
          },
          "start": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "end": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "weight": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "QaOperatorScoreResponse": {
        "type": "object",
        "properties": {
          "operator_name": {
            "type": "string"
          },
          "evaluations": {
            "type": "integer",
            "format": "int32"
          },
          "average_score": {
            "type": "number",
            "format": "double"
          },
          "violations": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Score roll-up for one operator."
      },
      "QaScorePointResponse": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string"
          },
          "average_score": {
            "type": "number",
            "format": "double"
          },
          "count": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Average score and evaluation count for one day."
      },
      "QaTopViolationResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "failures": {
            "type": "integer",
            "format": "int32"
          },
          "partials": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Aggregated failures for one checklist item."
      },
      "RecordingCrmPushRequest": {
        "type": "object",
        "properties": {
          "provider": {
            "type": "string",
            "description": "Target provider: `bitrix24` | `amocrm` | `s1`."
          },
          "kind": {
            "type": "string",
            "description": "Artefact to push: `transcript` | `protocol` | `qa`."
          },
          "deal_id": {
            "type": "string",
            "description": "Optional CRM deal/lead id to attach the artefact to.",
            "nullable": true
          },
          "phone": {
            "type": "string",
            "description": "Optional contact phone, used to resolve the deal when no id is given.",
            "nullable": true
          },
          "email": {
            "type": "string",
            "description": "Optional contact e-mail, used to resolve the deal when no id is given.",
            "nullable": true
          },
          "source_url": {
            "type": "string",
            "description": "Optional link placed in the pushed comment (e.g. a share URL).",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request body for `POST /v1/recordings/{id}/push`."
      },
      "RecordingCrmPushResponse": {
        "type": "object",
        "properties": {
          "recording_id": {
            "type": "string"
          },
          "provider": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "description": "`pending`, `pushed` or `failed`. A failed push is\r\n            still a 200 — inspect RussianTts.Api.Contracts.RecordingCrmPushResponse.Succeeded and retry."
          },
          "succeeded": {
            "type": "boolean",
            "description": "True when the artefact was accepted by the provider."
          },
          "pending": {
            "type": "boolean",
            "description": "True while the entry is queued or waiting for its next retry."
          },
          "attempts": {
            "type": "integer",
            "description": "Delivery attempts made so far.",
            "format": "int32"
          },
          "next_attempt_at_utc": {
            "type": "string",
            "description": "When the next retry is due (only set while pending).",
            "format": "date-time",
            "nullable": true
          },
          "delivered_at_utc": {
            "type": "string",
            "description": "When the provider accepted the artefact.",
            "format": "date-time",
            "nullable": true
          },
          "external_entity_type": {
            "type": "string",
            "nullable": true
          },
          "external_entity_id": {
            "type": "string",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "last_attempt_at_utc": {
            "type": "string",
            "description": "When the push last ran (success, failure or requeue).",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "State of one CRM/SED push, including its place in the delivery outbox."
      },
      "RecordingCrmPushesResponse": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RecordingCrmPushResponse"
            }
          }
        },
        "additionalProperties": false,
        "description": "Response for `GET /v1/recordings/{id}/pushes`."
      },
      "RecordingFacetsResponse": {
        "type": "object",
        "properties": {
          "values": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false,
        "description": "Distinct tag or folder values for a client's recordings."
      },
      "RecordingResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "language": {
            "type": "string",
            "nullable": true
          },
          "duration_seconds": {
            "type": "number",
            "format": "double"
          },
          "created_at_utc": {
            "type": "string",
            "format": "date-time"
          },
          "audio_expires_at_utc": {
            "type": "string",
            "format": "date-time"
          },
          "transcript_expires_at_utc": {
            "type": "string",
            "format": "date-time"
          },
          "folder": {
            "type": "string",
            "nullable": true
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false,
        "description": "Metadata of a stored recording (the transcript is a separate endpoint)."
      },
      "RecordingShareResponse": {
        "type": "object",
        "properties": {
          "share_id": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "description": "Absolute public URL of the share link."
          },
          "password_required": {
            "type": "boolean"
          },
          "created_at_utc": {
            "type": "string",
            "format": "date-time"
          },
          "expires_at_utc": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "Response for share-link endpoints."
      },
      "RecordingSpeakerResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "display_name": {
            "type": "string",
            "nullable": true
          },
          "role": {
            "type": "string"
          },
          "auto_role": {
            "type": "string"
          },
          "duration_seconds": {
            "type": "number",
            "format": "double"
          },
          "speech_share": {
            "type": "number",
            "format": "double"
          },
          "segment_count": {
            "type": "integer",
            "format": "int32"
          },
          "word_count": {
            "type": "integer",
            "format": "int32"
          },
          "words_per_minute": {
            "type": "number",
            "format": "double"
          },
          "first_utterance_at": {
            "type": "number",
            "format": "double"
          },
          "last_utterance_at": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "A diarized speaker with stats, an effective role and the inferred auto role."
      },
      "RecordingSpeakersResponse": {
        "type": "object",
        "properties": {
          "recording_id": {
            "type": "string"
          },
          "speakers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RecordingSpeakerResponse"
            }
          },
          "timeline": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SpeakerTimelineResponse"
            }
          },
          "metrics": {
            "$ref": "#/components/schemas/SpeakerMetricsResponse"
          }
        },
        "additionalProperties": false,
        "description": "Response for `GET /v1/recordings/{id}/speakers`."
      },
      "RecordingsListResponse": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RecordingResponse"
            }
          },
          "total": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Page of recordings plus the total count for pagination."
      },
      "RedactRequest": {
        "required": [
          "text"
        ],
        "type": "object",
        "properties": {
          "text": {
            "maxLength": 5000,
            "minLength": 1,
            "type": "string",
            "description": "Text to redact. Required. Max 5000 characters.",
            "example": "Иван позвонил на +7 900 123-45-67 из Москвы."
          },
          "language": {
            "type": "string",
            "description": "Optional source language hint (e.g. \"ru\"). Affects NER.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request body for POST /v1/redact."
      },
      "RedactResponse": {
        "type": "object",
        "properties": {
          "redacted_text": {
            "type": "string",
            "description": "Text with sensitive spans replaced by type labels, e.g. [PER]."
          },
          "entities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RedactedEntityResponse"
            },
            "description": "The spans that were redacted, in document order."
          },
          "count": {
            "type": "integer",
            "description": "Number of redacted spans.",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Result of PII redaction."
      },
      "RedactedEntityResponse": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "Original text as it appeared in the source string."
          },
          "type": {
            "type": "string",
            "description": "Entity type label (PER, ORG, LOC, DATE, MONEY, PHONE, EMAIL, CARD)."
          },
          "start": {
            "type": "integer",
            "description": "Character offset of the span start in the source string.",
            "format": "int32"
          },
          "end": {
            "type": "integer",
            "description": "Character offset just past the span end.",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "A redacted span with its original text and character offsets."
      },
      "RiskResponse": {
        "type": "object",
        "properties": {
          "risk": {
            "type": "string"
          },
          "quote": {
            "type": "string",
            "nullable": true
          },
          "start": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "end": {
            "type": "number",
            "format": "double",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SearchHitResponse": {
        "type": "object",
        "properties": {
          "recording_id": {
            "type": "string"
          },
          "text": {
            "type": "string"
          },
          "speaker": {
            "type": "string",
            "nullable": true
          },
          "start": {
            "type": "number",
            "format": "double"
          },
          "end": {
            "type": "number",
            "format": "double"
          },
          "score": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "SearchRequest": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Natural-language query to match against recording transcripts."
          },
          "limit": {
            "type": "integer",
            "description": "Max hits to return. Defaults to the plan default when omitted.",
            "format": "int32",
            "nullable": true
          },
          "keywords": {
            "type": "string",
            "description": "Optional full-text keywords for hybrid search (tsvector).",
            "nullable": true
          },
          "from": {
            "type": "string",
            "description": "Include only chunks from recordings created on/after this instant (UTC).",
            "format": "date-time",
            "nullable": true
          },
          "to": {
            "type": "string",
            "description": "Include only chunks from recordings created on/before this instant (UTC).",
            "format": "date-time",
            "nullable": true
          },
          "source": {
            "type": "string",
            "description": "Include only recordings of this source (upload|link|bot|stream).",
            "nullable": true
          },
          "min_duration_seconds": {
            "type": "number",
            "description": "Include only recordings at least this long (seconds).",
            "format": "double",
            "nullable": true
          },
          "max_duration_seconds": {
            "type": "number",
            "description": "Include only recordings at most this long (seconds).",
            "format": "double",
            "nullable": true
          },
          "speaker": {
            "type": "string",
            "description": "Include only chunks spoken by this speaker label (e.g. SPEAKER_00).",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request body for `POST /v1/search`."
      },
      "SearchResponse": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string"
          },
          "hits": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SearchHitResponse"
            }
          }
        },
        "additionalProperties": false,
        "description": "Response for `POST /v1/search`."
      },
      "SegmentEmotionResponse": {
        "type": "object",
        "properties": {
          "start": {
            "type": "number",
            "description": "Segment start time in seconds.",
            "format": "double"
          },
          "emotion": {
            "type": "string",
            "description": "Detected emotion."
          }
        },
        "additionalProperties": false,
        "description": "Emotion label for a time slice."
      },
      "SentimentResponse": {
        "type": "object",
        "properties": {
          "overall": {
            "type": "string",
            "description": "Overall emotion: joy | sadness | anger | fear | neutral."
          },
          "confidence": {
            "type": "number",
            "description": "Confidence of the overall label (0..1).",
            "format": "double"
          },
          "emotions": {
            "type": "object",
            "additionalProperties": {
              "type": "number",
              "format": "double"
            },
            "description": "Per-emotion confidence distribution."
          },
          "segments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SegmentEmotionResponse"
            },
            "description": "Per-segment emotions."
          }
        },
        "additionalProperties": false,
        "description": "Sentiment analysis result."
      },
      "ShareCreateRequest": {
        "type": "object",
        "properties": {
          "expires_in_seconds": {
            "type": "integer",
            "description": "Share lifetime in seconds (optional, defaults to 7 days).",
            "format": "int32",
            "nullable": true
          },
          "password": {
            "type": "string",
            "description": "Optional password to protect the share link.",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request body for `POST /v1/recordings/{id}/share`."
      },
      "SpeakerMetricsResponse": {
        "type": "object",
        "properties": {
          "interruptions": {
            "type": "integer",
            "format": "int32"
          },
          "silence_count": {
            "type": "integer",
            "format": "int32"
          },
          "total_silence_seconds": {
            "type": "number",
            "format": "double"
          },
          "longest_silence_seconds": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "Conversation-level metrics: interruptions, silence and (per speaker) pace."
      },
      "SpeakerResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Speaker id, e.g. SPEAKER_00."
          },
          "duration_seconds": {
            "type": "number",
            "description": "Total speaking time in seconds.",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "Per-speaker aggregated duration."
      },
      "SpeakerTimelineResponse": {
        "type": "object",
        "properties": {
          "start": {
            "type": "number",
            "format": "double"
          },
          "end": {
            "type": "number",
            "format": "double"
          },
          "speaker_id": {
            "type": "string"
          }
        },
        "additionalProperties": false,
        "description": "One speaking turn in the chronological speaker timeline."
      },
      "SummarizeRequest": {
        "required": [
          "text"
        ],
        "type": "object",
        "properties": {
          "text": {
            "maxLength": 5000,
            "minLength": 1,
            "type": "string",
            "description": "Text to summarize. Required. Max 5000 characters."
          },
          "language": {
            "type": "string",
            "description": "Optional source language hint (e.g. \"ru\").",
            "nullable": true
          },
          "max_sentences": {
            "maximum": 10,
            "minimum": 1,
            "type": "integer",
            "description": "Maximum sentences in the summary (1..10, default 3).",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Request body for POST /v1/analyze/summarize."
      },
      "SummarizeResponse": {
        "type": "object",
        "properties": {
          "summary": {
            "type": "string",
            "description": "The summary as plain text."
          },
          "sentences": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The selected sentences in their original order."
          }
        },
        "additionalProperties": false,
        "description": "Result of extractive summarization."
      },
      "SynthesisJobResponse": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "description": "Job id to poll via GET /v1/synthesize/async/{jobId}."
          },
          "status": {
            "type": "string",
            "description": "Initial job status (always \"queued\")."
          },
          "estimated_seconds": {
            "type": "integer",
            "description": "Rough estimate of processing time in seconds.",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Async long-form synthesis acceptance response (HTTP 202)."
      },
      "SynthesisJobStatusResponse": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "description": "Job id."
          },
          "status": {
            "type": "string",
            "description": "queued | processing | completed | failed."
          },
          "result": {
            "$ref": "#/components/schemas/SynthesisManifestResponse"
          },
          "error_code": {
            "type": "string",
            "description": "Error code (present when status=failed).",
            "nullable": true
          },
          "error_message": {
            "type": "string",
            "description": "Error message (present when status=failed).",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Long-form synthesis job poll response."
      },
      "SynthesisManifestResponse": {
        "type": "object",
        "properties": {
          "segments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SynthesisManifestSegmentResponse"
            },
            "description": "Timed text segments (one per paragraph)."
          },
          "duration_milliseconds": {
            "type": "integer",
            "description": "Total audio duration in milliseconds (including inter-paragraph pauses).",
            "format": "int32"
          },
          "format": {
            "type": "string",
            "description": "Audio format of the produced file (always \"wav\" for now)."
          },
          "sample_rate_hertz": {
            "type": "integer",
            "description": "Sample rate in Hz.",
            "format": "int32"
          },
          "audio_size_bytes": {
            "type": "integer",
            "description": "Size of the produced audio file in bytes.",
            "format": "int32"
          },
          "audio_path": {
            "type": "string",
            "description": "Download path for the audio file, e.g. /v1/synthesize/async/{jobId}/audio."
          }
        },
        "additionalProperties": false,
        "description": "Audiobook manifest: timed paragraphs of a long-form synthesis, for syncing\r\nthe text with the produced audio."
      },
      "SynthesisManifestSegmentResponse": {
        "type": "object",
        "properties": {
          "index": {
            "type": "integer",
            "description": "Zero-based segment index.",
            "format": "int32"
          },
          "text": {
            "type": "string",
            "description": "Spoken text of the paragraph."
          },
          "start_milliseconds": {
            "type": "integer",
            "description": "Segment start in the final audio, in milliseconds.",
            "format": "int32"
          },
          "end_milliseconds": {
            "type": "integer",
            "description": "Segment end in the final audio, in milliseconds.",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "One timed paragraph of an audiobook manifest."
      },
      "SynthesizeRequestDto": {
        "required": [
          "text"
        ],
        "type": "object",
        "properties": {
          "text": {
            "maxLength": 5000,
            "minLength": 1,
            "type": "string",
            "description": "Text to speak. Required. Max 5000 characters (500 on the public demo).",
            "example": "Привет! Это демонстрация синтеза русской речи."
          },
          "voice": {
            "enum": [
              "preset_maksim",
              "preset_pavel",
              "preset_aleksey",
              "preset_m01",
              "preset_m02",
              "preset_m03",
              "preset_m05",
              "preset_m06",
              "preset_m07",
              "preset_m09",
              "preset_m10",
              "preset_m11",
              "preset_m13",
              "preset_anna",
              "preset_mariya",
              "preset_olga",
              "preset_darya",
              "preset_w01",
              "preset_w03",
              "preset_w04",
              "preset_w05",
              "preset_w06",
              "preset_w07",
              "preset_w08",
              "preset_w09",
              "preset_w10",
              "preset_w13",
              "preset_w14",
              "preset_w15"
            ],
            "type": "string",
            "description": "Voice id. Default preset_anna. See GET /v1/voices.",
            "nullable": true,
            "example": "preset_anna"
          },
          "format": {
            "enum": [
              "mp3",
              "wav",
              "ogg",
              "opus"
            ],
            "type": "string",
            "description": "Audio format: mp3 (default), wav, ogg (Vorbis), or opus (OGG/Opus).",
            "nullable": true,
            "example": "mp3"
          },
          "sample_rate": {
            "enum": [
              8000,
              16000,
              24000,
              48000
            ],
            "type": "integer",
            "description": "Sample rate in Hz: 8000, 16000, 24000 (default), 48000.",
            "format": "int32",
            "nullable": true,
            "example": 24000
          },
          "speed": {
            "maximum": 2,
            "minimum": 0.5,
            "type": "number",
            "description": "Speaking rate from 0.5 to 2.0. Default 1.0.",
            "format": "float",
            "nullable": true,
            "example": 1
          },
          "pitch": {
            "maximum": 2,
            "minimum": 0.5,
            "type": "number",
            "description": "Pitch from 0.5 to 2.0. Default 1.0.",
            "format": "float",
            "nullable": true,
            "example": 1
          },
          "emotion": {
            "type": "string",
            "description": "Accepted for backward compatibility. CosyVoice does not support emotion — this value is ignored.",
            "nullable": true,
            "example": "neutral"
          },
          "ssml": {
            "type": "boolean",
            "description": "If true, text is treated as SSML (speak, p, s, break, prosody only).",
            "nullable": true
          },
          "put_accent": {
            "type": "boolean",
            "description": "Accepted for backward compatibility. CosyVoice consumes plain text through\r\na tokenizer with no phoneme input, so stress marks cannot reach the model —\r\nthis value is ignored. Use RussianTts.Api.Contracts.SynthesizeRequestDto.Lexicon to fix the pronunciation of\r\nindividual words.",
            "nullable": true
          },
          "put_yo": {
            "type": "boolean",
            "description": "Accepted for backward compatibility and ignored: CosyVoice consumes plain\r\ntext tokens and has no phoneme input, so the letter ё cannot be forced.",
            "nullable": true
          },
          "normalize": {
            "type": "boolean",
            "description": "Accepted for backward compatibility and ignored: the engine already reads\r\ndigits correctly, so there is nothing to expand.",
            "nullable": true
          },
          "model": {
            "enum": [
              "standard",
              "premium"
            ],
            "type": "string",
            "description": "Synthesis model: standard (default, preset voices) or premium (cloned voices). Both run on CosyVoice.",
            "nullable": true,
            "example": "standard"
          },
          "language": {
            "type": "string",
            "description": "Language code for multilingual synthesis (CosyVoice; defaults to the voice language).",
            "nullable": true,
            "example": "ru"
          },
          "effects": {
            "type": "string",
            "description": "Optional audio-effects chain applied after synthesis. A JSON-encoded string\r\nholding an array of effect descriptors, e.g. \"[{\\\"type\\\": \\\"reverb\\\", \\\"room_size\\\": 0.5}]\".\r\nRequires a plan with audio effects enabled. Not supported for streaming synthesis.",
            "nullable": true,
            "example": "[{\"type\": \"reverb\", \"room_size\": 0.5}]"
          },
          "lexicon": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "description": "Optional pronunciation overrides applied to the engine text before synthesis\r\n(up to 200 entries; source words are matched whole-word, case-insensitively).\r\nUse it for abbreviations, brands and names the model would read incorrectly,\r\ne.g. `{ \"ООО\": \"общество с ограниченной ответственностью\" }`.\r\nIgnored for SSML requests (a replacement inside a tag would break the markup).\r\nQuota is counted on the original text.",
            "nullable": true,
            "example": {
              "ООО": "общество с ограниченной ответственностью"
            }
          }
        },
        "additionalProperties": false,
        "description": "Request body for POST /v1/synthesize and POST /v1/synthesize/stream."
      },
      "TaskResponse": {
        "type": "object",
        "properties": {
          "task": {
            "type": "string"
          },
          "owner": {
            "type": "string",
            "nullable": true
          },
          "deadline": {
            "type": "string",
            "nullable": true
          },
          "quote": {
            "type": "string",
            "nullable": true
          },
          "start": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "end": {
            "type": "number",
            "format": "double",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TopUpRequest": {
        "type": "object",
        "properties": {
          "amount_rub": {
            "type": "number",
            "description": "Top-up amount in rubles, from 100 to 10000.",
            "format": "double",
            "example": 1000
          }
        },
        "additionalProperties": false,
        "description": "Request body for POST /v1/billing/topup."
      },
      "TopUpResponse": {
        "type": "object",
        "properties": {
          "transaction_id": {
            "type": "string"
          },
          "payment_url": {
            "type": "string"
          },
          "amount_rub": {
            "type": "number",
            "format": "double"
          },
          "status": {
            "type": "string"
          }
        },
        "additionalProperties": false,
        "description": "Response for POST /v1/billing/topup."
      },
      "TopicScoreResponse": {
        "type": "object",
        "properties": {
          "topic": {
            "type": "string",
            "description": "Topic id, e.g. \"technology\", \"finance\"."
          },
          "score": {
            "type": "number",
            "description": "Relevance score (0..1).",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "A topic label with its relevance score."
      },
      "TranscriptionJobResponse": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "description": "Job id to poll via GET /v1/transcribe/{jobId}."
          },
          "status": {
            "type": "string",
            "description": "Initial job status (always \"queued\")."
          },
          "estimated_seconds": {
            "type": "integer",
            "description": "Rough estimate of processing time in seconds.",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Async job acceptance response (HTTP 202)."
      },
      "TranscriptionResponse": {
        "type": "object",
        "properties": {
          "transcript": {
            "type": "string",
            "description": "Complete transcript as plain text."
          },
          "segments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TranscriptionSegmentResponse"
            },
            "description": "Time-sliced segments."
          },
          "language": {
            "type": "string",
            "description": "Detected language code (ISO 639-1)."
          },
          "language_confidence": {
            "type": "number",
            "description": "Confidence of language detection (0..1).",
            "format": "double"
          },
          "duration_seconds": {
            "type": "number",
            "description": "Audio duration in seconds.",
            "format": "double"
          },
          "processing_time_ms": {
            "type": "integer",
            "description": "Worker processing time in milliseconds.",
            "format": "int64"
          },
          "speakers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SpeakerResponse"
            },
            "description": "Speaker summary (only when diarization enabled).",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Full transcription response (sync endpoint)."
      },
      "TranscriptionSegmentResponse": {
        "type": "object",
        "properties": {
          "start": {
            "type": "number",
            "description": "Segment start time in seconds.",
            "format": "double"
          },
          "end": {
            "type": "number",
            "description": "Segment end time in seconds.",
            "format": "double"
          },
          "text": {
            "type": "string",
            "description": "Transcribed text for this slice."
          },
          "speaker": {
            "type": "string",
            "description": "Assigned speaker id (only when diarization is enabled).",
            "nullable": true
          },
          "confidence": {
            "type": "number",
            "description": "Optional model confidence.",
            "format": "double",
            "nullable": true
          },
          "words": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TranscriptionWordResponse"
            },
            "description": "Word-level timestamps (when available).",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Transcription segment (one time slice)."
      },
      "TranscriptionWordResponse": {
        "type": "object",
        "properties": {
          "word": {
            "type": "string",
            "description": "Word text."
          },
          "start": {
            "type": "number",
            "description": "Word start time in seconds.",
            "format": "double"
          },
          "end": {
            "type": "number",
            "description": "Word end time in seconds.",
            "format": "double"
          },
          "confidence": {
            "type": "number",
            "description": "Model confidence (0..1), when available.",
            "format": "double",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Single word timestamp within a transcription segment."
      },
      "TranslateTranscriptRequest": {
        "type": "object",
        "properties": {
          "target_language": {
            "type": "string",
            "description": "Target language code (e.g. `en`, `de`, `es`)."
          }
        },
        "additionalProperties": false,
        "description": "Request body for `POST /v1/transcribe/{jobId}/translate`."
      },
      "TranslateTranscriptResponse": {
        "type": "object",
        "properties": {
          "source_language": {
            "type": "string"
          },
          "target_language": {
            "type": "string"
          },
          "transcript": {
            "type": "string"
          },
          "segments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TranslatedSegmentResponse"
            }
          },
          "llm_model": {
            "type": "string"
          }
        },
        "additionalProperties": false,
        "description": "Response for `POST /v1/transcribe/{jobId}/translate`."
      },
      "TranslatedSegmentResponse": {
        "type": "object",
        "properties": {
          "start": {
            "type": "number",
            "format": "double"
          },
          "end": {
            "type": "number",
            "format": "double"
          },
          "text": {
            "type": "string"
          },
          "speaker": {
            "type": "string",
            "nullable": true
          },
          "confidence": {
            "type": "number",
            "format": "double",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "A translated transcript segment (timestamps preserved from the source)."
      },
      "UpdateMeetingProtocolRequest": {
        "type": "object",
        "properties": {
          "markdown": {
            "type": "string"
          }
        },
        "additionalProperties": false,
        "description": "Editable Markdown for a persisted meeting protocol."
      },
      "UsageResponse": {
        "type": "object",
        "properties": {
          "plan": {
            "type": "string",
            "description": "Plan id: demo, free, basic, pro, business."
          },
          "used_characters": {
            "type": "integer",
            "description": "Characters billed in the current UTC month.",
            "format": "int32"
          },
          "limit_characters": {
            "type": "integer",
            "description": "Monthly limit for the plan.",
            "format": "int32"
          },
          "remaining_characters": {
            "type": "integer",
            "description": "Characters remaining in the period.",
            "format": "int32"
          },
          "used_audio_seconds": {
            "type": "integer",
            "description": "Audio seconds billed in the current UTC month (transcription, analysis, voice-id, eval).",
            "format": "int32"
          },
          "limit_audio_seconds": {
            "type": "integer",
            "description": "Monthly audio-seconds limit for the plan.",
            "format": "int32"
          },
          "remaining_audio_seconds": {
            "type": "integer",
            "description": "Audio seconds remaining in the period.",
            "format": "int32"
          },
          "used_llm_tokens": {
            "type": "integer",
            "description": "LLM tokens billed in the current UTC month (QA, meeting protocol, translation, search).",
            "format": "int32"
          },
          "limit_llm_tokens": {
            "type": "integer",
            "description": "Monthly LLM-token limit for the plan.",
            "format": "int32"
          },
          "remaining_llm_tokens": {
            "type": "integer",
            "description": "LLM tokens remaining in the period.",
            "format": "int32"
          },
          "period_start_utc": {
            "type": "string",
            "description": "Inclusive start of the billing period (UTC).",
            "format": "date-time"
          },
          "period_end_utc": {
            "type": "string",
            "description": "Exclusive end of the billing period (UTC).",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "Monthly character quota for the authenticated API key."
      },
      "VadResponse": {
        "type": "object",
        "properties": {
          "segments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VadSegmentResponse"
            },
            "description": "Detected speech intervals."
          },
          "speech_ratio": {
            "type": "number",
            "description": "Fraction of the audio covered by speech (0..1).",
            "format": "double"
          },
          "duration_seconds": {
            "type": "number",
            "description": "Audio duration in seconds.",
            "format": "double"
          },
          "processing_time_ms": {
            "type": "integer",
            "description": "Worker processing time in milliseconds.",
            "format": "int64"
          }
        },
        "additionalProperties": false,
        "description": "Batch speech-activity detection (VAD) response."
      },
      "VadSegmentResponse": {
        "type": "object",
        "properties": {
          "start": {
            "type": "number",
            "description": "Segment start time in seconds.",
            "format": "double"
          },
          "end": {
            "type": "number",
            "description": "Segment end time in seconds.",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "A detected speech interval (seconds)."
      },
      "VideoEffectsJobResponse": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "description": "Job id to poll via GET /v1/video/effects/{jobId}."
          },
          "status": {
            "type": "string",
            "description": "Initial job status (always \"queued\")."
          },
          "estimated_seconds": {
            "type": "integer",
            "description": "Rough estimate of processing time in seconds.",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Async video-effects acceptance response (HTTP 202)."
      },
      "VideoEffectsJobStatusResponse": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "description": "Job id."
          },
          "status": {
            "type": "string",
            "description": "queued | processing | completed | failed."
          },
          "result": {
            "$ref": "#/components/schemas/VideoEffectsManifestResponse"
          },
          "error_code": {
            "type": "string",
            "description": "Error code (present when status=failed).",
            "nullable": true
          },
          "error_message": {
            "type": "string",
            "description": "Error message (present when status=failed).",
            "nullable": true
          }
        },
        "additionalProperties": false,
        "description": "Video-effects job poll response."
      },
      "VideoEffectsManifestResponse": {
        "type": "object",
        "properties": {
          "duration_milliseconds": {
            "type": "integer",
            "description": "Processed audio duration in milliseconds.",
            "format": "int32"
          },
          "format": {
            "type": "string",
            "description": "Output format: mp4 | webm (mux) or wav | mp3 | ogg (audio)."
          },
          "artifact_size_bytes": {
            "type": "integer",
            "description": "Output artifact size in bytes.",
            "format": "int32"
          },
          "artifact_path": {
            "type": "string",
            "description": "Relative path to download the artifact."
          }
        },
        "additionalProperties": false,
        "description": "Result manifest of a completed video-effects job."
      },
      "VoiceDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Public voice id (preset_…)."
          },
          "display_name": {
            "type": "string",
            "description": "Human-readable name."
          },
          "description": {
            "type": "string",
            "description": "Intended use of the voice."
          },
          "gender": {
            "type": "string",
            "description": "female, male, or neutral."
          },
          "language": {
            "type": "string",
            "description": "BCP-47 language tag (ru for built-in voices)."
          },
          "engine": {
            "type": "string",
            "description": "Synthesis engine id: standard (preset voices) or premium (cloned voices)."
          },
          "is_premium": {
            "type": "boolean",
            "description": "True if the voice requires premium synthesis (cloned voices). Built-in voices are false."
          },
          "is_default": {
            "type": "boolean",
            "description": "True for the default voice (preset_anna)."
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Discovery tags such as default, male, female, neutral."
          },
          "emotions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Emotion values accepted in synthesize requests. CosyVoice has no emotion control, so these are ignored."
          },
          "sample_rates": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "description": "Allowed sample_rate values in Hz."
          },
          "formats": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Allowed audio format ids: mp3, wav, ogg (Vorbis), opus (OGG/Opus)."
          }
        },
        "additionalProperties": false
      },
      "VoiceIdMatchResponse": {
        "type": "object",
        "properties": {
          "voice_id": {
            "type": "string"
          },
          "similarity": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "Similarity of the uploaded voice to a known reference voice."
      },
      "VoiceIdResponse": {
        "type": "object",
        "properties": {
          "language": {
            "type": "string",
            "description": "Spoken language (ISO 639-1) detected from the audio."
          },
          "language_confidence": {
            "type": "number",
            "format": "double"
          },
          "duration_seconds": {
            "type": "number",
            "format": "double"
          },
          "speech_ratio": {
            "type": "number",
            "description": "Fraction of the audio covered by speech (0..1).",
            "format": "double"
          },
          "gender": {
            "type": "string",
            "description": "Speaker gender: male | female | unknown."
          },
          "gender_confidence": {
            "type": "number",
            "format": "double"
          },
          "age_group": {
            "type": "string",
            "description": "Coarse age bucket: child | adult | unknown."
          },
          "age_confidence": {
            "type": "number",
            "format": "double"
          },
          "emotional_background": {
            "type": "string",
            "description": "Dominant emotion over the speech (neutral by default)."
          },
          "emotions": {
            "type": "object",
            "additionalProperties": {
              "type": "number",
              "format": "double"
            },
            "description": "Per-emotion scores (joy, sadness, anger, fear, neutral).",
            "nullable": true
          },
          "ai_probability": {
            "type": "number",
            "description": "Probability that the voice is synthetic (0..1). Beta.",
            "format": "double",
            "nullable": true
          },
          "fake_detection_available": {
            "type": "boolean",
            "description": "Whether the anti-spoofing detector was available."
          },
          "speaker_embedding": {
            "type": "array",
            "items": {
              "type": "number",
              "format": "double"
            },
            "description": "ECAPA speaker fingerprint (192 floats). Null when unavailable.",
            "nullable": true
          },
          "nearest_voices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VoiceIdMatchResponse"
            },
            "description": "Similarity to known reference voices (empty in the MVP)."
          },
          "processing_time_ms": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false,
        "description": "Voice passport: who is speaking, how they sound and whether the audio is\r\nlikely synthetic."
      },
      "VoiceIdentificationResponse": {
        "type": "object",
        "properties": {
          "best_match": {
            "$ref": "#/components/schemas/VoiceIdMatchResponse"
          },
          "matches": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VoiceIdMatchResponse"
            },
            "description": "All profiles ranked by similarity (descending)."
          },
          "threshold": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "Result of a 1:N speaker identification."
      },
      "VoiceProfileResponse": {
        "type": "object",
        "properties": {
          "profile_id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "clone_voice_id": {
            "type": "string",
            "nullable": true
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false,
        "description": "An enrolled voice profile (voiceprint)."
      },
      "VoiceVerificationResponse": {
        "type": "object",
        "properties": {
          "profile_id": {
            "type": "string"
          },
          "similarity": {
            "type": "number",
            "description": "Cosine similarity between the audio and the profile (0..1).",
            "format": "double"
          },
          "verified": {
            "type": "boolean",
            "description": "Whether the similarity exceeds the verification threshold."
          },
          "threshold": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false,
        "description": "Result of a 1:1 speaker verification."
      },
      "WebhookSecretResponse": {
        "type": "object",
        "properties": {
          "secret": {
            "type": "string"
          },
          "signature_header": {
            "type": "string",
            "description": "Send this timestamp and signature with every webhook delivery."
          },
          "timestamp_header": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    "securitySchemes": {
      "ApiKey": {
        "type": "apiKey",
        "description": "Direct API key. Example: `dev_local_key`.",
        "name": "X-Api-Key",
        "in": "header"
      },
      "RapidApiKey": {
        "type": "apiKey",
        "description": "RapidAPI consumer key. Sent as `X-RapidAPI-Key` (with `X-RapidAPI-Host`); the Rapid Runtime forwards it to this API.",
        "name": "X-RapidAPI-Key",
        "in": "header"
      }
    }
  },
  "tags": [
    {
      "name": "Analysis",
      "description": "Voice Intelligence: sentiment analysis and keyword extraction."
    },
    {
      "name": "AudioCleaning",
      "description": "Audio-cleaning layer: remove background noise and normalize loudness of an\r\nuploaded audio file asynchronously. Uploads the input audio, gets a job ID\r\nimmediately, then polls `GET /v1/audio/clean/{jobId}` for the manifest\r\nand downloads the result from `GET /v1/audio/clean/{jobId}/audio`."
    },
    {
      "name": "AudioEffects",
      "description": "Audio-processing layer: apply an effect chain to an uploaded audio file\r\nasynchronously. Uploads the input audio, gets a job ID immediately, then\r\npolls `GET /v1/audio/effects/{jobId}` for the manifest and downloads\r\nthe result from `GET /v1/audio/effects/{jobId}/audio`."
    },
    {
      "name": "Batch",
      "description": "Batch operations: queue many synthesis or analysis tasks at once and poll\r\na single batch ID for per-item results."
    },
    {
      "name": "Voices",
      "description": "Voice cloning on the CosyVoice engine, available on Basic, Pro, and Business plans subject to plan limits."
    },
    {
      "name": "Evaluation",
      "description": "Speech evaluation: transcribe an uploaded clip and compare it\r\nagainst a reference text with a word error rate. Use it to compare voices\r\nand synthesis settings — the same reference through different voices."
    },
    {
      "name": "Integrations",
      "description": "Outbound integrations: the client's connections to external systems\r\n(CRM/SED) plus the push of recording artefacts to them. All providers share\r\none connection model, so adding a provider never adds a route."
    },
    {
      "name": "Meetings",
      "description": "Meeting intelligence: generate a structured meeting protocol\r\n(TL;DR, decisions, tasks, risks, next steps) from a stored recording."
    },
    {
      "name": "Qa",
      "description": "Call quality & script control: evaluate a recording\r\nagainst a declarative checklist of required and forbidden steps."
    },
    {
      "name": "Recordings",
      "description": "Recording library: recordings are kept as first-class\r\nobjects with metadata, transcript and independent retention windows."
    },
    {
      "name": "Search",
      "description": "Semantic search and Q&A over recordings: vector search\r\n(pgvector) and retrieval-augmented answers with verbatim citations."
    },
    {
      "name": "Transcription",
      "description": "Voice Intelligence: speech-to-text transcription and speaker diarization."
    },
    {
      "name": "VideoEffects",
      "description": "Video-processing layer: apply an effect chain to a video (mux mode) or to\r\nits audio track (audio mode) asynchronously. Upload the video (and an\r\noptional audio file for mux), get a job ID immediately, then poll\r\n`GET /v1/video/effects/{jobId}` and download the result from\r\n`GET /v1/video/effects/{jobId}/file`."
    },
    {
      "name": "VoiceId",
      "description": "Voice ID: one-shot voice passport + AI-vs-human (fake) detection."
    },
    {
      "name": "WebhookSettings",
      "description": "Webhook signing secrets for the authenticated API key owner."
    }
  ]
}