
JavaScript SDK for the ListenHub API.
npm i @marswave/listenhub-sdk
Clone the repo and run the OAuth login example — it opens a browser, handles the callback, and prints your tokens:
git clone https://github.com/marswaveai/listenhub-sdk.git
cd listenhub-sdk
pnpm i
npx tsx examples/oauth-login.ts
const client = new ListenHubClient({
accessToken: 'token', // static string or () => string | undefined
baseURL: 'https://api.listenhub.ai/api',
timeout: 30_000, // request timeout in ms
maxRetries: 2, // max retries on 429 (default: 2)
});
| Document |
Description |
| Architecture |
Module dependency diagram and responsibilities |
| Client Behavior |
Request/response flow, hooks, retry and refresh logic |
| Testing |
Test layers, running tests, mock server setup |
| Method |
Description |
connectInit({callbackPort}) |
Start OAuth flow, returns authUrl and sessionId |
connectToken({sessionId, code}) |
Exchange authorization code for tokens |
refresh({refreshToken}) |
Refresh an expired access token |
revoke({refreshToken}) |
Revoke a refresh token |
| Method |
Description |
checkinSubmit() |
Submit daily check-in |
checkinStatus() |
Get check-in streak and status |
| Method |
Description |
getApiKey() |
Get current API key |
regenerateApiKey() |
Regenerate API key (triggers onApiKeyChanged) |
getSettings() |
Get episode template settings per product type |
| Method |
Description |
createPodcast(params) |
Create a podcast (solo/duo) |
createTTS(params) |
Create a text-to-speech audio |
createExplainerVideo(params) |
Create an explainer video |
createSlides(params) |
Create a slides presentation |
createAIImage(params) |
Generate an AI image from a prompt |
| Method |
Description |
createMusicGenerate(params) |
Generate music from a text prompt |
createMusicCover(params) |
Create a cover from a reference audio URL |
getMusicTask(taskId) |
Get music task status and details |
listMusicTasks(params?) |
List music tasks with optional filtering |
| Method |
Description |
listPodcasts(params?) |
List podcast episodes |
listTTS(params?) |
List TTS episodes |
listExplainerVideos(params?) |
List explainer videos |
listSlides(params?) |
List slides |
listAIImages(params?) |
List AI-generated items |
getCreation(episodeId) |
Get full creation detail |
deleteCreations({ids}) |
Batch delete creations |
| Method |
Description |
getCurrentUser() |
Get current user profile |
getSubscription() |
Get subscription and credit usage info |
| Method |
Description |
listSpeakers(params?) |
List available speakers by language |
client.api exposes the underlying ky instance for endpoints not yet covered by the SDK:
const user = await client.api.get('v1/users/me').json();
On 429 Too Many Requests, the SDK reads the Retry-After header and retries automatically, up to maxRetries times (default: 2).
MIT