{"record":{"id":"3779de08d97f9573","repo":"ipfs/kubo","slug":"servehttpapi-manet-listen-s-failed-s","errorCode":null,"errorMessage":"serveHTTPApi: manet.Listen(%s) failed: %s","messagePattern":"serveHTTPApi: manet\\.Listen\\((.+?)\\) failed: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/ipfs/kubo/daemon.go","lineNumber":841,"sourceCode":"\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\n\tfor _, listener := range listeners {\n\t\t// we might have listened to /tcp/0 - let's see what we are listing on\n\t\tfmt.Printf(\"RPC API server listening on %s\\n\", listener.Multiaddr())\n\t\t// Browsers require TCP with explicit host.\n\t\tswitch listener.Addr().Network() {\n\t\tcase \"tcp\", \"tcp4\", \"tcp6\":\n\t\t\trpc := listener.Addr().String()\n\t\t\t// replace catch-all with explicit localhost URL that works in browsers","sourceCodeStart":823,"sourceCodeEnd":859,"githubUrl":"https://github.com/ipfs/kubo/blob/329838acdfafae224582930457efe80aa217afc0/cmd/ipfs/kubo/daemon.go#L823-L859","documentation":"After parsing each Addresses.API multiaddr, kubo calls manet.Listen to bind it (unless already covered by an inherited listener); a bind failure (port in use, permission denied, unassigned address) is wrapped in this error.","triggerScenarios":"`ipfs daemon` where an API address cannot be bound: port already in use by another daemon/process, port <1024 without privileges, binding to a nonexistent interface IP.","commonSituations":"Second daemon on the same machine using default API port 5001; stale daemon still holding the port; Docker/CI port collisions; firewalls or restricted environments blocking bind.","solutions":["Kill the stale process holding the port (`lsof -i :5001` or `pkill -f 'ipfs daemon'`)","Change Addresses.API to a free port, e.g. /ip4/127.0.0.1/tcp/5101","Avoid binding privileged ports (<1024) or unassigned local IPs","Verify with `ipfs daemon` on a fresh IPFS_PATH to rule out lock conflicts"],"exampleFix":"// before\n\"Addresses\": { \"API\": [\"/ip4/127.0.0.1/tcp/5001\"] } // port busy\n// after\n\"Addresses\": { \"API\": [\"/ip4/127.0.0.1/tcp/5101\"] }","handlingStrategy":"validation","validationCode":"// probe the port before starting\nln, err := net.Listen(\"tcp\", \"127.0.0.1:5001\")\nif err != nil {\n    // port in use: pick another port or stop the other daemon\n}\nln.Close()","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Check port availability before launching daemons in CI/Docker","Use unique IPFS_PATH and non-default ports for parallel daemons","Kill stale daemons (`pkill -f 'ipfs daemon'`) before restarts"],"tags":["ipfs","kubo","listen","port-in-use","api"],"backgroundTag":"address-already-in-use","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"}