> ## Documentation Index
> Fetch the complete documentation index at: https://typecast.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# List Voices

> Lists all available voice models with enhanced metadata and filtering capabilities (V2).

This endpoint returns an enhanced voice list with model-grouped emotion support and additional metadata including gender, age group, and use cases. Each voice can support multiple models with their respective emotion sets.

**Key Features:**
- **Model Grouping**: Each voice includes a `models` array showing all supported TTS models and their available emotions
- **Enhanced Metadata**: Includes gender (male/female), age group (child/teenager/young_adult/middle_age/elder), and use cases
- **Advanced Filtering**: Filter by model, gender, age, and use cases to find voices matching specific requirements

**Use Cases:**
- Voice selection UI with demographic filters
- Finding voices suitable for specific content types (e.g., Ads, Audiobook, eLearning)
- Discovering which emotions are available for each model version
```



## OpenAPI

````yaml /api-reference/openapi.json get /v2/voices
openapi: 3.1.0
info:
  title: Typecast API
  version: 0.1.2
  x-logo:
    url: https://typecast.ai/_ipx/_/image/logo/tc_logo.webp
servers:
  - url: https://api.typecast.ai
    description: Production server
security:
  - ApiKeyAuth: []
paths:
  /v2/voices:
    get:
      tags:
        - Voices
      summary: List Voices
      description: >-
        Lists all available voice models with enhanced metadata and filtering
        capabilities (V2).


        This endpoint returns an enhanced voice list with model-grouped emotion
        support and additional metadata including gender, age group, and use
        cases. Each voice can support multiple models with their respective
        emotion sets.


        **Key Features:**

        - **Model Grouping**: Each voice includes a `models` array showing all
        supported TTS models and their available emotions

        - **Enhanced Metadata**: Includes gender (male/female), age group
        (child/teenager/young_adult/middle_age/elder), and use cases

        - **Advanced Filtering**: Filter by model, gender, age, and use cases to
        find voices matching specific requirements


        **Use Cases:**

        - Voice selection UI with demographic filters

        - Finding voices suitable for specific content types (e.g., Ads,
        Audiobook, eLearning)

        - Discovering which emotions are available for each model version

        ```
      operationId: get_voices_v2_v2_voices_get
      parameters:
        - name: model
          in: query
          required: false
          schema:
            $ref: '#/components/schemas/TTSModel'
          description: >-
            Filter by voice model (ssfm-v21 or ssfm-v30). Returns voices that
            support the specified model. Optional - if not provided, returns
            voices for all models.
        - name: gender
          in: query
          required: false
          schema:
            $ref: '#/components/schemas/GenderEnum'
          description: >-
            Filter by gender (male or female). Returns voices matching the
            specified gender. Optional - if not provided, returns voices of all
            genders.
        - name: age
          in: query
          required: false
          schema:
            $ref: '#/components/schemas/AgeEnum'
          description: >-
            Filter by age group (child, teenager, young_adult, middle_age,
            elder). Returns voices matching the specified age group. Optional -
            if not provided, returns voices of all ages.
        - name: use_cases
          in: query
          required: false
          schema:
            $ref: '#/components/schemas/UseCasesEnum'
          description: >-
            Filter by use case category. Returns voices tagged with the
            specified use case (TikTok/Reels/Shorts, Game,
            Audiobook/Storytelling, etc.). Optional - if not provided, returns
            all voices regardless of use case.
        - name: voice_type
          in: query
          required: false
          schema:
            $ref: '#/components/schemas/VoiceType'
          description: >-
            Filter by voice type (`original` or `custom`). Optional - if not
            provided, returns voices of all types.
      responses:
        '200':
          description: Success - Returns list of voice models with enhanced metadata
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/VoiceV2'
                title: Response Get Voices
              example:
                - voice_id: tc_60e5426de8b95f1d3000d7b5
                  voice_name: Olivia
                  models:
                    - version: ssfm-v30
                      emotions:
                        - normal
                        - happy
                        - sad
                        - angry
                        - whisper
                        - toneup
                        - tonedown
                    - version: ssfm-v21
                      emotions:
                        - normal
                        - happy
                        - sad
                        - angry
                  gender: female
                  age: young_adult
                  use_cases:
                    - Audiobook
                    - E-learning
                    - Ads
                  voice_type: original
        '401':
          description: Unauthorized - Invalid or missing API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                detail: Invalid API key
        '422':
          description: Validation Error - Invalid request parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                detail: Invalid request format
      x-codeSamples:
        - lang: cURL
          label: cURL
          source: |
            curl --request GET \
              --url 'https://api.typecast.ai/v2/voices?model=ssfm-v30&gender=female&age=young_adult' \
              --header 'X-API-KEY: <api-key>'
        - lang: C#
          label: C# (HttpClient)
          source: >
            using System;

            using System.Net.Http;

            using System.Threading.Tasks;


            var client = new HttpClient();

            client.DefaultRequestHeaders.Add("X-API-KEY", "<api-key>");


            var response = await
            client.GetAsync("https://api.typecast.ai/v2/voices?model=ssfm-v30&gender=female&age=young_adult");


            if (response.IsSuccessStatusCode)

            {
                var content = await response.Content.ReadAsStringAsync();
                Console.WriteLine(content);
            }
        - lang: Kotlin
          label: Kotlin (OkHttp)
          source: |
            import okhttp3.OkHttpClient
            import okhttp3.Request

            val client = OkHttpClient()

            val request = Request.Builder()
                .url("https://api.typecast.ai/v2/voices?model=ssfm-v30&gender=female&age=young_adult")
                .addHeader("X-API-KEY", "<api-key>")
                .get()
                .build()

            client.newCall(request).execute().use { response ->
                if (response.isSuccessful) {
                    println(response.body?.string())
                }
            }
        - lang: C++
          label: C++ (libcurl)
          source: >
            #include <curl/curl.h>

            #include <string>

            #include <iostream>


            size_t WriteCallback(void* contents, size_t size, size_t nmemb,
            void* userp) {
                ((std::string*)userp)->append((char*)contents, size * nmemb);
                return size * nmemb;
            }


            int main() {
                CURL* curl = curl_easy_init();
                if(curl) {
                    std::string readBuffer;
                    struct curl_slist* headers = NULL;

                    headers = curl_slist_append(headers, "X-API-KEY: <api-key>");

                    curl_easy_setopt(curl, CURLOPT_URL, "https://api.typecast.ai/v2/voices?model=ssfm-v30&gender=female&age=young_adult");
                    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
                    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
                    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);

                    CURLcode res = curl_easy_perform(curl);
                    if(res == CURLE_OK) {
                        std::cout << readBuffer << std::endl;
                    }

                    curl_slist_free_all(headers);
                    curl_easy_cleanup(curl);
                }
                return 0;
            }
        - lang: C
          label: C (libcurl)
          source: >
            #include <stdio.h>

            #include <stdlib.h>

            #include <string.h>

            #include <curl/curl.h>


            typedef struct {
                char* data;
                size_t size;
            } MemoryStruct;


            size_t WriteMemoryCallback(void* contents, size_t size, size_t
            nmemb, void* userp) {
                size_t realsize = size * nmemb;
                MemoryStruct* mem = (MemoryStruct*)userp;

                char* ptr = realloc(mem->data, mem->size + realsize + 1);
                if(!ptr) return 0;

                mem->data = ptr;
                memcpy(&(mem->data[mem->size]), contents, realsize);
                mem->size += realsize;
                mem->data[mem->size] = 0;

                return realsize;
            }


            int main(void) {
                CURL* curl;
                CURLcode res;
                MemoryStruct chunk = {NULL, 0};

                curl_global_init(CURL_GLOBAL_ALL);
                curl = curl_easy_init();

                if(curl) {
                    struct curl_slist* headers = NULL;
                    headers = curl_slist_append(headers, "X-API-KEY: <api-key>");

                    curl_easy_setopt(curl, CURLOPT_URL, "https://api.typecast.ai/v2/voices?model=ssfm-v30&gender=female&age=young_adult");
                    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
                    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
                    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&chunk);

                    res = curl_easy_perform(curl);

                    if(res == CURLE_OK) {
                        printf("%s\n", chunk.data);
                    }

                    curl_slist_free_all(headers);
                    curl_easy_cleanup(curl);
                    free(chunk.data);
                }

                curl_global_cleanup();
                return 0;
            }
        - lang: Swift
          label: Swift (URLSession)
          source: >
            import Foundation


            let url = URL(string:
            "https://api.typecast.ai/v2/voices?model=ssfm-v30&gender=female&age=young_adult")!

            var request = URLRequest(url: url)

            request.httpMethod = "GET"

            request.setValue("<api-key>", forHTTPHeaderField: "X-API-KEY")


            let task = URLSession.shared.dataTask(with: request) { data,
            response, error in
                if let data = data, let jsonString = String(data: data, encoding: .utf8) {
                    print(jsonString)
                }
            }

            task.resume()
        - lang: Rust
          label: Rust (reqwest)
          source: |
            use reqwest;

            #[tokio::main]
            async fn main() -> Result<(), Box<dyn std::error::Error>> {
                let client = reqwest::Client::new();

                let response = client
                    .get("https://api.typecast.ai/v2/voices?model=ssfm-v30&gender=female&age=young_adult")
                    .header("X-API-KEY", "<api-key>")
                    .send()
                    .await?;

                if response.status().is_success() {
                    let body = response.text().await?;
                    println!("{}", body);
                }

                Ok(())
            }
