Jackett/Jackett · error · ArgumentException

Invalid filter. Status should be '{Healthy}', {Failing} or '

Error message

Invalid filter. Status should be '{Healthy}', {Failing} or '{Unknown}'

What it means

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.

Source

Thrown at src/Jackett.Common/Utils/FilterFuncs/StatusFilterFunc.cs:27

        public const string Healthy = "healthy";
        public const string Failing = "failing";
        public const string Unknown = "unknown";

        private StatusFilterFunc() : base("status")
        {
        }

        public override Func<IIndexer, bool> ToFunc(string args)
        {
            if (args == null)
                throw new ArgumentNullException(nameof(args));
            if (string.Equals(Healthy, args, StringComparison.InvariantCultureIgnoreCase))
                return i => IsValid(i) && i.IsHealthy && !i.IsFailing;
            if (string.Equals(Failing, args, StringComparison.InvariantCultureIgnoreCase))
                return i => IsValid(i) && !i.IsHealthy && i.IsFailing;
            if (string.Equals(Unknown, args, StringComparison.InvariantCultureIgnoreCase))
                return i => IsValid(i) && ((!i.IsHealthy && !i.IsFailing) || (i.IsHealthy && i.IsFailing));
            throw new ArgumentException($"Invalid filter. Status should be '{Healthy}', {Failing} or '{Unknown}'", nameof(args));
        }
    }
}

View on GitHub (pinned to adff194147)

Solutions

  1. Use one of the documented values: 'healthy', 'failing', or 'unknown' (any casing).
  2. If you built the URL programmatically, validate the status against the allowed set before issuing the request.
  3. Trim whitespace and check for accidental quote characters in the query string.
  4. Make sure you did not confuse the 'status' filter with the 'test' filter (Passed/Failed).
Defensive patterns

Strategy: validation

Validate before calling

static readonly HashSet<string> StatusSet =
    new(StringComparer.OrdinalIgnoreCase) { "healthy", "failing", "unknown" };
static bool IsValidStatus(string s) => s != null && StatusSet.Contains(s.Trim());

Type guard

static bool IsKnownStatus(string s) =>
    s != null && (s.Equals("healthy", StringComparison.OrdinalIgnoreCase)
               || s.Equals("failing", StringComparison.OrdinalIgnoreCase)
               || s.Equals("unknown", StringComparison.OrdinalIgnoreCase));

Prevention

When it happens

Trigger: 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.

Common situations: 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'.

Related errors


AI-assisted analysis of Jackett/Jackett@adff194147 (2026-08-13). Data as JSON: /api/errors/87efd76cbb6187b3. Report an issue: GitHub.