jackwener/OpenCLI · error · ArgumentError
All requested formats require --confirm-paid true
Error message
All requested formats require --confirm-paid true
What it means
An ArgumentError thrown when every requested download format is a paid format (currently `wav`) and downloads are enabled but `--confirm-paid` was not set to true. WAV downloads trigger Suno's per-download billing, so the CLI strips paid formats and then refuses to run a download run with an empty free-format list rather than silently downloading nothing.
Source
Thrown at clis/suno/generate.js:110
}
if (!isCustom && (tags || negativeTags)) {
throw new ArgumentError('--tags and --negative-tags only apply in Custom mode (alongside --lyrics).');
}
const requestedFormats = parseFormats(kwargs.formats);
const confirmPaid = normalizeBooleanFlag(kwargs['confirm-paid']);
const skipDownload = normalizeBooleanFlag(kwargs.sd);
const PAID_FORMATS = new Set(['wav']);
const skippedPaid = [];
const formats = requestedFormats.filter(f => {
if (PAID_FORMATS.has(f) && !confirmPaid) {
skippedPaid.push(f);
return false;
}
return true;
});
if (!skipDownload && !formats.length) {
throw new ArgumentError('All requested formats require --confirm-paid true', 'Add --confirm-paid true or include a free format such as mp3 or metadata.');
}
const outputDir = resolveSunoOutputDir(kwargs.op);
const timeout = requirePositiveInt(kwargs.timeout, '--timeout');
const makeInstrumental = normalizeBooleanFlag(kwargs.instrumental);
const weirdness = clampSlider(kwargs.weirdness, '--weirdness', 0.5);
const styleWeight = clampSlider(kwargs['style-weight'], '--style-weight', 0.5);
// Title: required by API. Auto-derive from first 60 chars of source prompt if not provided.
const titleSource = titleArg || (isCustom ? (tags || lyrics.split('\n')[0]) : description);
const title = titleSource.replace(/\s+/g, ' ').trim().slice(0, 60) || 'Untitled';
const session = await ensureSunoSession(page);
if (!session.planId) {
throw new CommandExecutionError(
`Suno generation needs a resolved plan id for the user_tier field, but billing/info did not surface one for this account (subscription_type=${session.planKey}). Verify the account is active at ${SUNO_URL}/account, then retry.`,
);
}
const deviceId = session.deviceId;View on GitHub (pinned to 49907e53dc)
Solutions
- Add `--confirm-paid true` if you accept the per-download WAV billing charge.
- Include a free format in --formats, e.g. `--formats mp3,metadata` or `--formats mp3,wav` (wav still requires confirm-paid).
- Pass `--sd true` if you only want clip ids/URLs and no downloads at all.
- Check for typos in format names — an unrecognized paid-looking list may filter down to zero free formats.
Example fix
// before opencli suno generate "epic rock" --formats wav // after opencli suno generate "epic rock" --formats mp3,wav --confirm-paid true
Defensive patterns
Strategy: validation
Validate before calling
// gate paid formats behind explicit consent before invoking
const PAID = new Set(['wav']);
const requested = (process.env.FORMATS ?? 'mp3,metadata').split(',').map(s => s.trim());
const needsPaid = requested.some(f => PAID.has(f));
const confirmPaid = process.env.CONFIRM_PAID === 'true';
if (needsPaid && !confirmPaid) {
throw new Error('wav requires --confirm-paid true (per-download billing)');
} Try / catch
try {
await run('opencli suno generate "..." --formats wav');
} catch (err) {
if (String(err.message).includes('confirm-paid')) {
// either add --confirm-paid true or include a free format like mp3/metadata
} else throw err;
} Prevention
- Always include a free format (mp3, metadata) in --formats as a fallback.
- Set --confirm-paid true deliberately and only when WAV billing is acceptable.
- Use --sd true when you don't want downloads at all.
- Double-check format names for typos before running.
When it happens
Trigger: Running `opencli suno generate "..." --formats wav` (or a formats list where all entries are paid) without `--confirm-paid true` and without `--sd true`. After the paid-format filter, `formats.length` is 0, so the guard fires.
Common situations: Users who want studio-quality WAV but don't realize it costs credits per download; CI scripts requesting only wav; misspelling free formats (e.g. `mp4` instead of `mp3`) leaving only paid entries after filtering.
Related errors
- Unsupported --model "${model}"
- Either provide a Simple-mode prompt as the positional argume
- --tags and --negative-tags only apply in Custom mode (alongs
- Unsupported --formats value(s): ${unknown.join(', ')}
- ${label} must be a number between 0 and 1
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/ca8c06cd5a7d360a.
Report an issue: GitHub.