decolua/9router · error
MiMo bootstrap failed
Error message
MiMo bootstrap failed: ${response.status} What it means
MiMo's free tier requires a bootstrap call that exchanges a generated browser fingerprint for a JWT. bootstrapJwt() performs that POST; when the HTTP response status is not 2xx it throws this error carrying the status code, because no JWT can be obtained and the chat request cannot proceed.
Solutions
- Check the status code in the message: 429 → back off and retry later; 403/401 → fingerprint/endpoint rejected, update 9router; 5xx → upstream outage, retry later
- Update 9router to the latest version in case MiMo changed the bootstrap endpoint or fingerprint scheme
- Disable or bypass proxies/VPNs that may be blocked or injecting failures (adjust proxyOptions)
- Reduce request frequency — free-tier bootstrap is heavily rate-limited per IP
- Verify general connectivity to the MiMo host (curl the bootstrap URL) to rule out network/DNS issues
Example fix
// before
const jwt = await executor.jwt();
// after
let jwt;
try { jwt = await executor.jwt(); }
catch (e) {
if (/MiMo bootstrap failed: 429/.test(e.message)) {
await new Promise(r => setTimeout(r, 30_000));
jwt = await executor.jwt();
} else throw e;
} Defensive patterns
Strategy: retry
Validate before calling
// pre-check reachability of the bootstrap endpoint
const ping = await fetch(MIMO_BOOTSTRAP_URL, { method: 'HEAD' }).catch(() => null);
if (!ping) throw new Error('MiMo bootstrap endpoint unreachable'); Try / catch
try {
jwt = await executor.jwt();
} catch (e) {
const status = e.message.match(/bootstrap failed: (\d+)/)?.[1];
if (status === '429') { await sleep(30_000); jwt = await executor.jwt(); }
else if (status?.startsWith('5')) { /* retry with backoff or fail over */ }
else throw e;
} Prevention
- Throttle free-tier request rate to avoid 429s
- Keep 9router updated — bootstrap endpoints and fingerprint schemes change
- Avoid blocked proxies/VPNs on the MiMo route
- Monitor the bootstrap endpoint's reachability
When it happens
Trigger: The bootstrap endpoint returns 4xx/5xx: fingerprint rejected, rate-limited (429), endpoint moved (404), server error (5xx), or a proxy/network error surfacing as a non-OK response. Raised from bootstrapJwt, called by execute/jwt/first/second.
Common situations: Heavy free-tier usage triggering rate limits; MiMo changing or geo-blocking the bootstrap endpoint; corporate proxy returning 403/502; stale 9router version after an upstream endpoint change.
Related errors
- FUSION Panel failed
- MiMo bootstrap returned no JWT
- NanoBanana status
- Runway status
- [AutoPing] : : ping failed (reset )
AI-assisted analysis of decolua/9router@90b52e06ff (2026-08-30).
Data as JSON: /api/errors/b0a22a7fcad40873.
Report an issue: GitHub.
Appendix: source
Thrown at open-sse/executors/mimo-free.js:94
jwtExpiresAt = 0;
}
async function bootstrapJwt(proxyOptions = null) {
if (cachedJwt && Date.now() < jwtExpiresAt - JWT_EXPIRY_BUFFER_MS) {
return cachedJwt;
}
const response = await proxyAwareFetch(BOOTSTRAP_URL, {
method: "POST",
headers: {
"Content-Type": "application/json",
"User-Agent": USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)],
},
body: JSON.stringify({ client: generateFingerprint() }),
}, proxyOptions);
if (!response.ok) {
throw new Error(`MiMo bootstrap failed: ${response.status}`);
}
const data = await response.json();
if (!data.jwt) {
throw new Error("MiMo bootstrap returned no JWT");
}
cachedJwt = data.jwt;
jwtExpiresAt = parseJwtExp(data.jwt);
return cachedJwt;
}
export class MimoFreeExecutor extends BaseExecutor {
constructor() {
super("mimo-free", PROVIDERS["mimo-free"]);
this.sessionId = generateSessionId();
}
View on GitHub (pinned to 90b52e06ff)