Anam.ai Voices API

The Voices API from Anam.ai — 3 operation(s) for voices.

OpenAPI Specification

anamai-voices-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Anam AI Avatars Voices API
  version: '1.0'
servers:
- url: https://api.anam.ai
  description: Anam API
security:
- BearerAuth: []
tags:
- name: Voices
paths:
  /v1/voices:
    get:
      description: Returns a list of all voices
      parameters:
      - in: query
        name: page
        schema:
          type: integer
          minimum: 1
          default: 1
        description: Page number for pagination
      - in: query
        name: perPage
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 10
        description: Number of voices per page (max 100)
      - in: query
        name: search
        schema:
          type: string
        description: Search term to filter voices by display name
      responses:
        '200':
          description: Successfully retrieved voices
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Voice'
                  meta:
                    $ref: '#/components/schemas/Pagination'
              examples:
                default:
                  $ref: '#/components/examples/VoiceListResponse'
        '401':
          description: Unauthorized - Invalid or missing API key
        '403':
          description: Forbidden - Account does not have access or API key lacks the required permission
        '404':
          description: Not Found - No voices found
        '500':
          description: Server error
      tags:
      - Voices
      operationId: listVoices
      summary: list voices
      x-mint:
        metadata:
          title: list voices
        mcp:
          enabled: true
          name: list-voices
          description: Returns a list of all voices
    post:
      description: Create a new voice by cloning from an audio file. Send the audio inline as multipart/form-data (the whole request must stay under ~4.5MB), or, for larger clips, first upload via `POST /v1/voices/presigned-upload` and send a JSON body referencing the returned `audioKey`.
      requestBody:
        description: Audio sample and metadata used to clone a new voice.
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
              - name
              - audioFile
              properties:
                name:
                  type: string
                  description: Display name for the cloned voice
                audioFile:
                  type: string
                  format: binary
                  description: Audio file to clone the voice from
                description:
                  type: string
                  description: Optional description of the voice
                language:
                  type: string
                  default: en
                  description: Language code for the voice
                enhance:
                  type: boolean
                  default: true
                  description: Whether to enhance the voice quality
          application/json:
            schema:
              type: object
              required:
              - name
              - audioKey
              properties:
                name:
                  type: string
                  description: Display name for the cloned voice
                audioKey:
                  type: string
                  description: Storage key returned by POST /v1/voices/presigned-upload, after the audio has been uploaded to the presigned URL. Use this for clips larger than ~4.5MB.
                description:
                  type: string
                  description: Optional description of the voice
                language:
                  type: string
                  default: en
                  description: Language code for the voice
                enhance:
                  type: boolean
                  default: true
                  description: Whether to enhance the voice quality
      responses:
        '201':
          description: Successfully created voice clone
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Voice'
              examples:
                default:
                  $ref: '#/components/examples/VoiceResponse'
        '400':
          description: Bad request - Invalid voice data
        '401':
          description: Unauthorized - Invalid or missing API key
        '403':
          description: Forbidden - Requires enterprise plan or API key lacks the required permission
        '500':
          description: Server error
      tags:
      - Voices
      operationId: createVoice
      summary: create voice
      x-mint:
        metadata:
          title: create voice
        mcp:
          enabled: true
          name: create-voice
          description: Create a new voice by cloning from an audio file. Send the audio inline as multipart/form-data (the whole request must stay under ~4.5MB), or, for larger clips, first upload via `POST /v1/voices/presigned-upload` and send a JSON body referencing the returned `audioKey`.
  /v1/voices/presigned-upload:
    post:
      description: 'Request a presigned URL for uploading a voice-clone audio clip directly to storage. Use this for clips larger than the ~4.5MB request-body limit of the multipart `POST /v1/voices` endpoint. Flow: (1) call this endpoint to get an `uploadUrl` and `audioKey`; (2) `PUT` the raw audio bytes to `uploadUrl` with the same `Content-Type`; (3) call `POST /v1/voices` with a JSON body referencing the `audioKey` to perform the clone.'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - filename
              - contentType
              - fileSize
              properties:
                filename:
                  type: string
                  description: Original filename of the audio clip (used to derive the storage key).
                contentType:
                  type: string
                  description: Audio MIME type (must start with `audio/`, e.g. audio/wav). The subsequent PUT must use the same value.
                fileSize:
                  type: integer
                  description: Size of the file in bytes. Required and must not exceed 50MB (52428800).
      responses:
        '200':
          description: Presigned upload URL generated
          content:
            application/json:
              schema:
                type: object
                properties:
                  uploadUrl:
                    type: string
                    description: Presigned URL to PUT the audio bytes to (valid for 1 hour).
                  audioKey:
                    type: string
                    description: Opaque storage key to pass back to POST /v1/voices.
        '400':
          description: Bad request - Invalid body or file too large
        '401':
          description: Unauthorized - Invalid or missing API key
        '403':
          description: Forbidden - Voice cloning not available on the current plan, or API key lacks the required permission
        '500':
          description: Server error
      tags:
      - Voices
      operationId: createVoicePresignedUpload
      summary: create voice presigned upload
      x-mint:
        metadata:
          title: create voice presigned upload
        mcp:
          enabled: true
          name: create-voice-presigned-upload
          description: 'Request a presigned URL for uploading a voice-clone audio clip directly to storage. Use this for clips larger than the ~4.5MB request-body limit of the multipart `POST /v1/voices` endpoint. Flow: (1) call this endpoint to get an `uploadUrl` and `audioKey`; (2) `PUT` the raw audio bytes to `uploadUrl` with the same `Content-Type`; (3) call `POST /v1/voices` with a JSON body referencing the `audioKey` to perform the clone.'
  /v1/voices/{id}:
    get:
      description: Returns a voice by ID
      parameters:
      - in: path
        name: id
        schema:
          type: string
          format: uuid
        required: true
        description: Voice ID
      responses:
        '200':
          description: Successfully retrieved voice
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Voice'
              examples:
                default:
                  $ref: '#/components/examples/VoiceResponse'
        '400':
          description: Bad request - Invalid voice ID
        '401':
          description: Unauthorized - Invalid or missing API key
        '403':
          description: Forbidden - API key lacks the required permission
        '404':
          description: Not Found - Voice not found
        '500':
          description: Server error
      tags:
      - Voices
      operationId: getVoice
      summary: get voice
      x-mint:
        metadata:
          title: get voice
        mcp:
          enabled: true
          name: get-voice
          description: Returns a voice by ID
    put:
      description: Update a voice by ID (display name and provider model ID can be updated)
      parameters:
      - in: path
        name: id
        schema:
          type: string
          format: uuid
        required: true
        description: Voice ID
      requestBody:
        description: Fields to update on the voice. Only the listed fields can be changed; omit a field to leave it unchanged.
        required: true
        content:
          application/json:
            examples:
              default:
                $ref: '#/components/examples/VoiceUpdate'
            schema:
              type: object
              required:
              - displayName
              properties:
                displayName:
                  type: string
                  description: New display name for the voice
                providerModelId:
                  type: string
                  description: New provider model ID for the voice (e.g. sonic-3.5 for Cartesia, eleven_flash_v2_5 for ElevenLabs)
                  example: sonic-3.5
                gender:
                  type:
                  - string
                  - 'null'
                  enum:
                  - MALE
                  - FEMALE
                  - NEUTRAL
                  - null
                  description: Voice gender
                country:
                  type:
                  - string
                  - 'null'
                  description: ISO 3166-1 alpha-2 country code
                description:
                  type:
                  - string
                  - 'null'
                  description: Voice description
      responses:
        '200':
          description: Successfully updated voice
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Voice'
              examples:
                default:
                  $ref: '#/components/examples/VoiceResponse'
        '400':
          description: Bad request - Invalid voice data
        '401':
          description: Unauthorized - Invalid or missing API key
        '403':
          description: Forbidden - API key lacks the required permission
        '404':
          description: Not Found - Voice not found
        '500':
          description: Server error
      tags:
      - Voices
      operationId: updateVoice
      summary: update voice
      x-mint:
        metadata:
          title: update voice
        mcp:
          enabled: true
          name: update-voice
          description: Update a voice by ID (display name and provider model ID can be updated)
    delete:
      description: Delete a voice by ID
      parameters:
      - in: path
        name: id
        schema:
          type: string
          format: uuid
        required: true
        description: Voice ID
      responses:
        '200':
          description: Successfully deleted voice
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: Voice deleted successfully
        '400':
          description: Bad request - Invalid voice ID
        '401':
          description: Unauthorized - Invalid or missing API key
        '403':
          description: Forbidden - API key lacks the required permission
        '404':
          description: Not Found - Voice not found
        '500':
          description: Server error
      tags:
      - Voices
      operationId: deleteVoice
      summary: delete voice
      x-mint:
        metadata:
          title: delete voice
        mcp:
          enabled: true
          name: delete-voice
          description: Delete a voice by ID. Use with caution as this action cannot be undone.
