{"record":{"id":"f4dcc794e4b2ae51","repo":"cloudflare/cloudflared","slug":"s-is-neither-the-id-nor-the-name-of-any-of-your-t","errorCode":null,"errorMessage":"%s is neither the ID nor the name of any of your tunnels","messagePattern":"(.+?) is neither the ID nor the name of any of your tunnels","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/cloudflared/tunnel/subcommand_context.go","lineNumber":376,"sourceCode":"\t\treturn u, nil\n\t}\n\n\t// Look up name in the credentials file.\n\tcredFinder := newStaticPath(sc.c.String(CredFileFlag), sc.fs)\n\tif credentials, err := sc.readTunnelCredentials(credFinder); err == nil {\n\t\tif credentials.TunnelID != uuid.Nil {\n\t\t\treturn credentials.TunnelID, nil\n\t\t}\n\t}\n\n\t// Fall back to querying Tunnelstore.\n\tif tunnel, found, err := sc.tunnelActive(input); err != nil {\n\t\treturn uuid.Nil, err\n\t} else if found {\n\t\treturn tunnel.ID, nil\n\t}\n\n\treturn uuid.Nil, fmt.Errorf(\"%s is neither the ID nor the name of any of your tunnels\", input)\n}\n\n// findIDs is just like mapping `findID` over a slice, but it only uses\n// one Tunnelstore API call per non-UUID input provided.\nfunc (sc *subcommandContext) findIDs(inputs []string) ([]uuid.UUID, error) {\n\tuuids, names := splitUuids(inputs)\n\n\tfor _, name := range names {\n\t\tfilter := cfapi.NewTunnelFilter()\n\t\tfilter.NoDeleted()\n\t\tfilter.ByName(name)\n\n\t\ttunnels, err := sc.list(filter)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif len(tunnels) != 1 {","sourceCodeStart":358,"sourceCodeEnd":394,"githubUrl":"https://github.com/cloudflare/cloudflared/blob/2253eeeb25a44a713a4b60b8ba1e1b3f377d1a0f/cmd/cloudflared/tunnel/subcommand_context.go#L358-L394","documentation":"findID resolves a user-supplied tunnel input to a UUID: it first tries to parse it as a UUID, then falls back to looking up a non-deleted tunnel by name via tunnelActive. If neither succeeds, the input is not a valid tunnel ID in your account nor the name of an existing tunnel, so this error is raised.","triggerScenarios":"Running `cloudflared tunnel run/info/delete/route <input>` where <input> is neither a valid UUID nor the exact name of an existing non-deleted tunnel owned by the authenticated account.","commonSituations":"Typo in the tunnel name; tunnel belongs to a different Cloudflare account because cert.pem was issued for another account; tunnel was deleted; input references an old renamed tunnel.","solutions":["Run `cloudflared tunnel list` and copy the exact ID or name of the tunnel.","Confirm you are logged into the right account (`cloudflared tunnel token` / cert.pem origin) — the lookup only sees tunnels under the account of your current cert.pem.","Create the tunnel if it doesn't exist yet: `cloudflared tunnel create <name>`.","Re-authenticate with `cloudflared tunnel login` if the tunnel lives in another account."],"exampleFix":"// before\ncloudflared tunnel run my-tunel\n// after\ncloudflared tunnel list   # find exact name/id\ncloudflared tunnel run my-tunnel","handlingStrategy":"validation","validationCode":"out, err := exec.Command(\"cloudflared\", \"tunnel\", \"list\", \"--output\", \"json\").Output()\nif err != nil {\n    return err\n}\nvar tunnels []struct{ ID, Name string }\njson.Unmarshal(out, &tunnels)\nvalid := false\nfor _, t := range tunnels {\n    if t.ID == input || t.Name == input { valid = true }\n}\nif !valid { return fmt.Errorf(\"%q is not an existing tunnel\", input) }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always confirm the name/ID with `cloudflared tunnel list` before referencing a tunnel.","Prefer the tunnel UUID in scripts to avoid name/account ambiguity.","Check which account your cert.pem belongs to before switching projects."],"tags":["cli","not-found","tunnel","identifier"],"backgroundTag":"entity-not-found","analyzedSha":"2253eeeb25a44a713a4b60b8ba1e1b3f377d1a0f","analyzedAt":"2026-09-06T04:14:33.757Z","contentChangedAt":"2026-09-06T04:14:33.757Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}