{"record":{"id":"55ac21bb4407d8a8","repo":"languagetool-org/languagetool","slug":"unknown-value-param-for-parameter-level-val","errorCode":null,"errorMessage":"Unknown value '{param}' for parameter 'level'. Valid values: {levels}","messagePattern":"Unknown value '(.+?)' for parameter 'level'\\. Valid values: (.+?)","errorType":"validation","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"languagetool-server/src/main/java/org/languagetool/server/ServerTools.java","lineNumber":232,"sourceCode":"        level = Level.PICKY;\n      } else if (\"academic\".equals(param)) {\n        level = Level.ACADEMIC;\n      } else if (\"clarity\".equals(param)) {\n        level = Level.CLARITY;\n      } else if (\"professional\".equals(param)) {\n        level = Level.PROFESSIONAL;\n      } else if (\"creative\".equals(param)) {\n        level = Level.CREATIVE;\n      } else if (\"customer\".equals(param)) {\n        level = Level.CUSTOMER;\n      } else if (\"jobapp\".equals(param)) {\n        level = Level.JOBAPP;\n      } else if (\"objective\".equals(param)) {\n        level = Level.OBJECTIVE;\n      } else if (\"elegant\".equals(param)) {\n        level = Level.ELEGANT;\n      } else {\n        throw new BadRequestException(\"Unknown value '\" + param + \"' for parameter 'level'. Valid values: \" +\n          Arrays.stream(Level.values()).map(k -> k.toString().toLowerCase()).collect(Collectors.joining(\", \")));\n      }\n    } else {\n      level = Level.DEFAULT;\n    }\n    return level;\n  }\n\n  /**\n   * Remove user-content from message in case parameters require increased privacy.\n   * @since 5.0\n   */\n  public static String cleanUserTextFromMessage(String s, Map<String, String> params) {\n    if (params.getOrDefault(\"inputLogging\", \"\").equals(\"no\")) {\n      return sentContentPattern.matcher(s).replaceAll(\"<< content removed >>\");\n    }\n    return s;\n  }","sourceCodeStart":214,"sourceCodeEnd":250,"githubUrl":"https://github.com/languagetool-org/languagetool/blob/2e990059ce67d5e2a0f7f7ca5d31160c6709df4b/languagetool-server/src/main/java/org/languagetool/server/ServerTools.java#L214-L250","documentation":"Parameter validation in ServerTools.getLevel: the 'level' request parameter does not match any known Level name (e.g. default, picky, academic, clarity, ...), so the checking level cannot be resolved.","triggerScenarios":"Calling /v2/check with level=<unknown>, e.g. level=formal, level=picky2, level=PICKY (case must be lowercase — code compares lowercase strings), or a typo.","commonSituations":"Assuming case-insensitivity ('Picky' fails); using level names from other tools or older LanguageTool versions; dynamic UIs passing arbitrary strings straight through.","solutions":["Use one of the documented lowercase values (see the error message's 'Valid values:' list, e.g. picky)","Lowercase your value before sending — comparison uses String.equals on lowercase","Drop the level parameter to get Level.DEFAULT","Parse the Valid values list from the 400 response to build a client-side enum"],"exampleFix":"// before\n\"level=Picky\"\n// after\n\"level=picky\"","handlingStrategy":"validation","validationCode":"const VALID_LEVELS = ['default','picky','jobapp','objective','elegant'];\nfunction validateLevel(level) {\n  if (level !== undefined && !VALID_LEVELS.includes(String(level).toLowerCase())) {\n    throw new Error(`level must be one of ${VALID_LEVELS.join(', ')}`);\n  }\n  return level ? String(level).toLowerCase() : undefined;\n}","typeGuard":null,"tryCatchPattern":"try {\n  return await lt.check({ ...params, level });\n} catch (e) {\n  if (e.status === 400 && /parameter 'level'/.test(e.message)) {\n    return await lt.check({ ...params, level: undefined });\n  }\n  throw e;\n}","preventionTips":["Lowercase the level value client-side before sending (server compares lowercase)","Derive allowed values from the 'Valid values:' list in the 400 message","Use a typed enum in client code instead of free-form strings","Check the LanguageTool API docs for the current Level set when upgrading"],"tags":["http","bad-request","invalid-parameter","enum","languagetool"],"backgroundTag":"invalid-enum-value","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"}