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

  1. Add `--confirm-paid true` if you accept the per-download WAV billing charge.
  2. Include a free format in --formats, e.g. `--formats mp3,metadata` or `--formats mp3,wav` (wav still requires confirm-paid).
  3. Pass `--sd true` if you only want clip ids/URLs and no downloads at all.
  4. 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

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


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