{"record":{"id":"2a31bd1bed907c2f","repo":"languagetool-org/languagetool","slug":"you-cannot-specify-disabled-rules-or-categories-us","errorCode":null,"errorMessage":"You cannot specify disabled rules or categories using enabledOnly=true","messagePattern":"You cannot specify disabled rules or categories using enabledOnly=true","errorType":"validation","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"languagetool-server/src/main/java/org/languagetool/server/TextChecker.java","lineNumber":563,"sourceCode":"    List<String> disabledRules = getDisabledRuleIds(params);\n    List<CategoryId> enabledCategories = getCategoryIds(\"enabledCategories\", params);\n    List<CategoryId> disabledCategories = getCategoryIds(\"disabledCategories\", params);\n\n\n    if (shouldRunRestrictedRulesTest(params, agent, lang, abTest)) {\n      log.info(\"Running test with restricted rules for user: {}, language: {}, client: {}\",\n        params.getOrDefault(\"username\", \"\"), lang.getShortCodeWithCountryAndVariant(), agent);\n      useEnabledOnly = true;\n      enabledRules = onlyTestRules;\n      // need to clear these settings, leads to conflict with useEnabledOnly otherwise\n      disabledRules = Collections.emptyList();\n      disabledCategories = Collections.emptyList();\n    }\n\n\n    if ((disabledRules.size() > 0 || disabledCategories.size() > 0) && useEnabledOnly) {\n      ServerMetricsCollector.getInstance().logRequestError(ServerMetricsCollector.RequestErrorType.INVALID_REQUEST);\n      throw new BadRequestException(\"You cannot specify disabled rules or categories using enabledOnly=true\");\n    }\n    if (enabledRules.isEmpty() && enabledCategories.isEmpty() && useEnabledOnly) {\n      ServerMetricsCollector.getInstance().logRequestError(ServerMetricsCollector.RequestErrorType.INVALID_REQUEST);\n      throw new BadRequestException(\"You must specify enabled rules or categories when using enabledOnly=true\");\n    }\n\n    boolean enableTempOffRules = \"true\".equals(params.get(\"enableTempOffRules\"));\n    boolean useQuerySettings = enabledRules.size() > 0 || disabledRules.size() > 0 ||\n            enabledCategories.size() > 0 || disabledCategories.size() > 0 || enableTempOffRules;\n    boolean allowIncompleteResults = \"true\".equals(params.get(\"allowIncompleteResults\"));\n    JLanguageTool.Mode mode = ServerTools.getMode(params);\n    JLanguageTool.Level level = ServerTools.getLevel(params);\n    String[] toneTagNames = params.get(\"toneTags\") != null ? params.get(\"toneTags\").split(\",\") : null;\n    Set<ToneTag> toneTags = new HashSet<>(ToneTag.values().length);\n    if (toneTagNames != null) {\n      if (toneTagNames.length == 1 && toneTagNames[0].isEmpty()) { //&toneTags=\n        toneTags.add(ToneTag.ALL_WITHOUT_GOAL_SPECIFIC);\n      } else {","sourceCodeStart":545,"sourceCodeEnd":581,"githubUrl":"https://github.com/languagetool-org/languagetool/blob/2e990059ce67d5e2a0f7f7ca5d31160c6709df4b/languagetool-server/src/main/java/org/languagetool/server/TextChecker.java#L545-L581","documentation":"When enabledOnly=true is used, the check should be restricted exclusively to explicitly enabled rules/categories. Supplying disabledRules or disabledCategories alongside enabledOnly is contradictory, so checkText throws BadRequestException and logs an INVALID_REQUEST metric.","triggerScenarios":"POSTing to /v2/check with enabledOnly=true AND a non-empty disabledRules or disabledCategories parameter (both lists populated, e.g. disabledRules=WHITESPACE_RULE&enabledOnly=true).","commonSituations":"Client config layers that always send a disabled-rules list (from user preferences) while another layer turns on enabledOnly mode; merging request defaults with user options without checking for conflicts.","solutions":["Remove disabledRules/disabledCategories from the request when using enabledOnly=true","Encode everything you want to exclude by omitting it from the enabledRules/enabledCategories lists instead of disabling it","In client code, drop or ignore disable-lists when the enabledOnly option is set"],"exampleFix":"// before\ncurl -d text=... -d language=en-US -d enabledOnly=true -d disabledRules=WHITESPACE_RULE http://server/v2/check\n// after\ncurl -d text=... -d language=en-US -d enabledOnly=true -d enabledRules=... http://server/v2/check","handlingStrategy":"validation","validationCode":"if (params.enabledOnly && ((params.disabledRules?.length) || (params.disabledCategories?.length))) {\n  delete params.disabledRules;\n  delete params.disabledCategories;\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat enabledOnly as exclusive with any disable-lists","Model rule configuration as either enable-set or disable-set, never both","Centralize request-param assembly so the conflict cannot arise from merged configs"],"tags":["http-400","conflicting-parameters","languagetool-server"],"backgroundTag":"mutually-exclusive-options","analyzedSha":"2e990059ce67d5e2a0f7f7ca5d31160c6709df4b","analyzedAt":"2026-09-06T09:20:17.015Z","contentChangedAt":"2026-09-06T09:20:17.015Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}