{"record":{"id":"0eb8b4a5c733f58e","repo":"ipfs/kubo","slug":"servehttpapi-invalid-api-address-q-err-s","errorCode":null,"errorMessage":"serveHTTPApi: invalid API address: %q (err: %s)","messagePattern":"serveHTTPApi: invalid API address: %q \\(err: (.+?)\\)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/ipfs/kubo/daemon.go","lineNumber":833,"sourceCode":"\t}\n\n\tapiAddrs := make([]string, 0, 2)\n\tapiAddr, _ := req.Options[commands.ApiOption].(string)\n\tif apiAddr == \"\" {\n\t\tapiAddrs = cfg.Addresses.API\n\t} else {\n\t\tapiAddrs = append(apiAddrs, apiAddr)\n\t}\n\n\tlistenerAddrs := make(map[string]bool, len(listeners))\n\tfor _, listener := range listeners {\n\t\tlistenerAddrs[string(listener.Multiaddr().Bytes())] = true\n\t}\n\n\tfor _, addr := range apiAddrs {\n\t\tapiMaddr, err := ma.NewMultiaddr(addr)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"serveHTTPApi: invalid API address: %q (err: %s)\", addr, err)\n\t\t}\n\t\tif listenerAddrs[string(apiMaddr.Bytes())] {\n\t\t\tcontinue\n\t\t}\n\n\t\tapiLis, err := manet.Listen(apiMaddr)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"serveHTTPApi: manet.Listen(%s) failed: %s\", apiMaddr, err)\n\t\t}\n\n\t\tlistenerAddrs[string(apiMaddr.Bytes())] = true\n\t\tlisteners = append(listeners, apiLis)\n\t}\n\n\tif len(cfg.API.Authorizations) > 0 && len(listeners) > 0 {\n\t\tfmt.Printf(\"RPC API access is limited by the rules defined in API.Authorizations\\n\")\n\t}\n","sourceCodeStart":815,"sourceCodeEnd":851,"githubUrl":"https://github.com/ipfs/kubo/blob/329838acdfafae224582930457efe80aa217afc0/cmd/ipfs/kubo/daemon.go#L815-L851","documentation":"A configured or --api-provided API address string could not be parsed as a multiaddr (ma.NewMultiaddr failed). %q is the raw address string and %s the parse error; the daemon rejects it instead of guessing, so a typo like a missing slash or bad protocol name blocks API startup.","triggerScenarios":"`ipfs daemon` when config Addresses.API contains a string that ma.NewMultiaddr rejects (e.g. missing /ip4//tcp scheme, stray characters, typo like \"/ip4/0.0.0.0:5001\").","commonSituations":"Hand-edited config merging host:port syntax instead of multiaddr syntax; scripts writing Addresses.API with wrong format; copy-paste from non-kubo tools.","solutions":["Correct the offending entry in Addresses.API to a valid multiaddr, e.g. /ip4/127.0.0.1/tcp/5001","Use `ipfs config Addresses.API` to set values instead of editing JSON by hand","Validate with `ipfs config show | jq '.Addresses.API'` and fix malformed entries"],"exampleFix":"// before\n\"Addresses\": { \"API\": [\"127.0.0.1:5001\"] }\n// after\n\"Addresses\": { \"API\": [\"/ip4/127.0.0.1/tcp/5001\"] }","handlingStrategy":"validation","validationCode":"for _, addr := range apiAddrs {\n    if _, err := multiaddr.NewMultiaddr(addr); err != nil {\n        return fmt.Errorf(\"invalid Addresses.API entry %q: %v\", addr, err)\n    }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always write Addresses.API as multiaddrs, never host:port","Use `ipfs config Addresses.API ...` instead of hand-editing JSON"],"tags":["ipfs","kubo","multiaddr","config","api"],"backgroundTag":"invalid-multiaddr","analyzedSha":"329838acdfafae224582930457efe80aa217afc0","analyzedAt":"2026-09-03T18:30:52.135Z","contentChangedAt":"2026-09-03T18:30:52.135Z","schemaVersion":2},"datasetVersion":"2026-09-11T00:17:11.886Z"}