components:
  schemas:
    TTSModel:
      type: string
      enum:
        - ssfm-v30
        - ssfm-v21
      title: TTSModel
      description: >
        TTS model version to use for speech synthesis. Different models offer
        varying capabilities and quality levels.


        Available models:

        - **ssfm-v30**: Latest model with improved prosody and additional
        emotion presets (recommended)

        - **ssfm-v21**: Stable production model with proven reliability and
        consistent quality
    GenderEnum:
      type: string
      enum:
        - male
        - female
      title: GenderEnum
      description: >
        Gender classification enum - Converts database values (Korean) to API
        values (English).


        Available values:

        - **male**: Male voice

        - **female**: Female voice
    AgeEnum:
      type: string
      enum:
        - child
        - teenager
        - young_adult
        - middle_age
        - elder
      title: AgeEnum
      description: >
        Age group classification enum - Converts database values (Korean) to API
        values (English).


        Available values:

        - **child**: Child voice (under 12 years old)

        - **teenager**: Teenage voice (13-19 years old)

        - **young_adult**: Young adult voice (20-35 years old)

        - **middle_age**: Middle-aged voice (36-60 years old)

        - **elder**: Elder voice (over 60 years old)
    UseCasesEnum:
      type: string
      enum:
        - Announcer
        - Anime
        - Audiobook
        - Conversational
        - Documentary
        - E-learning
        - Rapper
        - Game
        - Tiktok/Reels
        - News
        - Podcast
        - Voicemail
        - Ads
      description: >
        Voice use case categories for content type filtering. Each voice is
        tagged with one or more use cases indicating its suitability for
        specific content types.


        **Available Use Cases:**

        - **Announcer**: Public announcements and presentations

        - **Anime**: Animation and character voices

        - **Audiobook**: Long-form narration and storytelling

        - **Conversational**: Chatbots and conversational AI

        - **Documentary**: Documentary narration and commentary

        - **E-learning**: Educational content and tutorials

        - **Rapper**: Rap and music performance

        - **Game**: Video game characters and narration

        - **Tiktok/Reels**: Short-form social media content

        - **News**: News broadcasting

        - **Podcast**: Broadcasting and podcast production

        - **Voicemail**: IVR systems and voice assistants

        - **Ads**: Advertising and promotional content
    VoiceType:
      type: string
      enum:
        - original
        - custom
      title: VoiceType
      description: >-
        Voice type classification.


        - `original` — Typecast-provided stock voices available to every
        account.

        - `custom` — Voices the user created by uploading or cloning their own
        sample.
    VoiceV2:
      type: object
      properties:
        voice_id:
          type: string
          title: Voice Id
          description: >-
            Unique voice identifier. Built-in voices use the `tc_` prefix (e.g.,
            `tc_60e5426de8b95f1d3000d7b5`); cloned custom voices created via
            `POST /v1/voices/clone` use the `uc_` prefix and are also returned
            by `/v2/voices` for the owner.
        voice_name:
          type: string
          title: Voice Name
          description: Human-readable name of the voice
        models:
          type: array
          items:
            $ref: '#/components/schemas/ModelInfo'
          title: Models
          description: >-
            List of supported TTS models with their available emotions (e.g.,
            [{'version': 'ssfm-v21', 'emotions': ['happy', 'sad']}])
        gender:
          description: Voice gender classification (male/female)
          anyOf:
            - $ref: '#/components/schemas/GenderEnum'
            - type: 'null'
        age:
          description: >-
            Voice age group classification
            (child/teenager/young_adult/middle_age/elder)
          anyOf:
            - $ref: '#/components/schemas/AgeEnum'
            - type: 'null'
        use_cases:
          type: array
          items:
            type: string
          title: Use Cases
          description: List of use case categories this voice is suitable for
        voice_type:
          $ref: '#/components/schemas/VoiceType'
          description: >-
            Voice type — `original` for Typecast-provided stock voices, `custom`
            for user-cloned voices.
      required:
        - voice_id
        - voice_name
        - models
        - voice_type
      title: VoiceV2
      description: >-
        V2 Voice response model with model-grouped emotions and enhanced
        metadata
    ErrorResponse:
      type: object
      properties:
        detail:
          type: string
          description: Error message describing the issue
      required:
        - detail
      example:
        detail: An error occurred processing the request
    ModelInfo:
      type: object
      properties:
        version:
          $ref: '#/components/schemas/TTSModel'
          description: TTS model version (e.g., ssfm-v21, ssfm-v30)
        emotions:
          type: array
          items:
            type: string
          title: Emotions
          description: List of supported emotions for this model
      required:
        - version
        - emotions
      title: ModelInfo
      description: Model information including version and supported emotions
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-KEY
      description: >-
        API key for authentication. You can obtain an API key from the Typecast
        API Console.

````