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

# Find Similar Voices

> Find ElevenLabs Voice Library voices that sound like an uploaded recording, closest first.

``source_audio`` is a ``file_`` id from ``POST /v1/uploads`` (mp3, wav or aac, 1-300 seconds); it
is streamed to the provider and no copy is kept. Each result is the same voice object as ``GET
/v1/voices/{voice_id}``: speak it by its ``vox_`` id like any catalog voice. These voices never
appear in ``GET /v1/voices``. Free (``model_not_in_plan``, ``required_plan: starter``) is refused;
the search itself is not charged.



## OpenAPI

````yaml /openapi/moda-public-api.yaml post /voices/similar
openapi: 3.1.0
info:
  title: Moda Public API
  description: >
    Programmatic access to Moda's canvas design platform. Create designs, export
    assets, manage brand kits, and run AI design tasks.


    ## Versioning


    Pin response shapes with a calendar-dated `Moda-Version` header (e.g.
    `2026-05-01`). **The pin is global** — it applies to every endpoint in the
    request, not just the one you adopted it for, so raising it to use a new
    endpoint also moves your other responses to that version's shapes.


    ### Migrating `2026-04-12` → `2026-05-01`


    - **Tasks** move from the flat `JobResponse` (`job_id`, `canvas_url`,
    `can_export`) to the canonical `Task` envelope. The export artifact is now
    under `result.export` as `{url, format, page_count}`; update any code that
    read the export URL from the old top-level fields.

    - **Multi-page PNG/JPEG exports are delivered as a single `.zip`** of
    per-page files (`page-1.png`, …), so `result.export.format` is `zip`. For
    one bundled document instead, request `format=pdf` or `pptx`; for a single
    image, pass `page_number`.
  version: 1.0.0
  x-moda-api-version: '2026-05-01'
servers:
  - url: https://api.moda.app/v1
    description: Production
security: []
tags:
  - name: canvases
    description: List, search, read, export, and share canvases
  - name: tasks
    description: Start and monitor AI design tasks
  - name: organizations
    description: List organizations and teams
  - name: credits
    description: Check credit balance and usage
  - name: brand-kits
    description: Manage brand kits
  - name: remix
    description: Duplicate and edit canvases
  - name: share-links
    description: Resolve share URLs to canvas identifiers
  - name: uploads
    description: Upload files for use as attachments
  - name: voices
    description: >-
      Managed voices: capabilities, the voice catalog, favorites and
      pronunciation dictionaries
  - name: usage
    description: Aggregate API usage stats for the caller's team
  - name: feedback
    description: Submit product feedback from Voyager
  - name: voyager
    description: 'Voyager desktop sign-in: OAuth config, device registration and revocation'
  - name: embed
    description: Signed iframe embed sessions
  - name: web
    description: 'Metered web research: search and page reading'
  - name: websites
    description: >-
      Create, update, publish, screenshot, and manage hosted multi-page static
      sites
  - name: drive
    description: >-
      Organize the workspace: folders, the folder tree, and item
      move/rename/visibility/delete for folders, canvases, and files
paths:
  /voices/similar:
    post:
      tags:
        - voices
      summary: Find Similar Voices
      description: >-
        Find ElevenLabs Voice Library voices that sound like an uploaded
        recording, closest first.


        ``source_audio`` is a ``file_`` id from ``POST /v1/uploads`` (mp3, wav
        or aac, 1-300 seconds); it

        is streamed to the provider and no copy is kept. Each result is the same
        voice object as ``GET

        /v1/voices/{voice_id}``: speak it by its ``vox_`` id like any catalog
        voice. These voices never

        appear in ``GET /v1/voices``. Free (``model_not_in_plan``,
        ``required_plan: starter``) is refused;

        the search itself is not charged.
      operationId: voicesSimilar
      parameters:
        - name: X-Voice-Engines
          in: header
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              The voice engines this client understands, comma-separated:
              elevenlabs,fishaudio,inworld. ElevenLabs is always on; Fish Audio
              models and voices appear only for a client that lists fishaudio
              (or, on GET /v1/voices, asks for provider=fishaudio or a
              featured/community category), and Inworld's only for a client that
              lists inworld (or asks for provider=inworld).
            title: X-Voice-Engines
          description: >-
            The voice engines this client understands, comma-separated:
            elevenlabs,fishaudio,inworld. ElevenLabs is always on; Fish Audio
            models and voices appear only for a client that lists fishaudio (or,
            on GET /v1/voices, asks for provider=fishaudio or a
            featured/community category), and Inworld's only for a client that
            lists inworld (or asks for provider=inworld).
        - $ref: '#/components/parameters/ModaVersion'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SimilarVoicesRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SimilarVoicePage'
        '401':
          description: Authentication required.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '402':
          description: Insufficient credits for a metered operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Permission denied for this scope.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '404':
          description: Resource not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '409':
          description: Conflict (idempotency / resource state).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '422':
          description: Request validation failed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '429':
          description: Rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '500':
          description: Internal error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
      security:
        - API Key: []
