openapi: 3.0.3 info: title: WellSaid Labs Clips API description: The WellSaid Labs API renders text into studio-quality AI voiceover. It exposes streaming text-to-speech (audio returned as an HTTP stream for low time-to-first-byte playback), word-level timing and subtitle rendering, asynchronous clip creation and combination, a catalog of voice avatars, and pronunciation control via replacement libraries and respelling suggestions. All requests authenticate with an X-Api-Key header. WellSaid does not currently support end-user authentication and recommends making requests from an internal or trusted source. API access is gated behind a trial API key and a business plan. Endpoints, request fields, and response shapes here are modeled from the public documentation at docs.wellsaidlabs.com and are honestly approximated where the reference does not publish a full schema. version: '1.0' contact: name: WellSaid Labs url: https://wellsaidlabs.com servers: - url: https://api.wellsaidlabs.com/v1 description: WellSaid Labs API security: - apiKeyAuth: [] tags: - name: Clips description: Asynchronous clip creation, retrieval, and combination. paths: /clips: get: operationId: listClips tags: - Clips summary: List recent clips description: Returns a list of recently created text-to-speech clips. responses: '200': description: A list of clips. content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Clip' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createClip tags: - Clips summary: Create a clip asynchronously description: Creates a new text-to-speech clip asynchronously. The clip is rendered in the background; poll the clip by id to retrieve its status and audio. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TtsRequest' responses: '202': description: The clip was accepted for asynchronous rendering. content: application/json: schema: $ref: '#/components/schemas/Clip' '401': $ref: '#/components/responses/Unauthorized' '429': $ref: '#/components/responses/RateLimited' /clips/{clip_id}: get: operationId: getClip tags: - Clips summary: Get a single clip description: Returns information about a single clip, including its render status and audio URL. parameters: - $ref: '#/components/parameters/ClipId' responses: '200': description: The requested clip. content: application/json: schema: $ref: '#/components/schemas/Clip' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /clips/combine: post: operationId: combineClips tags: - Clips summary: Combine clips into one file description: Combines a list of clips into a single audio file, inserting pauses between them. Useful for assembling longer-form voiceover from many rendered segments. requestBody: required: true content: application/json: schema: type: object properties: clip_ids: type: array items: type: string description: The ids of the clips to combine, in order. pause: type: number format: float description: Pause in seconds to insert between clips. required: - clip_ids responses: '200': description: The combined audio file (or a clip referencing it). content: application/json: schema: $ref: '#/components/schemas/Clip' '401': $ref: '#/components/responses/Unauthorized' components: schemas: Clip: type: object properties: id: type: string description: The clip id. status: type: string description: Render status of the clip, for example "processing" or "complete". text: type: string speaker_id: type: string audio_url: type: string description: URL to the rendered audio once the clip is complete. created_at: type: string format: date-time Error: type: object properties: message: type: string code: type: string TtsRequest: type: object properties: text: type: string description: The text to convert to speech. Default keys allow up to 1,000 characters per request. speaker_id: type: string description: The voice avatar (speaker) id to render with, for example "3". model: type: string description: The voice model to use, for example "caruso" or "legacy". required: - text - speaker_id responses: NotFound: description: The requested resource was not found. content: application/json: schema: $ref: '#/components/schemas/Error' RateLimited: description: Rate limit or monthly character quota exceeded. Inspect the x-rate-limit-* and x-quota-* response headers. content: application/json: schema: $ref: '#/components/schemas/Error' Unauthorized: description: Missing or invalid X-Api-Key. content: application/json: schema: $ref: '#/components/schemas/Error' parameters: ClipId: name: clip_id in: path required: true schema: type: string description: The id of the clip. securitySchemes: apiKeyAuth: type: apiKey in: header name: X-Api-Key description: API key issued by WellSaid Labs, passed in the X-Api-Key header. Request a trial key from the console; production use requires a business plan.