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

# Create a custom voice model

> Starts training a new custom voice model from the supplied audio URLs. Training runs asynchronously — the response returns immediately with the new model's `id`; poll `GET /voice-models/{id}` and watch `percentageDone` and `confirmedDone` to know when the model is usable for conversions.

The combined duration of `trainingAudioUrls` must not exceed your plan's maximum (default 30 minutes). The number of custom models you may hold concurrently may also be capped by your plan.



## OpenAPI

````yaml POST /voice-models
openapi: 3.1.0
info:
  title: Audimee API
  description: >-
    The Audimee API lets clients browse voice models, train custom voices, and
    run AI voice conversions.
  version: 1.0.0
servers:
  - url: https://audimee.com/api/v1
security:
  - bearerAuth: []
paths:
  /voice-models:
    post:
      tags:
        - Voice Models
      summary: Create a custom voice model
      description: >-
        Starts training a new custom voice model from the supplied audio URLs.
        Training runs asynchronously — the response returns immediately with the
        new model's `id`; poll `GET /voice-models/{id}` and watch
        `percentageDone` and `confirmedDone` to know when the model is usable
        for conversions.


        The combined duration of `trainingAudioUrls` must not exceed your plan's
        maximum (default 30 minutes). The number of custom models you may hold
        concurrently may also be capped by your plan.
      operationId: createVoiceModel
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateVoiceModelRequest'
            example:
              name: My band lead
              trainingAudioUrls:
                - https://example.com/audio/take-1.wav
                - https://example.com/audio/take-2.wav
      responses:
        '200':
          description: Training queued. Poll `GET /voice-models/{id}` to track progress.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateVoiceModelResponse'
              example:
                id: 8f1c2a7e-3d0b-4b2a-9f6a-1f4d6c3e9b21
                type: custom
        '400':
          description: >-
            Invalid body, custom model limit reached, or combined training audio
            exceeds the per-model maximum length.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                limitReached:
                  summary: Custom model limit hit
                  value:
                    error: Custom model limit reached (max 25)
                tooLong:
                  summary: Combined audio too long
                  value:
                    error: >-
                      Combined training audio length (2100s) exceeds maximum of
                      1800s
        '401':
          $ref: '#/components/responses/Unauthorized'
        '500':
          description: Failed to download training audio or persist the model.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                downloadFailed:
                  summary: Could not download training audio
                  value:
                    error: Failed to download training audio
                createFailed:
                  summary: Failed to persist the model
                  value:
                    error: Failed to create custom voice model
components:
  schemas:
    CreateVoiceModelRequest:
      type: object
      required:
        - name
        - trainingAudioUrls
      properties:
        name:
          type: string
          minLength: 1
          description: Display name for the new custom voice model.
        trainingAudioUrls:
          type: array
          minItems: 1
          items:
            type: string
            format: uri
          description: >-
            Publicly accessible URLs to the training audio files. The server
            downloads each URL server-side, so the URLs must be reachable from
            the public internet for the duration of the request. Combined audio
            length must not exceed your plan's per-model maximum (default 30
            minutes).
    CreateVoiceModelResponse:
      type: object
      required:
        - id
        - type
      properties:
        id:
          type: string
          format: uuid
          description: UUID of the newly created custom voice model.
        type:
          type: string
          enum:
            - custom
          description: Always `custom` — the create endpoint only produces custom models.
    ErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: Human-readable explanation of what went wrong.
  responses:
    Unauthorized:
      description: Missing, malformed, or unrecognised bearer token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            missingHeader:
              summary: No Authorization header
              value:
                error: Missing or invalid Authorization header
            invalidToken:
              summary: Token not recognised
              value:
                error: Invalid authorization token
            userNotFound:
              summary: Token valid but user no longer exists
              value:
                error: User not found
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Static API key issued by Audimee, passed as `Authorization: Bearer
        {token}`.

````