{"record":{"id":"753a058c591edaee","repo":"nats-io/nats-server","slug":"stream-name-is-required-and-can-not-contain","errorCode":null,"errorMessage":"stream name is required and can not contain '.', '*', '>', '\\', '/'","messagePattern":"stream name is required and can not contain '\\.', '\\*', '>', '\\\\', '/'","errorType":"error_code","errorClass":"JSStreamInvalidConfigError","httpStatus":null,"severity":"error","filePath":"server/stream.go","lineNumber":1874,"sourceCode":"\n// Do not hold the jetStream lock, it will be read-locked internally.\nfunc (s *Server) checkStreamCfg(config *StreamConfig, acc *Account, pedantic bool) (StreamConfig, *ApiError) {\n\tif js := s.getJetStream(); js != nil {\n\t\tjs.mu.RLock()\n\t\tdefer js.mu.RUnlock()\n\t}\n\treturn s.checkStreamCfgLocked(config, acc, pedantic)\n}\n\n// jetStream lock (read or write) should be held, if JetStream is enabled.\nfunc (s *Server) checkStreamCfgLocked(config *StreamConfig, acc *Account, pedantic bool) (StreamConfig, *ApiError) {\n\tlim := &s.getOpts().JetStreamLimits\n\n\tif config == nil {\n\t\treturn StreamConfig{}, NewJSStreamInvalidConfigError(fmt.Errorf(\"stream configuration invalid\"))\n\t}\n\tif !isValidAssetName(config.Name) {\n\t\treturn StreamConfig{}, NewJSStreamInvalidConfigError(fmt.Errorf(\"stream name is required and can not contain '.', '*', '>', '\\\\', '/'\"))\n\t}\n\tif len(config.Name) > JSMaxNameLen {\n\t\treturn StreamConfig{}, NewJSStreamInvalidConfigError(fmt.Errorf(\"stream name is too long, maximum allowed is %d\", JSMaxNameLen))\n\t}\n\tif len(config.Description) > JSMaxDescriptionLen {\n\t\treturn StreamConfig{}, NewJSStreamInvalidConfigError(fmt.Errorf(\"stream description is too long, maximum allowed is %d\", JSMaxDescriptionLen))\n\t}\n\n\tvar metadataLen int\n\tfor k, v := range config.Metadata {\n\t\tmetadataLen += len(k) + len(v)\n\t}\n\tif metadataLen > JSMaxMetadataLen {\n\t\treturn StreamConfig{}, NewJSStreamInvalidConfigError(fmt.Errorf(\"stream metadata exceeds maximum size of %d bytes\", JSMaxMetadataLen))\n\t}\n\n\tcfg := *config\n","sourceCodeStart":1856,"sourceCodeEnd":1892,"githubUrl":"https://github.com/nats-io/nats-server/blob/3a66a489d262bf89b71a71c955c94920394532f3/server/stream.go#L1856-L1892","documentation":"The stream name failed isValidAssetName: it is empty or contains the reserved characters '.', '*', '>', '\\\\', '/'. Stream names are used as directory names and API subjects, so wildcards and path separators are forbidden.","triggerScenarios":"Creating a stream with name \"\"; names containing dots (e.g. \"my.stream\"), wildcards ('*','>'), slashes ('/','\\\\'). Also occurs when a name is derived from untrusted input or a subject string is mistakenly reused as a stream name.","commonSituations":"Using a subject like 'orders.eu' as the stream name; templated names from environment config with slashes; empty name when a variable fails to populate; NATS 2.10+ stricter name validation rejecting names older servers accepted.","solutions":["Give the stream a non-empty name containing only letters, digits, '-', '_' (e.g. ORDERS_EU).","Validate names with the same rules before calling AddStream.","If you need dotted hierarchy, encode it (replace '.' with '-') or use subjects to partition instead of stream names.","Check server version: stricter name rules were enforced in newer NATS releases."],"exampleFix":"// before\nname := \"orders.eu\"\ncfg := jetstream.StreamConfig{Name: name}\n// after\nname := \"orders-eu\" // no '.', '*', '>', '\\\\', '/'\ncfg := jetstream.StreamConfig{Name: name}","handlingStrategy":"validation","validationCode":"var nameBadChars = \"*.>\\\\/\"\nfunc validStreamName(name string) error {\n  if name == \"\" { return errors.New(\"stream name required\") }\n  if strings.ContainsAny(name, nameBadChars) {\n    return fmt.Errorf(\"stream name %q contains forbidden characters\", name)\n  }\n  return nil\n}","typeGuard":"func isSafeStreamName(name string) bool {\n  return name != \"\" && !strings.ContainsAny(name, \"*.>\\\\/\")\n}","tryCatchPattern":null,"preventionTips":["Validate all stream names at the config-loading boundary.","Never reuse subject strings as stream names.","Sanitize names derived from tenant/user input.","Prefer [A-Za-z0-9_-] names only.","Test stream creation with your real config files."],"tags":["jetstream","stream-name","validation","naming"],"backgroundTag":"invalid-stream-name","analyzedSha":"3a66a489d262bf89b71a71c955c94920394532f3","analyzedAt":"2026-09-02T04:41:54.247Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}