Operate

Error handling

Decide what to retry, what to fix, and when to send a user back to the dashboard after a CoreSpeed failure.

This page is about the operational decision. The status codes, error codes, and envelopes themselves are listed once, in Errors & status codes.

Read both layers

A CoreSpeed call can fail at two levels, and only one of them shows up in the HTTP status:

  • Transport and identity — HTTP 4xx / 5xx. The tool never ran. Identity, billing, and catch-all failures use the nested error envelope; connector routes answer with a flat one ({"error": "admin_required"}). A handler that assumes error is always an object will miss the flat codes — both shapes are listed in Errors & status codes.
  • Tool execution — HTTP 200 with result.isError: true. The request was authorized, then the tool refused or failed.

Treating a 200 as success is the most common integration bug against this surface. Branch on isError before interpreting a result.

Who fixes what

FailureOwnerMove
401 on every callThe clientFix the header form, or replace a revoked key.
402 payment_requiredAn org adminTop up. Discovery and account reads keep working meanwhile.
402 key_spend_limit_exceededAn org adminRaise the key's cap, or wait for the monthly reset.
403 org_suspendedSupportNo client-side or billing fix exists.
404 endpoint_not_foundThe clientA retired per-connector or per-engine URL was called. Use POST /mcp.
needs_reauth on an accountThe end userReauthorize in the dashboard.
Tool absent from tools/listAn org admin or the end userThe capability is disabled, or the account is not connected for this caller.

Reauthorization is not a key problem

needs_reauth means the upstream OAuth grant can no longer be used. The connector stays known and its tools stay visible — calls just fail until the account is reauthorized.

Send the user to Dashboard → Connectors. Do not rotate the CoreSpeed key and do not rewrite client configuration: neither one is broken.

Retry rules

  • 401, 402, 403, 404 — do not retry. Nothing changes without an action by the client, an admin, or support.
  • 500 — retry with backoff, and keep the request id for support.
  • Tool-level isError — retry only when the message names a transient upstream condition. A hold, a spend cap, or jwt_session_required will not clear on retry.

Spend caps are boundaries, not reservations

A cap is checked at the request boundary. An action already in flight can finish above the remaining amount before its final cost is recorded — so a cap bounds what starts, not what completes. See Usage & budgets.