components:
  parameters:
    ModaVersion:
      name: Moda-Version
      in: header
      required: false
      description: >-
        Calendar-dated API version pin. New integrations should pin `2026-05-01`
        to opt into the newest response shapes. For back-compat the server also
        accepts requests with no header and resolves them to the current default
        (today: `2026-04-12`); that default advances on each [sunset
        date](/api-reference/versioning). Any unsupported value returns 400
        `unsupported_version`.
      example: '2026-05-01'
      schema:
        type: string
        enum:
          - '2026-04-12'
          - '2026-05-01'
        default: '2026-05-01'
        example: '2026-05-01'
  schemas:
    SimilarVoicesRequest:
      properties:
        source_audio:
          type: string
          maxLength: 64
          minLength: 1
          title: Source Audio
          description: >-
            The file_ id of an uploaded recording (POST /v1/uploads): mp3, wav
            or aac, 1-300 s.
        limit:
          type: integer
          maximum: 10
          minimum: 1
          title: Limit
          description: How many voices to return, closest first.
          default: 5
      additionalProperties: false
      type: object
      required:
        - source_audio
      title: SimilarVoicesRequest
      description: '``POST /v1/voices/similar`` body (section 3.11).'
    SimilarVoicePage:
      properties:
        object:
          type: string
          const: list
          title: Object
          default: list
        data:
          items:
            $ref: '#/components/schemas/VoiceDetail'
          type: array
          title: Data
        returned:
          type: integer
          title: Returned
      additionalProperties: false
      type: object
      required:
        - data
        - returned
      title: SimilarVoicePage
      description: >-
        ``POST /v1/voices/similar``: the matched voices, closest first, in their
        detail form.
    ErrorEnvelope:
      properties:
        type:
          $ref: '#/components/schemas/ErrorType'
        code:
          type: string
          title: Code
          description: >-
            Stable machine string keyed to doc_url. Never changes once
            published.
        message:
          type: string
          title: Message
          description: >-
            Human-readable message, for developers. Not localized, not
            user-facing.
        doc_url:
          type: string
          title: Doc Url
          description: Permalink to the docs page for this code.
        request_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Request Id
          description: Correlator for logs/Sentry/audit.
        causes:
          anyOf:
            - items:
                $ref: '#/components/schemas/ErrorEnvelope'
              type: array
            - type: 'null'
          title: Causes
          description: Aggregated upstream failures (e.g. per-page export errors).
        details:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Details
          description: >-
            Code-specific detail payload (e.g. validation field list). Callers
            should pass ``None`` rather than ``{}`` to omit the key from the
            response.
        retry_after_ms:
          anyOf:
            - type: integer
            - type: 'null'
          title: Retry After Ms
          description: Hint for rate-limited or transient errors.
        retryable:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Retryable
          description: >-
            Explicit retryability for this code, from the error-code registry:
            ``false`` means retrying the same request cannot succeed (fix the
            input / resource first); ``true`` means the condition is transient
            and a retry (with backoff / after the blocker clears) can succeed.
            For a code whose retryability is context-dependent (the registry
            declares none), the raising site sets it per response when it knows
            the cause (e.g. ``source_url_unreachable``: a timeout is retryable,
            a 404 is not) and omits it otherwise — do not derive it from
            ``type`` or the HTTP status when this field is present.
      type: object
      required:
        - type
        - code
        - message
        - doc_url
      title: ErrorEnvelope
      description: >-
        Canonical error payload, nested under the top-level ``{"error": ...}``
        key.
    VoiceDetail:
      properties:
        object:
          type: string
          const: voice
          title: Object
          default: voice
        id:
          type: string
          title: Id
        name:
          type: string
          title: Name
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
        provider:
          type: string
          enum:
            - elevenlabs
            - fishaudio
            - inworld
          title: Provider
        category:
          type: string
          title: Category
        source:
          type: string
          title: Source
        creator_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Creator Name
        labels:
          $ref: '#/components/schemas/VoiceLabels'
        languages:
          items:
            $ref: '#/components/schemas/VoiceLanguage'
          type: array
          title: Languages
        compatible_models:
          items:
            type: string
          type: array
          title: Compatible Models
        recommended_models:
          items:
            type: string
          type: array
          title: Recommended Models
        preview:
          anyOf:
            - $ref: '#/components/schemas/VoicePreview'
            - type: 'null'
        availability:
          $ref: '#/components/schemas/VoiceAvailability'
        catalog_refreshed_at:
          type: string
          title: Catalog Refreshed At
        settings_defaults:
          $ref: '#/components/schemas/VoiceSettingsDefaults'
        favorite:
          $ref: '#/components/schemas/VoiceFavoriteFlags'
      additionalProperties: false
      type: object
      required:
        - id
        - name
        - description
        - provider
        - category
        - source
        - creator_name
        - labels
        - languages
        - compatible_models
        - recommended_models
        - preview
        - availability
        - catalog_refreshed_at
        - settings_defaults
        - favorite
      title: VoiceDetail
      description: >-
        ``GET /v1/voices/{voice_id}``: the list form plus defaults and favorite
        flags.
    ErrorType:
      type: string
      enum:
        - invalid_request
        - authentication
        - permission
        - not_found
        - conflict
        - rate_limited
        - idempotency_conflict
        - unprocessable
        - upstream_error
        - internal_error
      title: ErrorType
      description: Closed set of high-level categories SDKs branch on.
    VoiceLabels:
      properties:
        accent:
          anyOf:
            - type: string
            - type: 'null'
          title: Accent
        age:
          anyOf:
            - type: string
            - type: 'null'
          title: Age
        gender:
          anyOf:
            - type: string
            - type: 'null'
          title: Gender
        use_case:
          anyOf:
            - type: string
            - type: 'null'
          title: Use Case
        descriptive:
          anyOf:
            - type: string
            - type: 'null'
          title: Descriptive
      additionalProperties: false
      type: object
      required:
        - accent
        - age
        - gender
        - use_case
        - descriptive
      title: VoiceLabels
    VoiceLanguage:
      properties:
        language:
          type: string
          title: Language
        accent:
          anyOf:
            - type: string
            - type: 'null'
          title: Accent
        locale:
          anyOf:
            - type: string
            - type: 'null'
          title: Locale
      additionalProperties: false
      type: object
      required:
        - language
        - accent
        - locale
      title: VoiceLanguage
    VoicePreview:
      properties:
        url:
          type: string
          title: Url
        mime_type:
          type: string
          title: Mime Type
          default: audio/mpeg
        expires_at:
          anyOf:
            - type: string
            - type: 'null'
          title: Expires At
      additionalProperties: false
      type: object
      required:
        - url
      title: VoicePreview
    VoiceAvailability:
      properties:
        status:
          type: string
          title: Status
        reason:
          anyOf:
            - type: string
            - type: 'null'
          title: Reason
        revoked_at:
          anyOf:
            - type: string
            - type: 'null'
          title: Revoked At
      additionalProperties: false
      type: object
      required:
        - status
        - reason
        - revoked_at
      title: VoiceAvailability
    VoiceSettingsDefaults:
      properties:
        stability:
          anyOf:
            - type: number
            - type: 'null'
          title: Stability
        similarity_boost:
          anyOf:
            - type: number
            - type: 'null'
          title: Similarity Boost
        style:
          anyOf:
            - type: number
            - type: 'null'
          title: Style
        use_speaker_boost:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Use Speaker Boost
        speed:
          anyOf:
            - type: number
            - type: 'null'
          title: Speed
      additionalProperties: false
      type: object
      required:
        - stability
        - similarity_boost
        - style
        - use_speaker_boost
        - speed
      title: VoiceSettingsDefaults
    VoiceFavoriteFlags:
      properties:
        user:
          type: boolean
          title: User
        workspace:
          type: boolean
          title: Workspace
        workspace_default:
          type: boolean
          title: Workspace Default
      additionalProperties: false
      type: object
      required:
        - user
        - workspace
        - workspace_default
      title: VoiceFavoriteFlags
  securitySchemes:
    API Key:
      type: http
      description: API key from Settings > Developer > REST API
      scheme: bearer

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.