{"record":{"id":"87efd76cbb6187b3","repo":"Jackett/Jackett","slug":"invalid-filter-status-should-be-healthy-fai","errorCode":null,"errorMessage":"Invalid filter. Status should be '{Healthy}', {Failing} or '{Unknown}'","messagePattern":"Invalid filter\\. Status should be '(.+?)', (.+?) or '(.+?)'","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Jackett.Common/Utils/FilterFuncs/StatusFilterFunc.cs","lineNumber":27,"sourceCode":"        public const string Healthy = \"healthy\";\n        public const string Failing = \"failing\";\n        public const string Unknown = \"unknown\";\n\n        private StatusFilterFunc() : base(\"status\")\n        {\n        }\n\n        public override Func<IIndexer, bool> ToFunc(string args)\n        {\n            if (args == null)\n                throw new ArgumentNullException(nameof(args));\n            if (string.Equals(Healthy, args, StringComparison.InvariantCultureIgnoreCase))\n                return i => IsValid(i) && i.IsHealthy && !i.IsFailing;\n            if (string.Equals(Failing, args, StringComparison.InvariantCultureIgnoreCase))\n                return i => IsValid(i) && !i.IsHealthy && i.IsFailing;\n            if (string.Equals(Unknown, args, StringComparison.InvariantCultureIgnoreCase))\n                return i => IsValid(i) && ((!i.IsHealthy && !i.IsFailing) || (i.IsHealthy && i.IsFailing));\n            throw new ArgumentException($\"Invalid filter. Status should be '{Healthy}', {Failing} or '{Unknown}'\", nameof(args));\n        }\n    }\n}\n","sourceCodeStart":9,"sourceCodeEnd":31,"githubUrl":"https://github.com/Jackett/Jackett/blob/adff1941476d8057a430cf55360356c1d23e971e/src/Jackett.Common/Utils/FilterFuncs/StatusFilterFunc.cs#L9-L31","documentation":"StatusFilterFunc.ToFunc validates the argument to the '*status=' filter and throws ArgumentException when it is not one of the three accepted constants Healthy, Failing, or Unknown (case-insensitive). The filter pipeline builds predicate functions from user-supplied query args, so this guards a public-ish query surface. The thrown ArgumentException carries the bad value's source parameter name.","triggerScenarios":"A search request URL contains a status filter whose value is outside the allowed set, e.g. '/api/v2.0/indexers/*,status=ok/results' or '*status=down'. Also hit by typos like '*status=helthy' or trailing whitespace the equality check does not trim.","commonSituations":"A user hand-edits a Jackett URL or a third-party client sends a status value from an older/newer Jackett API version. Copy-pasting a filter list and including a value that belongs to the 'test' filter (Passed/Failed) instead of 'status'.","solutions":["Use one of the documented values: 'healthy', 'failing', or 'unknown' (any casing).","If you built the URL programmatically, validate the status against the allowed set before issuing the request.","Trim whitespace and check for accidental quote characters in the query string.","Make sure you did not confuse the 'status' filter with the 'test' filter (Passed/Failed)."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"static readonly HashSet<string> StatusSet =\n    new(StringComparer.OrdinalIgnoreCase) { \"healthy\", \"failing\", \"unknown\" };\nstatic bool IsValidStatus(string s) => s != null && StatusSet.Contains(s.Trim());","typeGuard":"static bool IsKnownStatus(string s) =>\n    s != null && (s.Equals(\"healthy\", StringComparison.OrdinalIgnoreCase)\n               || s.Equals(\"failing\", StringComparison.OrdinalIgnoreCase)\n               || s.Equals(\"unknown\", StringComparison.OrdinalIgnoreCase));","tryCatchPattern":null,"preventionTips":["Whitelist the status value before building the query URL.","Do not mix 'status' and 'test' filter vocabularies.","Trim whitespace from user-supplied filter values."],"tags":["filter","input-validation","query-api"],"backgroundTag":null,"analyzedSha":"adff1941476d8057a430cf55360356c1d23e971e","analyzedAt":"2026-08-13T15:06:32.872Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}