Skip to content
merran
GitHubInstall

Merran documentation API & integrations

Hear a voice

POST
/api/settings/server/voice/preview
curl --request POST \
--url http://localhost:3000/api/settings/server/voice/preview \
--header 'Content-Type: application/json' \
--cookie merran.session_token=<merran.session_token> \
--data '{ "provider": "kokoro", "voice": "bf_emma" }'

Server admins only. A sample cook step read in any Kokoro or OpenAI voice, before it’s picked: made once and kept. OpenAI’s is on an OpenAI key of the admin’s household, a fraction of a cent the first time.

Media typeapplication/json
object
provider
required
string
Allowed values: kokoro openai
voice
required
string
/^[a-z0-9_-]{1,40}$/i/
kokoroUrl

Kokoro’s address, to try one before saving it.

string format: uri
<= 500 characters

Example

{
"provider": "kokoro",
"voice": "bf_emma"
}

The reading, as MP3.

Media typeaudio/mpeg
string format: binary

Not signed in.

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
fields
object
key
additional properties
string

Example

{
"error": {
"code": "not_found",
"message": "There's nothing here.",
"fields": {
"name": "Give it a name."
}
}
}

Not allowed.

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
fields
object
key
additional properties
string

Example

{
"error": {
"code": "not_found",
"message": "There's nothing here.",
"fields": {
"name": "Give it a name."
}
}
}

Kokoro didn’t answer, or there’s no OpenAI key.

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
fields
object
key
additional properties
string

Example

{
"error": {
"code": "not_found",
"message": "There's nothing here.",
"fields": {
"name": "Give it a name."
}
}
}

© 2026 Kyle Johnson. Documentation: CC BY 4.0. Merran: AGPL-3.0-or-later.