jackwener/OpenCLI · error · ArgumentError
All requested formats require --confirm-paid true
Error message
All requested formats require --confirm-paid true
What it means
The download command filters requested formats against a paid set (wav). If every requested format is paid and --confirm-paid is not true, no work would be done silently, so the command throws ArgumentError telling you to add --confirm-paid true or include a free format. This guards against Suno's per-download billing for WAV.
Source
Thrown at clis/suno/download.js:78
{ name: 'op', help: 'Output directory (default: ~/Music/suno)' },
{ name: 'confirm-paid', type: 'boolean', default: false, help: 'Required to allow paid downloads (wav). Without it, paid formats are skipped with a warning.' },
],
columns: ['status', 'clip', 'title', 'files', 'link'],
func: async (page, kwargs) => {
const clipId = parseClipId(kwargs.clip);
const requestedFormats = parseFormats(kwargs.formats);
const confirmPaid = normalizeBooleanFlag(kwargs['confirm-paid']);
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 (!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 session = await ensureSunoSession(page);
const deviceId = session.deviceId;
// Pull the clip object from feed/v3 so audio_url/media_urls/has_stem are current.
const feedRes = unwrapEvaluateResult(await page.evaluate(`(async () => {
const browserToken = JSON.stringify({ token: btoa(JSON.stringify({ timestamp: Date.now() })) });
const res = await fetch('${STUDIO_API}/api/feed/v3', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + (await window.Clerk.session.getToken()),
'browser-token': browserToken,
'device-id': ${JSON.stringify(deviceId)},
'Content-Type': 'application/json',
},
body: JSON.stringify({ clip_ids: ['${clipId}'] }),View on GitHub (pinned to 49907e53dc)
Solutions
- Add `--confirm-paid true` to accept the WAV per-download charge
- Or include a free format: `--formats mp3` or `--formats metadata` (or default mp3,metadata)
- Check flag spelling — it is `--confirm-paid` (boolean, default false)
Example fix
// before
await cli('suno', 'download', id, '--formats', 'wav'); // ArgumentError
// after
await cli('suno', 'download', id, '--formats', 'wav', '--confirm-paid', 'true');
// or free alternative:
await cli('suno', 'download', id, '--formats', 'mp3'); Defensive patterns
Strategy: validation
Validate before calling
const requested = (formats || 'mp3,metadata').split(',');
const paid = requested.filter(f => f === 'wav');
if (paid.length && confirmPaid !== true) {
console.warn('wav requires --confirm-paid true (per-download billing); adding free formats or the flag');
} Type guard
function isPaidFormatSafe(formats, confirmPaid) {
const paid = ['wav'];
return !formats.some(f => paid.includes(f)) || confirmPaid === true;
} Try / catch
try {
await cli('suno', 'download', id, '--formats', formats);
} catch (e) {
if (/--confirm-paid/.test(e.message)) {
return cli('suno', 'download', id, '--formats', formats, '--confirm-paid', 'true');
}
throw e;
} Prevention
- Always pass --confirm-paid true explicitly when WAV downloads (billing) are intended
- Include a free format (mp3/metadata) alongside wav so the command partially succeeds without the flag
- Spell the flag exactly as --confirm-paid (boolean, default false)
- Audit automated scripts for paid formats to avoid unexpected Suno charges
When it happens
Trigger: Running `opencli suno download <id> --formats wav` (only a paid format) without `--confirm-paid true`, so the format filter empties the list.
Common situations: Defaulting --formats to wav in a script; forgetting that wav triggers billing; combining a paid-only format list with the flag misspelled (e.g. confirm_paid) so it stays false.
Related errors
- ${label} is required
- ${label} must be a positive integer
- ${label} must be <= ${maxValue}
- ${label} must be a numeric ID
- ${label} cannot be empty
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/58af57fb98be8998.
Report an issue: GitHub.