Skip to main content
POST
Bland BTTS

1. Overview

This document describes how to use speech synthesis and voice cloning through the Bland BTTS native protocol. Both endpoints are synchronous: a POST request returns the result directly, with no need to create a task and poll for the result.

1.1 Endpoints

The full address in the examples in this document is https://api.novita.ai plus the endpoint path in the table above, where https://api.novita.ai is the API domain you use.

1.2 Authentication

All requests must carry the platform API Key:
Speech synthesis requests must also specify the JSON content type (Content-Type: application/json); voice cloning requests use multipart/form-data and do not need to specify the content type separately (the HTTP client generates it automatically, including the boundary).

1.3 Response Structure

  • On success, speech synthesis returns audio binary data directly, not JSON. See “2. Speech Synthesis” for details.
  • On success, voice cloning returns JSON, where data.voice_id is the UUID of the newly cloned voice and can be used directly as the voice field of the speech synthesis endpoint.
  • When the two endpoints fail, they return different JSON error structures. See the “Common Errors” section of each endpoint.

2. Speech Synthesis

Official parameter reference: Speak

2.1 Endpoint

Common request fields:

2.2 Example

2.3 Response

On success, the endpoint returns audio binary data directly (HTTP 200), not JSON. The Content-Type varies with the request’s audio.container/audio.encoding (for example, audio/wav, audio/pcm). In practice, the transparent proxy returns the upstream X-Sample-Rate response header unchanged (the sample rate of the synthesized audio); other response headers documented by Bland, such as x-request-id/x-model/x-voice-id/x-cost/x-latency, were not observed in testing. Do not rely on these headers.

2.4 Billing

The character count is calculated from the text field. Chinese characters (Han characters) count as 2 characters, and other characters (including English letters, digits, spaces, and punctuation) count as 1 character. The exact unit price depends on the pricing page of the service you use.

3. Voice Cloning

Official parameter reference: Clone Voice

3.1 Endpoint

The request body is multipart/form-data. Common fields:
isBTTS_V3/isBTTS_V2 are boolean-semantic fields, but because the request body is multipart/form-data rather than JSON, they must be sent as the string "true".

3.2 Example

3.3 Response

On success, the endpoint returns (HTTP 200):
Verified in practice: passing the voice_id produced by the cloning endpoint directly to the voice field of the speech synthesis endpoint returns real synthesized audio with HTTP 200, so the two endpoints can be used in sequence directly.

3.4 Billing

The voice cloning endpoint is always free of charge and generates no cost.

3.5 Common Errors

When the account has reached its voice limit, you need to top up the Bland account wallet to increase the quota. This is unrelated to the faas-backend configuration.

4. Common Errors and Notes

Error structure of the speech synthesis endpoint:
The error structure of the voice cloning endpoint is described in “3.5 Common Errors” and is not the same structure as the speech synthesis endpoint. Do not mix them up. Other notes:
  • The speech synthesis endpoint request body requires the JSON content type; the voice cloning endpoint request body is multipart/form-data and must not be called with JSON.
  • A voice_id created by voice cloning is shared among all callers under the current API Key, and the system does not record “which caller cloned which voice”. Manage voice ownership and visibility in your own business layer, and do not assume the platform isolates voices between callers.
  • The optional fields of the voice cloning endpoint (gender/description/isBTTS_V3/isBTTS_V2) have not been fully validated with real requests. It is recommended to test them yourself before launch to confirm that the behavior meets expectations.
  • When the response is audio binary data, process it directly according to the returned Content-Type and do not attempt to parse it as JSON.
Last modified on October 21, 2026