# List speech models for OpenAI-compatible apps

`GET https://api.paxalabs.com/v1/audio/models`

GET /v1/audio/models lists Paxa TTS Flash v2 at the path OpenAI-compatible apps read to fill their model picker. Public, no API key required.

Apps such as [Open WebUI](https://paxalabs.com/docs/integrations/open-webui) read this path for their TTS model list. The entry is the one [GET /v1/models](https://paxalabs.com/docs/api/models) reports, and every voice [GET /v1/audio/voices](https://paxalabs.com/docs/api/audio-voices) lists runs on it. OpenAI's model names (tts-1, tts-1-hd, gpt-4o-mini-tts, gpt-4o-mini-tts-2025-03-20, gpt-4o-mini-tts-2025-12-15) stay off the list and still work on [POST /v1/audio/speech](https://paxalabs.com/docs/api/speech).

## Response

- `models` (array of objects, required)
  - `models[].id` (string, required): Model id to send as the model field.
  - `models[].name` (string, required): Display name.
  - `models[].product` (string, required): Capability of the model: "tts", "translation", "ocr", "extraction", or "stt".
  - `models[].max_chars` (integer or null, required): Per-request ceiling on the text field in characters. Null for models that read files, such as OCR, Document Extraction, and transcription.
  - `models[].max_request_chars` (integer or null, required): Ceiling on the request's total billable characters, where that differs from max_chars. Null when it does not. Translation models bill every field. This ceiling bounds the text together with instructions, context, examples, do_not_translate strings, and glossary.
  - `models[].credits_per_1k_chars` (integer or null, required): Cost in credits per 1000 input characters, billed per character and rounded up to the next hundredth of a credit. TTS requests that set timestamps bill at 1.25x this rate. Null for models billed by page or by recording length.
  - `models[].reference_credits_per_1k_chars` (integer or null, required): Cost in credits per 1000 characters of material the model reads without translating: instructions, context, examples, do_not_translate strings, and glossary. Null for models that have no such material.
  - `models[].credits_per_page` (number or null, required): Cost in credits per page for models billed by page, such as OCR and Document Extraction, exact to a hundredth. Null for models billed otherwise.
  - `models[].large_schema_credits_per_page` (number or null, required): Cost in credits per page a Document Extraction request takes when its schema declares large_schema_min_leaves leaf fields or more. Null for other models.
  - `models[].large_schema_min_leaves` (integer or null, required): Leaf count from which a Document Extraction schema bills at large_schema_credits_per_page. Null for other models.
  - `models[].max_leaves` (integer or null, required): Most leaf fields one Document Extraction schema may declare, counted after arrays and nested objects are unfolded; more answers 400 schema_invalid. Null for other models.
  - `models[].credits_per_hour` (integer or null, required): Cost in credits per hour of audio for models billed by audio length: a recording's exact length, or the audio received over a realtime connection. Null for models billed otherwise.
  - `models[].max_pages` (integer or null, required): Most pages one request accepts; null for models not billed by page. Document Extraction's ceiling is lower than OCR's.
  - `models[].max_duration_seconds` (integer or null, required): Longest recording one request accepts, in seconds; null for models that do not read audio.
  - `models[].diarization_limit_seconds` (integer or null, required): Length at which speaker attribution stops, in seconds, well below max_duration_seconds. With diarization on, a recording this long or longer answers 400 diarization_audio_too_long; with it off, it transcribes normally. Null for models that do not read audio.
  - `models[].max_session_seconds` (integer or null, required): Most audio one realtime connection accepts, in seconds; reaching it ends the session as an end frame would. Null for models that do not serve a connection.
  - `models[].encodings` (array of objects or null, required): Audio encodings a realtime connection's start frame may declare, each with the sample rates it accepts. Null for models that do not serve a connection.
  - `models[].max_bytes` (integer or null, required): Largest decoded file one request accepts, in bytes. Null for models that read text.
  - `models[].formats` (array of strings or null, required): File formats the model reads: "pdf", "png", "jpeg", "webp" for OCR and Document Extraction; "mp3", "wav", "flac", "ogg", "m4a", "aac", "webm" for transcription. Null for models that read text.
  - `models[].min_request_credits` (number, required): Smallest charge one request to this model can incur, in credits.
  - `models[].voices` (array of strings, required): Ids of the voices on this model's roster, the values the voice field accepts. GET /v1/voices carries each voice's details. Empty for models without voices.
  - `models[].sources` (array of strings or null, required): Source language codes the translation source field accepts alongside "auto"; null for non-translation models.
  - `models[].target` (string or null, required): Target language code the model translates into; null for non-translation models.

## Example

curl:

```bash
curl https://api.paxalabs.com/v1/audio/models
```

Response:

```json
{
  "models": [
    {
      "id": "paxa-tts-flash-v2",
      "name": "Paxa TTS Flash v2",
      "product": "tts",
      "max_chars": 5000,
      "max_request_chars": null,
      "credits_per_1k_chars": 10,
      "reference_credits_per_1k_chars": null,
      "credits_per_page": null,
      "large_schema_credits_per_page": null,
      "large_schema_min_leaves": null,
      "max_leaves": null,
      "credits_per_hour": null,
      "max_pages": null,
      "max_duration_seconds": null,
      "diarization_limit_seconds": null,
      "max_session_seconds": null,
      "encodings": null,
      "max_bytes": null,
      "formats": null,
      "min_request_credits": 0.1,
      "voices": [
        "khanomkrok",
        "nomyen",
        "foithong",
        "massaman",
        "thongek",
        "panang",
        "oliang",
        "sanaechan",
        "tubtimkrob",
        "mooping",
        "bualoi",
        "lukchup",
        "lodchong",
        "woon",
        "sangkaya",
        "khaoniao",
        "tomyum",
        "khanomchan",
        "kaprao",
        "cookie",
        "latte",
        "espresso",
        "mocha",
        "taohuay",
        "oolong",
        "saku",
        "satay",
        "thongyod",
        "baitoey",
        "kluaytod",
        "matum",
        "hormok",
        "nammanao",
        "khaotom",
        "salim",
        "krayasat",
        "miangkham",
        "todmun",
        "namprik",
        "khaijiao",
        "chuchi",
        "krongkraeng",
        "chormuang",
        "khaolam",
        "plathu",
        "kaengphet",
        "kaengpa",
        "makham",
        "puifai",
        "tako"
      ],
      "sources": null,
      "target": null
    }
  ]
}
```
