decolua/9router · error

MiMo bootstrap failed: ${response.status}

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.

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)

Solutions

  1. 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
  2. Update 9router to the latest version in case MiMo changed the bootstrap endpoint or fingerprint scheme
  3. Disable or bypass proxies/VPNs that may be blocked or injecting failures (adjust proxyOptions)
  4. Reduce request frequency — free-tier bootstrap is heavily rate-limited per IP
  5. 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

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


AI-assisted analysis of decolua/9router@90b52e06ff (2026-08-30). Data as JSON: /api/errors/b0a22a7fcad40873. Report an issue: GitHub.