components:
  examples:
    VoiceListResponse:
      summary: A paginated list of voices
      value:
        data:
        - id: de23e340-1416-4dd8-977d-065a7ca11697
          displayName: Lucy - Fresh & Casual
          provider: ELEVENLABS
          providerVoiceId: lcMyyd2HUfFzxdCaC4Ta
          providerModelId: eleven_flash_v2_5
          sampleUrl: https://newgxnc1uqs0jnqm.public.blob.vercel-storage.com/voice-samples/de23e340-1416-4dd8-977d-065a7ca11697/1760617899390.mp3
          previewSampleUrl: https://newgxnc1uqs0jnqm.public.blob.vercel-storage.com/voice-samples/de23e340-1416-4dd8-977d-065a7ca11697/1760617899390.mp3
          gender: FEMALE
          country: GB
          description: Energetic and youthful British voice, perfect for narrations and conversational agents.
          displayTags:
          - fast
          isZdr: true
          createdByOrganizationId: null
          createdAt: '2026-04-20T10:00:00.000Z'
          updatedAt: '2026-04-20T10:00:00.000Z'
        meta:
          total: 1
          lastPage: 1
          currentPage: 1
          perPage: 10
          prev: null
          next: null
    VoiceResponse:
      summary: A single voice resource
      value:
        id: de23e340-1416-4dd8-977d-065a7ca11697
        displayName: Lucy - Fresh & Casual
        provider: ELEVENLABS
        providerVoiceId: lcMyyd2HUfFzxdCaC4Ta
        providerModelId: eleven_flash_v2_5
        sampleUrl: https://newgxnc1uqs0jnqm.public.blob.vercel-storage.com/voice-samples/de23e340-1416-4dd8-977d-065a7ca11697/1760617899390.mp3
        previewSampleUrl: https://newgxnc1uqs0jnqm.public.blob.vercel-storage.com/voice-samples/de23e340-1416-4dd8-977d-065a7ca11697/1760617899390.mp3
        gender: FEMALE
        country: GB
        description: Energetic and youthful British voice, perfect for narrations and conversational agents.
        displayTags:
        - fast
        isZdr: true
        createdByOrganizationId: null
        createdAt: '2026-04-20T10:00:00.000Z'
        updatedAt: '2026-04-20T10:00:00.000Z'
    VoiceUpdate:
      summary: Update a voice's display name and provider model
      value:
        displayName: My cloned voice
        providerModelId: sonic-3.5
  schemas:
    Pagination:
      type: object
      description: Pagination metadata returned alongside the `data` array of every list endpoint.
      properties:
        total:
          type: integer
          description: Total number of items across all pages.
        lastPage:
          type: integer
          description: Number of the last page.
        currentPage:
          type: integer
          description: Number of the current page.
        perPage:
          type: integer
          description: Number of items per page.
        prev:
          type:
          - integer
          - 'null'
          description: Number of the previous page, or null if on the first page.
        next:
          type:
          - integer
          - 'null'
          description: Number of the next page, or null if on the last page.
    Voice:
      type: object
      description: A voice preset a persona can use for text-to-speech.
      properties:
        id:
          type: string
          format: uuid
          description: Unique identifier for the voice.
        displayName:
          type: string
          description: Human-readable name shown in the Lab.
        provider:
          type: string
          enum:
          - CARTESIA
          - ELEVENLABS
          - OPENAI_ADVANCED_VOICE
          - FISH_AUDIO
          description: Upstream TTS provider for this voice.
        providerVoiceId:
          type:
          - string
          - 'null'
          description: The upstream provider's identifier for the voice.
        providerModelId:
          type:
          - string
          - 'null'
          description: The upstream provider's model identifier used to generate speech.
        sampleUrl:
          type:
          - string
          - 'null'
          format: uri
          description: URL of a short audio preview of the voice.
        previewSampleUrl:
          type:
          - string
          - 'null'
          format: uri
          description: Alias for `sampleUrl`, kept for backwards compatibility.
        gender:
          type:
          - string
          - 'null'
          enum:
          - MALE
          - FEMALE
          - NEUTRAL
          - null
          description: Perceived gender of the voice, if categorised.
        country:
          type:
          - string
          - 'null'
          description: ISO 3166-1 alpha-2 country code representing the voice's accent.
        description:
          type:
          - string
          - 'null'
          description: Free-form description of the voice's character.
        displayTags:
          type: array
          items:
            type: string
          description: Tags used to categorise the voice in the Lab UI.
        isZdr:
          type: boolean
          description: Whether this voice meets the Zero Data Retention requirements.
        createdByOrganizationId:
          type:
          - string
          - 'null'
          description: ID of the organization that created the voice, or `null` for stock voices. IDs may be either UUIDs or nanoid-style strings depending on when the organization was created.
        createdAt:
          type: string
          format: date-time
          description: Timestamp when the voice was created.
        updatedAt:
          type: string
          format: date-time
          description: Timestamp when the voice was last updated.
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
x-mint:
  mcp:
    enabled: true