Skip to content
Lumean API

Descriptions are in English

The section interface is translated into your language, but descriptions of operations, schemas and errors exist only in Russian and English — the English version is shown here.

private-fishaudio-voice-clones.{userId}

Progress of your Fish Audio voice clones: one event per status change of a clone created via POST /voices/fishaudio/clones (or in the web dashboard). Key permission: voices.read.

Channel parameters

Fill in your values — they appear in the channel name, in the code below and in the console. They are sent nowhere and never end up in the page URL.

is the numeric id of the key owner, returned by GET /user.

Channel name to subscribe to

private-fishaudio-voice-clones.{userId}

The name still contains placeholders in braces. You cannot subscribe with it: the server authorizes channels by exact name.

import Pusher from 'pusher-js';

const pusher = new Pusher('7c4dd881d8116ac76fe89aff71d8c2ff', {
  wsHost: 'ws.lumean.app',
  wsPort: 443, wssPort: 443,
  forceTLS: true,
  enabledTransports: ['ws', 'wss'],
  cluster: '',
  channelAuthorization: {
    endpoint: 'https://api.lumean.app/api/public/broadcasting/auth',
    headers: { 'X-API-KEY': 'YOUR_API_KEY' },
  },
});

const channel = pusher.subscribe('private-fishaudio-voice-clones.{userId}');
channel.bind('voice_clone.updated', (data) => {
  console.log(data);
});

Payload example

not connected

Channel: private-fishaudio-voice-clones.{userId}

This is an example from the spec. There is no connection and none is simulated: subscribing for real needs your API key.

needs a key with the voices.read scope

.voice_clone.updated

{
  "voice_clone": {
    "id": "<uuid>",
    "provider": "fishaudio",
    "display_name": "string",
    "language": "ru",
    "description": "string",
    "status": "pending",
    "voice_id": "string",
    "attempts": 1,
    "error": {
      "reason": "string",
      "message": "string"
    },
    "created_at": "<date-time>",
    "completed_at": "<date-time>",
    "failed_at": "<date-time>",
    "banned_at": "<date-time>",
    "ban_reason": "string"
  }
}

Channel events: 1

Every event has its own anchor, a full payload table with descriptions and enums, and a sample shape. Names are shown in Laravel Echo notation — with the leading dot.

.voice_clone.updated

Echo: .voice_clone.updated · pusher-js: voice_clone.updated

A Fish Audio voice clone was created or changed status (pending → cloning → ready or failed; archived after deletion; banned — blocked by a moderator). voice_id appears only once the clone is ready — put it into tts_settings.voice_id of a Fish Audio template.

Payload fields

voice_clonerequired
object
idrequired
string (uuid)
providerrequired
Valuesfishaudio
string
display_namerequired
string
languageoptional
string | null
Example ru
descriptionoptional
string | null
statusrequired

Clone status. banned — a moderator blocked the clone: it is not accepted for new orders and cannot be deleted; the reason is in ban_reason.

Valuespendingcloningreadyfailedarchivedbanned
string
voice_idrequired

The Fish Audio voice id (a 32-character hex string, not a UUID) — the value for tts_settings.voice_id of a template. Present only once the clone is ready, otherwise null.

string | null
attemptsrequired
integer
Example 1
errorrequired
object | null
reasonoptional

processing_error, max_retries, network, timeout, dispatch_failed, unbanned

string
messageoptional
string | null
created_atrequired
string (date-time)
completed_atoptional
string (date-time) | null
failed_atoptional
string (date-time) | null
banned_atoptional
string (date-time) | null
ban_reasonoptional

Why a moderator blocked the clone, or null.

string | null

Payload example

{
  "voice_clone": {
    "id": "<uuid>",
    "provider": "fishaudio",
    "display_name": "string",
    "language": "ru",
    "description": "string",
    "status": "pending",
    "voice_id": "string",
    "attempts": 1,
    "error": {
      "reason": "string",
      "message": "string"
    },
    "created_at": "<date-time>",
    "completed_at": "<date-time>",
    "failed_at": "<date-time>",
    "banned_at": "<date-time>",
    "ban_reason": "string"
  }
}

Values come from the spec where the spec has them; the rest are type-based placeholders. This is the shape of the event, not a recording of a real one.

All channels and connection parameters·POST /broadcasting/auth

Feed this page to an AI

Open .mdllm.md

spec 0.0.1