> ## 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.

# Get Voice Details

> Retrieves detailed information for a specific voice with enhanced metadata (V2).

This endpoint returns the complete information for a single voice, including model-grouped emotion support and metadata such as gender, age group, and use cases. Use this when you need to verify voice details or check available emotions before making a TTS request.

**Response includes:**
- **voice_id**: Unique voice identifier
- **voice_name**: Human-readable voice name
- **models**: Array of supported TTS models with their respective emotion sets
- **gender**: Voice gender classification (male/female)
- **age**: Age group classification (child/teenager/young_adult/middle_age/elder)
- **use_cases**: Recommended content categories for this voice

**Use Cases:**
- Verify voice availability before TTS request
- Check supported emotions for a specific voice and model combination
- Display voice details in a voice selection UI
```



## OpenAPI

````yaml /api-reference/openapi.json get /v2/voices/{voice_id}
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/{voice_id}:
    get:
      tags:
        - Voices
      summary: Get Voice Details
      description: >-
        Retrieves detailed information for a specific voice with enhanced
        metadata (V2).


        This endpoint returns the complete information for a single voice,
        including model-grouped emotion support and metadata such as gender, age
        group, and use cases. Use this when you need to verify voice details or
        check available emotions before making a TTS request.


        **Response includes:**

        - **voice_id**: Unique voice identifier

        - **voice_name**: Human-readable voice name

        - **models**: Array of supported TTS models with their respective
        emotion sets

        - **gender**: Voice gender classification (male/female)

        - **age**: Age group classification
        (child/teenager/young_adult/middle_age/elder)

        - **use_cases**: Recommended content categories for this voice


        **Use Cases:**

        - Verify voice availability before TTS request

        - Check supported emotions for a specific voice and model combination

        - Display voice details in a voice selection UI

        ```
      operationId: get_voice_v2_v2_voices__voice_id__get
      parameters:
        - name: voice_id
          in: path
          required: true
          schema:
            type: string
            title: Voice Id
      responses:
        '200':
          description: Success - Returns detailed information for the requested voice
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VoiceV2'
              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
        '404':
          description: Not Found - Requested voice does not exist
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                detail: Voice not found
        '422':
          description: Validation Error - Invalid voice_id format
          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/tc_60e5426de8b95f1d3000d7b5' \
              --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 voiceId = "tc_60e5426de8b95f1d3000d7b5";

            var response = await
            client.GetAsync($"https://api.typecast.ai/v2/voices/{voiceId}");


            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 voiceId = "tc_60e5426de8b95f1d3000d7b5"

            val request = Request.Builder()
                .url("https://api.typecast.ai/v2/voices/$voiceId")
                .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>");

                    std::string url = "https://api.typecast.ai/v2/voices/tc_60e5426de8b95f1d3000d7b5";

                    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
                    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>");

                    const char* url = "https://api.typecast.ai/v2/voices/tc_60e5426de8b95f1d3000d7b5";

                    curl_easy_setopt(curl, CURLOPT_URL, url);
                    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 voiceId = "tc_60e5426de8b95f1d3000d7b5"

            let url = URL(string:
            "https://api.typecast.ai/v2/voices/\(voiceId)")!

            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 voice_id = "tc_60e5426de8b95f1d3000d7b5";

                let url = format!("https://api.typecast.ai/v2/voices/{}", voice_id);

                let response = client
                    .get(&url)
                    .header("X-API-KEY", "<api-key>")
                    .send()
                    .await?;

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

                Ok(())
            }
components:
  schemas:
    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
    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)
    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.
    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
  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.

````