jackwener/OpenCLI · error · CommandExecutionError
HTTP ${probe.httpStatus} from clerk.suno.com
Error message
HTTP ${probe.httpStatus} from clerk.suno.com What it means
The Clerk client endpoint clerk.suno.com/v1/client answered with a non-OK, non-auth status (anything other than 2xx/401/403), so verifySunoIdentity wraps it as a CommandExecutionError with the HTTP status. This is a server/gateway-level problem, not a credential problem.
Source
Thrown at clis/suno/auth.js:44
}
if (!r.ok) return { kind: 'http', httpStatus: r.status };
const d = await r.json();
const sessions = d?.response?.sessions || [];
if (!Array.isArray(sessions) || sessions.length === 0) {
return { kind: 'auth', detail: 'clerk.suno.com sessions=[] — anonymous' };
}
const active = sessions.find(s => s.status === 'active') || sessions[0];
const user = active?.user;
if (!user?.id) {
return { kind: 'auth', detail: 'clerk.suno.com session present but no user.id — stale session' };
}
return { ok: true, user_id: String(user.id), name: String(user.username || '') };
} catch (e) {
return { kind: 'exception', detail: String(e && e.message || e) };
}
})()`);
if (probe?.kind === 'auth') throw new AuthRequiredError('suno.com', probe.detail);
if (probe?.kind === 'http') throw new CommandExecutionError(`HTTP ${probe.httpStatus} from clerk.suno.com`);
if (probe?.kind === 'exception') throw new CommandExecutionError(`Suno whoami failed: ${probe.detail}`);
if (!probe?.ok) throw new CommandExecutionError(`Unexpected Suno probe: ${JSON.stringify(probe)}`);
return { user_id: probe.user_id, name: probe.name };
}
registerSiteAuthCommands({
site: 'suno',
domain: 'suno.com',
loginUrl: 'https://suno.com/?sign-in=true',
columns: ['user_id', 'name'],
quickCheck: hasSunoClerkCookie,
verify: verifySunoIdentity,
poll: async (page) => {
if (!await hasSunoClerkCookie(page)) {
throw new AuthRequiredError('suno.com', 'Waiting for Suno Clerk __session/__client cookie');
}
return verifySunoIdentity(page);
},View on GitHub (pinned to 49907e53dc)
Solutions
- Wait and retry — 429/5xx are usually transient
- Check network path: disable proxy/VPN that may intercept clerk.suno.com
- Check Clerk/Suno status pages for an outage
- If rate-limited, back off and reduce polling frequency
Example fix
// before
await cli('suno', 'whoami'); // -> CommandExecutionError: HTTP 503 from clerk.suno.com
// after (caller-side retry)
for (let i = 0; i < 3; i++) {
try { return await cli('suno', 'whoami'); }
catch (e) { if (!/HTTP \d+ from clerk.suno.com/.test(e.message)) throw e; await sleep(2 ** i * 1000); }
} Defensive patterns
Strategy: retry
Validate before calling
// Quick reachability check
const res = await fetch('https://clerk.suno.com/v1/client?_clerk_js_version=5');
if (res.status === 429 || res.status >= 500) await new Promise(r => setTimeout(r, 5000)); Type guard
function isTransientHttpStatus(status) { return status === 429 || status >= 500; } Try / catch
try {
await cli('suno', 'whoami');
} catch (e) {
const m = e.message.match(/HTTP (\d+) from clerk\.suno\.com/);
if (m && isTransientHttpStatus(+m[1])) { await backoff(); return cli('suno', 'whoami'); }
throw e;
} Prevention
- Add exponential backoff for 429/5xx responses
- Avoid tight polling loops against clerk.suno.com to prevent rate limiting
- Check proxy/VPN settings that could intercept clerk.suno.com traffic
- Monitor Clerk/Suno status during incidents before debugging your own code
When it happens
Trigger: fetch to https://clerk.suno.com/v1/client?_clerk_js_version=5 returns e.g. 429, 5xx, or a proxy error status while running verifySunoIdentity.
Common situations: Clerk outage or rate limiting (429) after many automated calls; corporate proxy / captive portal intercepting requests; CDN returning 502/503; offline machine served an error page.
Related errors
- autohome ${contextHint} HTTP ${resp.status}
- Ctrip flight API returned HTTP ${status || 'unknown'}
- dongchedi ${contextHint} HTTP ${resp.status}
- eastmoney convertible failed: HTTP ${resp.status}
- HTTP_ERROR
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/6837ac75ac6464d6.
Report an issue: GitHub.