charmbracelet/crush · error
failed to set provider API key: status code %d
Error message
failed to set provider API key: status code %d
What it means
SetProviderAPIKey expects HTTP 200 from the provider-key endpoint. Any other status (404 workspace missing, 401/403 auth failure, 500 server error) is reported with this error carrying the numeric status.
Source
Thrown at internal/client/config.go:122
return fmt.Errorf("failed to marshal oauth token: %w", err)
}
raw = b
default:
return fmt.Errorf("unsupported api key type %T", apiKey)
}
rsp, err := c.post(ctx, fmt.Sprintf("/workspaces/%s/config/provider-key", id), nil, jsonBody(proto.ConfigProviderKeyRequest{
Scope: scope,
ProviderID: providerID,
Kind: kind,
APIKey: raw,
}), http.Header{"Content-Type": []string{"application/json"}})
if err != nil {
return fmt.Errorf("failed to set provider API key: %w", err)
}
defer rsp.Body.Close()
if rsp.StatusCode != http.StatusOK {
return fmt.Errorf("failed to set provider API key: status code %d", rsp.StatusCode)
}
return nil
}
// ImportCopilot attempts to import a GitHub Copilot token on the
// server.
func (c *Client) ImportCopilot(ctx context.Context, id string) (*oauth.Token, bool, error) {
rsp, err := c.post(ctx, fmt.Sprintf("/workspaces/%s/config/import-copilot", id), nil, nil, nil)
if err != nil {
return nil, false, fmt.Errorf("failed to import copilot: %w", err)
}
defer rsp.Body.Close()
if rsp.StatusCode != http.StatusOK {
return nil, false, fmt.Errorf("failed to import copilot: status code %d", rsp.StatusCode)
}
var result struct {
Token *oauth.Token `json:"token"`
Success bool `json:"success"`View on GitHub (pinned to 7944b8e522)
Solutions
- Read the status code in the error to identify the failure class
- For 401/403, refresh credentials and retry
- For 404, verify the workspace id exists
- For 5xx, check server logs and retry after the server recovers
Defensive patterns
Strategy: try-catch
Try / catch
if err := c.SetProviderAPIKey(ctx, wsID, scope, pid, key); err != nil {
var sc int
if n, _ := fmt.Sscanf(err.Error(), "failed to set provider API key: status code %d", &sc); n == 1 {
switch {
case sc == 401 || sc == 403:
return reauthAndRetry(ctx)
case sc == 404:
return errors.New("workspace not found")
}
}
return err
} Prevention
- Verify workspace id validity before mutating config
- Keep server and client versions aligned
- Authenticate before sequences of config calls
When it happens
Trigger: Server responds non-200 to POST /workspaces/{id}/config/provider-key — nonexistent workspace id, invalid/expired auth, or server-side persistence error.
Common situations: Typo in workspace id, stale auth token after re-login elsewhere, server version lacking the provider-key endpoint, key rejected by validation on the server.
Related errors
- server health check failed: %s
- server shutdown failed: %s
- failed to set compact mode: status code %d
- failed to set provider API key: %w
- status code %d: %s
AI-assisted analysis of charmbracelet/crush@7944b8e522 (2026-08-29).
Data as JSON: /api/errors/6fe7b2b1b65a5d44.
Report an issue: GitHub.