{"record":{"id":"e5aa19a6cf6d2fd0","repo":"languagetool-org/languagetool","slug":"rule-ruleid-not-found-for-language-lang-lan","errorCode":null,"errorMessage":"Rule '<ruleId>' not found for language <lang> (LanguageTool version/date: <VERSION>/<BUILD_DATE>, total rules of language: <rules.size>)","messagePattern":"Rule '<ruleId>' not found for language <lang> \\(LanguageTool version/date: <VERSION>/<BUILD_DATE>, total rules of language: <rules\\.size>\\)","errorType":"http","errorClass":"PathNotFoundException","httpStatus":404,"severity":"error","filePath":"languagetool-server/src/main/java/org/languagetool/server/ApiV2.java","lineNumber":285,"sourceCode":"      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();\n    try (JsonGenerator g = factory.createGenerator(sw)) {\n      g.writeStartObject();\n      g.writeArrayFieldStart(\"results\");\n      g.writeStartObject();\n      g.writeStringField(\"warning\", \"*** This is not a public API - it may change anytime ***\");\n      g.writeEndObject();\n      for (Rule foundRule : foundRules) {\n        for (CorrectExample example : foundRule.getCorrectExamples()) {\n          g.writeStartObject();\n          g.writeStringField(\"status\", \"correct\");\n          g.writeStringField(\"sentence\", example.getExample());\n          g.writeEndObject();\n        }\n        for (IncorrectExample example : foundRule.getIncorrectExamples()) {\n          g.writeStartObject();","sourceCodeStart":267,"sourceCodeEnd":303,"githubUrl":"https://github.com/languagetool-org/languagetool/blob/2e990059ce67d5e2a0f7f7ca5d31160c6709df4b/languagetool-server/src/main/java/org/languagetool/server/ApiV2.java#L267-L303","documentation":"After building the rule set for the requested language, handleRuleExamplesRequest filters rules by id and, if none match, throws a PathNotFoundException naming the rule, the language, the LanguageTool version/build date, and the total rule count. This means the requested rule id simply does not exist for that language.","triggerScenarios":"GET /v2/ruleExamples?lang=de-DE&ruleId=EN_A_POSSESSIVE_ITS (an English-only rule asked for German); typo in the rule id; rule removed or renamed in a newer LanguageTool version.","commonSituations":"Hard-coded rule ids copied from another language; rules that only exist when specific grammar rules or ngram/language models are activated; clients not re-checking rule availability after a server upgrade.","solutions":["Verify the rule id exists for the given language via GET /v2/rules?lang=<lang> before requesting examples.","Fix typos in the ruleId — ids are case-sensitive.","If the rule is language-specific, request it with the correct 'lang' short code.","If the rule disappeared after a LanguageTool upgrade, consult the version/date in the message and update your integration to the new rule id."],"exampleFix":"// before\nGET /v2/ruleExamples?lang=de-DE&ruleId=EN_A_VS_AN\n// after\nGET /v2/ruleExamples?lang=en-US&ruleId=EN_A_VS_AN","handlingStrategy":"try-catch","validationCode":"const rules = await fetch(`${base}/v2/rules?lang=${lang}`).then(r => r.json());\nif (!rules.rules.some(r => r.id === ruleId)) throw new Error(`Rule ${ruleId} does not exist for ${lang}`);","typeGuard":null,"tryCatchPattern":"// HTTP 404 with body: { error: { message: \"Rule 'X' not found for language Y ...\" } }\ntry {\n  const res = await fetch(examplesUrl);\n  if (res.status === 404) {\n    const body = await res.json();\n    console.warn('Rule not found:', body.error?.message);\n  } else {\n    return res.json();\n  }\n} catch (e) { /* network error handling */ }","preventionTips":["Look up the rule id via /v2/rules for the target language before asking for examples.","Treat rule ids as language-scoped and case-sensitive.","Re-verify hard-coded rule ids after every LanguageTool server upgrade (the message includes the version/build date)."],"tags":["http","rest-api","not-found","languagetool"],"backgroundTag":"resource-not-found","analyzedSha":"2e990059ce67d5e2a0f7f7ca5d31160c6709df4b","analyzedAt":"2026-09-06T09:20:17.015Z","contentChangedAt":"2026-09-06T09:20:17.015Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}