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

  1. Add `--confirm-paid true` to accept the WAV per-download charge
  2. Or include a free format: `--formats mp3` or `--formats metadata` (or default mp3,metadata)
  3. 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

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


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/58af57fb98be8998. Report an issue: GitHub.