{"record":{"id":"b1d651bbeaf7908e","repo":"languagetool-org/languagetool","slug":"ruleid-parameter-missing","errorCode":null,"errorMessage":"'ruleId' parameter missing","messagePattern":"'ruleId' parameter missing","errorType":"http","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"languagetool-server/src/main/java/org/languagetool/server/ApiV2.java","lineNumber":270,"sourceCode":"    }\n    boolean deleted;\n    if(\"batch\".equals(parameters.get(\"mode\"))) { //Experimental\n      List<String> words = Arrays.asList(parameters.get(\"words\").split(\"\\\\s+\"));\n      deleted = db.deleteWordBatch(words, limits.getPremiumUid(),dict);\n      writeResponse(\"deleted\", deleted, httpExchange);\n    } else {\n      deleted = db.deleteWord(parameters.get(\"word\"), limits.getPremiumUid(), dict);\n      writeResponse(\"deleted\", deleted, httpExchange);\n    }\n  }\n\n  private void handleRuleExamplesRequest(HttpExchange httpExchange, Map<String, String> params) throws Exception {\n    ensureGetMethod(httpExchange, \"/rule/examples\");\n    if (params.get(\"lang\") == null) {\n      throw new BadRequestException(\"'lang' parameter missing\");\n    }\n    if (params.get(\"ruleId\") == null) {\n      throw new BadRequestException(\"'ruleId' parameter missing\");\n    }\n    Language lang = Languages.getLanguageForShortCode(params.get(\"lang\"));\n    JLanguageTool lt = new JLanguageTool(lang);\n    if (textChecker.config.languageModelDir != null) {\n      lt.activateLanguageModelRules(textChecker.config.languageModelDir);\n    }\n    List<Rule> rules = lt.getAllRules();\n    List<Rule> foundRules = new ArrayList<>();\n    for (Rule rule : rules) {\n      if (rule.getId().equals(params.get(\"ruleId\"))) {\n        foundRules.add(rule);\n      }\n    }\n    if (foundRules.isEmpty()) {\n      throw new PathNotFoundException(\"Rule '\" + params.get(\"ruleId\") + \"' not found for language \" + lang +\n              \" (LanguageTool version/date: \" + JLanguageTool.VERSION + \"/\" + JLanguageTool.BUILD_DATE + \", total rules of language: \" + rules.size() + \")\");\n    }\n    StringWriter sw = new StringWriter();","sourceCodeStart":252,"sourceCodeEnd":288,"githubUrl":"https://github.com/languagetool-org/languagetool/blob/2e990059ce67d5e2a0f7f7ca5d31160c6709df4b/languagetool-server/src/main/java/org/languagetool/server/ApiV2.java#L252-L288","documentation":"GET /v2/ruleExamples requires both 'lang' and 'ruleId'. After the 'lang' check, the handler verifies 'ruleId' and throws a BadRequestException if it is missing, because it cannot select which rule's examples to return.","triggerScenarios":"GET /v2/ruleExamples?lang=en-US without a ruleId; passing the rule name in the path or body instead of the 'ruleId' query parameter; misspelling it as 'rule' or 'ruleID'.","commonSituations":"Iterating over rules and forgetting to forward the id to the examples endpoint; clients confusing /v2/rules output field 'id' with a differently named parameter.","solutions":["Append ruleId=<id> to the query string, e.g. ruleId=TOO_LONG_SENTENCE.","Take the exact 'id' value returned by GET /v2/rules as the ruleId value.","Ensure correct casing: 'ruleId' with lowercase 'r' and uppercase 'I'."],"exampleFix":"// before\nGET /v2/ruleExamples?lang=en-US\n// after\nGET /v2/ruleExamples?lang=en-US&ruleId=TOO_LONG_SENTENCE","handlingStrategy":"validation","validationCode":"if (!params.ruleId) throw new Error('ruleExamples requires a \"ruleId\" query parameter');","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Pass ruleId from the 'id' field returned by /v2/rules.","Keep exact casing: 'ruleId'.","Assert both lang and ruleId are present before issuing the request."],"tags":["http","rest-api","validation","languagetool"],"backgroundTag":"missing-required-argument","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"}