ipfs/kubo · error
cannot change remote pinning services api info with `config
Error message
cannot change remote pinning services api info with `config replace`
What it means
'ipfs config replace' guard: for a service present in both configs, some API detail (endpoint or credentials) differs in the replacement. Changing pinning service API info via config replace is blocked so existing secrets are not silently overwritten or leaked.
Source
Thrown at core/commands/config.go:696
newServices := newCfg.Pinning.RemoteServices
oldServices, err := getRemotePinningServices(r)
if err != nil {
return fmt.Errorf("failed to load remote pinning services info (%v)", err)
}
// fail fast if service lists are obviously different
if len(newServices) != len(oldServices) {
return errors.New("cannot add or remove remote pinning services with 'config replace'")
}
// re-apply API details and confirm every modified service already existed
for name, oldSvc := range oldServices {
if newSvc, hadSvc := newServices[name]; hadSvc {
// fail if input changes any of API details
// (interop with config show: allow Endpoint as long it did not change)
if len(newSvc.API.Key) != 0 || (len(newSvc.API.Endpoint) != 0 && newSvc.API.Endpoint != oldSvc.API.Endpoint) {
return errors.New("cannot change remote pinning services api info with `config replace`")
}
// re-apply API details and store service in updated config
newSvc.API = oldSvc.API
newCfg.Pinning.RemoteServices[name] = newSvc
} else {
// error on service rm attempt
return errors.New("cannot add or remove remote pinning services with 'config replace'")
}
}
return r.SetConfig(&newCfg)
}
func getRemotePinningServices(r repo.Repo) (map[string]config.RemotePinningService, error) {
var oldServices map[string]config.RemotePinningService
if remoteServicesTag, err := getConfig(r, config.RemoteServicesPath); err == nil {
// seems that golang cannot type assert map[string]interface{} to map[string]config.RemotePinningService
// so we have to manually copy the data :-|View on GitHub (pinned to 329838acdf)
Solutions
- Keep the remote service API details unchanged in the replacement file
- Use 'ipfs pin remote service' subcommands to update endpoint or credentials
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at core/commands/config.go:696 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of ipfs/kubo@329838acdf (2026-09-03).
Data as JSON: /api/errors/920d71e2c453c519.
Report an issue: GitHub.