Listnr Voices API

List the voices available on Listnr, optionally filtered by language, gender, and style. Each voice returns its identifier, language, gender, and supported voice styles for use with the Text-to-Speech API.

OpenAPI Specification

listnr-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Listnr Text-to-Speech API
  description: >-
    The Listnr Text-to-Speech API converts SSML text or an article URL into
    MP3/WAV speech using Listnr's catalog of 1,000+ AI voices across 142+
    languages. Conversion can be synchronous (returns an audio URL directly) or
    asynchronous (returns a jobId that is polled for status). The API also lists
    available voices and reports async job status. All requests are authenticated
    with a personal API key generated in the Listnr dashboard
    (voices.listnr.tech) and passed in an x-listnr-token header. Never expose the
    API key in front-end code or the browser. Endpoints and parameters in this
    document are transcribed from Listnr's public API documentation at
    github.com/team-listnr/text-to-speech-api; request/response schemas are
    modeled from that documentation and should be verified against the live API.
  version: '1.0'
  contact:
    name: Listnr AI
    url: https://listnr.ai
servers:
  - url: https://bff.listnr.tech/api/tts/v1
    description: Listnr Text-to-Speech API
security:
  - listnrToken: []
tags:
  - name: Text-to-Speech
    description: Convert SSML text or an article URL into audio.
  - name: Voices
    description: List the AI voices available on Listnr.
  - name: Jobs
    description: Poll the status of asynchronous conversion jobs.
paths:
  /convert-text:
    post:
      operationId: convertText
      tags:
        - Text-to-Speech
      summary: Convert SSML text to speech (synchronous)
      description: >-
        Synchronously converts SSML text into audio and returns the resulting
        audio URL.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConvertTextRequest'
      responses:
        '200':
          description: Audio generated successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SyncConversionResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /convert-text-async:
    post:
      operationId: convertTextAsync
      tags:
        - Text-to-Speech
      summary: Convert SSML text to speech (asynchronous)
      description: >-
        Queues an asynchronous conversion of SSML text and returns a jobId to
        poll via the job-status endpoint.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConvertTextRequest'
      responses:
        '200':
          description: Job accepted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AsyncConversionResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /convert-url:
    post:
      operationId: convertUrl
      tags:
        - Text-to-Speech
      summary: Convert an article URL to speech (synchronous)
      description: >-
        Synchronously converts the readable content of an article URL into audio
        and returns the resulting audio URL.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConvertUrlRequest'
      responses:
        '200':
          description: Audio generated successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SyncConversionResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /convert-url-async:
    post:
      operationId: convertUrlAsync
      tags:
        - Text-to-Speech
      summary: Convert an article URL to speech (asynchronous)
      description: >-
        Queues an asynchronous conversion of an article URL and returns a jobId
        to poll via the job-status endpoint.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConvertUrlRequest'
      responses:
        '200':
          description: Job accepted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AsyncConversionResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /available-voices:
    get:
      operationId: listAvailableVoices
      tags:
        - Voices
      summary: List available voices
      description: >-
        Returns the voices available on Listnr, optionally filtered by language,
        gender, and style.
      parameters:
        - name: lang
          in: query
          required: false
          description: Filter voices by language.
          schema:
            type: string
        - name: gender
          in: query
          required: false
          description: Filter voices by gender.
          schema:
            type: string
        - name: style
          in: query
          required: false
          description: Filter voices by style or tone.
          schema:
            type: string
      responses:
        '200':
          description: A list of available voices.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VoicesResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /job-status:
    get:
      operationId: getJobStatus
      tags:
        - Jobs
      summary: Get async job status
      description: >-
        Returns the status of an asynchronous conversion job by jobId, plus the
        audio URL and audio key when the job has completed.
      parameters:
        - name: jobId
          in: query
          required: true
          description: The identifier of the job to check.
          schema:
            type: string
      responses:
        '200':
          description: Job status.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobStatusResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  securitySchemes:
    listnrToken:
      type: apiKey
      in: header
      name: x-listnr-token
      description: >-
        Personal API key generated in the Listnr dashboard at voices.listnr.tech.
        Keep it server-side; never expose it in the browser or front-end code.
  responses:
    Unauthorized:
      description: Missing or invalid API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    ConvertTextRequest:
      type: object
      required:
        - voice
        - ssml
      properties:
        voice:
          type: string
          description: The voice identifier to synthesize with.
        ssml:
          type: string
          description: The text to convert, in SSML format with paragraph tags.
        voiceStyle:
          type: string
          description: Optional tone or accent of the voice.
        globalSpeed:
          type: string
          description: Playback speed as a percentage string, e.g. "100%" (20-200).
        audioFormat:
          type: string
          enum:
            - mp3
            - wav
          description: Output audio format.
        audioSampleRate:
          type: integer
          enum:
            - 24000
            - 48000
          description: Output audio sample rate in Hz.
        audioKey:
          type: string
          description: Optional key referencing an existing audio file to update.
    ConvertUrlRequest:
      type: object
      required:
        - voice
        - url
      properties:
        voice:
          type: string
          description: The voice identifier to synthesize with.
        url:
          type: string
          format: uri
          description: The article URL whose readable content will be converted.
        voiceStyle:
          type: string
          description: Optional tone or accent of the voice.
        globalSpeed:
          type: string
          description: Playback speed as a percentage string, e.g. "100%" (20-200).
        audioFormat:
          type: string
          enum:
            - mp3
            - wav
          description: Output audio format.
        audioSampleRate:
          type: integer
          enum:
            - 24000
            - 48000
          description: Output audio sample rate in Hz.
        audioKey:
          type: string
          description: Optional key referencing an existing audio file to update.
    SyncConversionResponse:
      type: object
      properties:
        success:
          type: boolean
        audioUrl:
          type: string
          format: uri
          description: URL of the generated audio file.
        audioKey:
          type: string
          description: Key identifying the generated audio file.
    AsyncConversionResponse:
      type: object
      properties:
        jobId:
          type: string
          description: Identifier of the queued conversion job.
        audioKey:
          type: string
          description: Key that will identify the generated audio file.
    VoicesResponse:
      type: object
      properties:
        voices:
          type: array
          items:
            $ref: '#/components/schemas/Voice'
    Voice:
      type: object
      properties:
        voice:
          type: string
          description: The voice identifier.
        language:
          type: string
          description: The language of the voice.
        gender:
          type: string
          description: The gender of the voice.
        supportedStyles:
          type: array
          description: Voice styles supported by this voice.
          items:
            type: string
    JobStatusResponse:
      type: object
      properties:
        jobId:
          type: string
        status:
          type: string
          enum:
            - PENDING
            - IN_PROGRESS
            - COMPLETED
            - FAILED
        audioUrl:
          type: string
          format: uri
        audioKey:
          type: string
    Error:
      type: object
      properties:
        success:
          type: boolean
        message:
          type: string