MAISON TSMSUCH MILLION. VERY TECHNICALLY.

4 min read

Suno Client: driving Suno from Node.js

Suno Client 0.1.0 is on npm: an unofficial TypeScript client to generate music with Suno, built to notice when Suno changes its API.

The Shiba in a suit, one paw on a turntable spinning a vinyl record, the other raised, surrounded by golden swirls, next to a laptop and a black record sleeve.

Suno Client 0.1.0 went out on npm at noon today. It’s a TypeScript client for Node that drives Suno: start a generation, follow songs in progress, retrieve the audio, the lyrics and the musical data. I wrote it for the music on my streams, and it’s open source, on GitHub.

First things first: this is not an official API

Suno has no public API. Suno Client talks to the web app’s endpoints with your browser session, which is outside Suno’s terms of service. A ban would land on a paid account, the very one that presumably holds the commercial rights to your songs. The repository says so at the top of the page, and I’ll say it again here: decide whether that risk works for you before building on it.

The real problem: knowing when Suno moves

Every unofficial client breaks eventually, because Suno changes its API and nobody notices before production does. In early August 2026, Suno stopped accepting a missing title, and the most complete open-source client stayed broken for two weeks. Its 134 tests saw nothing: they checked its own output format and never touched the network.

So Suno Client is built around a single question: how do you find out Suno changed before your users do it for you?

The Shiba in a suit examines a spike on the paper strip of a brass seismograph through a magnifying glass, on a black lacquer desk.
The goal: see the tremor before anyone falls.

Three safeguards

A free schema probe. Suno checks a request’s format before anything else. So a request in the right format but naming a model that doesn’t exist gets rejected without generating anything and without costing a credit, and the reason for the rejection tells you whether your format is still accepted. If Suno complains about the token, all is well; if it complains about a field, the format has moved, and the probe names the field. It keeps working when the account is behind a captcha.

Free in credits, the probe isn’t free in reputation: each attempt is a rejected create, and a burst looks like abuse. During development, it actually tripped the test account’s captcha. So it runs once a day, with a single variant.

A fingerprint of every response. The Zod schemas let unknown fields through, so an addition on Suno’s side never breaks parsing. Alongside, every response is compared with a reference fingerprint: a new field is just information, while a field the client reads that disappears or changes type is an error.

Errors that say what to do. Every error carries two flags: retryable, the same request may succeed later, and alert, a human is needed. A long-running program keeps going through the first kind and stops loudly on the second. Treating a format change as a passing glitch means burning credits on requests that will never succeed.

Three ways Suno Client notices that Suno’s API has changed First, a daily schema probe that costs no credits: a request in the right format but naming a model that does not exist. If Suno rejects it over the token, the format still holds; if it rejects it over a missing or mistyped field, the format has changed and the probe names the field. Second, every response is compared with a reference fingerprint: a new field is information, a field the client reads that disappears or changes type is an error, anything else a warning. Third, every error says what to do: retryable, try again later; alert, a human has to step in. 1 · SCHEMA PROBE, 0 CREDITS Request in the right format but naming a model that doesn’t exist Rejected on the token the format holds Rejected on a field drift: the probe names it 2 · RESPONSE FINGERPRINT Suno’s response compared with the baseline info new field warn other change error a field we read is gone 3 · ERRORS THAT SAY WHAT TO DO SunoError two booleans retryable try again later alert a human must act
Three ways to learn that Suno changed, from the most useful to the least.

Built for a live stream

A Suno generation takes about two minutes, and that’s exactly the interesting part when you narrate it live. So starting a generation returns a job you follow song by song:

const job = await suno.generate({ title, tags, lyrics });

for await (const update of job.watch()) {
  for (const clip of update.changed) {
    await chat.say(`${clip.title}: ${clip.status}`);
  }
}

The job can be resumed after a restart, from the song ids. And a single call, suno.track(), returns everything an overlay needs: title, style, lyrics, cover art, word-by-word lyric timings, bar lines, tempo and key. The bar lines come from Suno’s own beat grid, not from a fixed tempo, so visuals stay locked even when the song slows down. That data comes from endpoints that, as far as I know, no other unofficial client exposed yet.

Three things to keep in mind when requests come from strangers: text Suno rejects arrives as invalid_input, so answer in chat and don’t retry; an account behind a captcha can’t generate anymore, and only a human on suno.com can clear it; each call costs 10 credits and returns two songs.

Install

npm install suno-client, on Node 22 or newer. The package ships as ESM and CommonJS, with its types, and version 0.1.0 passes 262 tests. For the licence I picked the WTFPL: putting terms on a reverse-engineered client would have been a joke of a different kind.

The details of what works, what doesn’t and what it cost to find out are in docs/STATUS.md. Much music. Such types.

Frequently asked questions

Does Suno have an official API?

No. Suno Client talks to the web app’s private API with your browser session, which is outside Suno’s terms of service. Worth knowing before using it on a paid account.

How do I install Suno Client?

With npm install suno-client, on Node 22 or newer. The package works with ESM and CommonJS alike, with its TypeScript types.

How much does a Suno generation cost?

10 credits per call, for two songs. Suno Client’s daily schema probe costs no credits, and generating lyrics on their own is free.

How does Suno Client detect an API change?

Three ways: a daily probe that checks the request format without generating anything, a fingerprint of every response compared with a baseline, and errors that say whether to retry or alert someone.

Can I use Suno Client in a bot or a stream overlay?

Yes. A generation can be followed song by song and resumed after a restart, and suno.track() returns the title, word-timed lyrics, bar lines, tempo and key in one call.

Sources

  1. Suno Client on GitHubGitHub
  2. Suno Client on npmnpm
  3. What works, what doesn’t (docs/STATUS.md)GitHub
  4. ZodZod
  5. Suno terms of serviceSuno
Dogecoin donation QR code for DKZFD5h85VJFXkjj2EaZiEJZtzZhYBsqEQ
SCAN WITH YOUR WALLET

The rebound fund.

Support the projects.

He will never ask you for anything. So we put this QR code here ourselves. If you use twichat or enjoy the streams, you can help fund the projects’ development. Pick your currency and any amount you like.

DOGECOIN · ANY AMOUNT

TSM crestMAISON TSM

D.O.G.E.

Do Only Good
Everyday.

From Dogecoin I kept a million reasons not to take myself seriously. Yes, even with my portrait in a gold frame. The rest is told live.