{"record":{"id":"112902bc183b9eab","repo":"languagetool-org/languagetool","slug":"language-parameter-missing","errorCode":null,"errorMessage":"'language' parameter missing","messagePattern":"'language' parameter missing","errorType":"http","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"languagetool-server/src/main/java/org/languagetool/server/ApiV2.java","lineNumber":127,"sourceCode":"  private void handleLanguagesRequest(HttpExchange httpExchange) throws IOException {\n    String response = getLanguages();\n    ServerTools.setCommonHeaders(httpExchange, JSON_CONTENT_TYPE, allowOriginUrl);\n    httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, response.getBytes(ENCODING).length);\n    httpExchange.getResponseBody().write(response.getBytes(ENCODING));\n    ServerMetricsCollector.getInstance().logResponse(HttpURLConnection.HTTP_OK);\n  }\n\n  private void handleMaxTextLengthRequest(HttpExchange httpExchange, HTTPServerConfig config) throws IOException {\n    String response = Integer.toString(config.getMaxTextLengthAnonymous());\n    ServerTools.setCommonHeaders(httpExchange, TEXT_CONTENT_TYPE, allowOriginUrl);\n    httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, response.getBytes(ENCODING).length);\n    httpExchange.getResponseBody().write(response.getBytes(ENCODING));\n    ServerMetricsCollector.getInstance().logResponse(HttpURLConnection.HTTP_OK);\n  }\n\n  private void handleGetConfigurationInfoRequest(HttpExchange httpExchange, Map<String, String> parameters, HTTPServerConfig config) throws IOException {\n    if (parameters.get(\"language\") == null) {\n      throw new BadRequestException(\"'language' parameter missing\");\n    }\n    Language lang = Languages.getLanguageForShortCode(parameters.get(\"language\"));\n    String response = getConfigurationInfo(lang, config);\n    ServerTools.setCommonHeaders(httpExchange, JSON_CONTENT_TYPE, allowOriginUrl);\n    httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, response.getBytes(ENCODING).length);\n    httpExchange.getResponseBody().write(response.getBytes(ENCODING));\n    ServerMetricsCollector.getInstance().logResponse(HttpURLConnection.HTTP_OK);\n  }\n\n  private void handleSoftwareInfoRequest(HttpExchange httpExchange) throws IOException {\n    String response = getSoftwareInfo();\n    ServerTools.setCommonHeaders(httpExchange, JSON_CONTENT_TYPE, allowOriginUrl);\n    httpExchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, response.getBytes(ENCODING).length);\n    httpExchange.getResponseBody().write(response.getBytes(ENCODING));\n    ServerMetricsCollector.getInstance().logResponse(HttpURLConnection.HTTP_OK);\n  }\n\n  private void handleCheckRequest(HttpExchange httpExchange, Map<String, String> parameters, ErrorRequestLimiter errorRequestLimiter, String remoteAddress, HTTPServerConfig config) throws Exception {","sourceCodeStart":109,"sourceCodeEnd":145,"githubUrl":"https://github.com/languagetool-org/languagetool/blob/2e990059ce67d5e2a0f7f7ca5d31160c6709df4b/languagetool-server/src/main/java/org/languagetool/server/ApiV2.java#L109-L145","documentation":"handleGetConfigurationInfoRequest (/v2/configuration-info) requires a 'language' parameter to know which language's configuration options to describe. When the parameter is absent, it throws BadRequestException (HTTP 400).","triggerScenarios":"GET/POST /v2/configuration-info without language=..., or sending the parameter under a misspelled name (e.g. 'lang', 'locale').","commonSituations":"Client libraries built against an older API shape, hand-rolled curl commands omitting the query parameter.","solutions":["Add the language parameter, e.g. ?language=en-US","Use a valid short code accepted by Languages.getLanguageForShortCode","Ensure the parameter is sent in the POST body or query string as expected by the client"],"exampleFix":"// before\ncurl 'http://server:8081/v2/configuration-info'\n// after\ncurl 'http://server:8081/v2/configuration-info?language=en-US'","handlingStrategy":"validation","validationCode":"const params = new URLSearchParams({ language: 'en-US' });\nif (!params.has('language')) throw new Error('language required');\nfetch(`${base}/v2/configuration-info?${params}`);","typeGuard":null,"tryCatchPattern":"try {\n    const info = await getConfigurationInfo(lang);\n} catch (e) {\n    if (/language.*parameter missing/.test(e.message)) {\n        console.error('Supply ?language=<shortcode>');\n    } else throw e;\n}","preventionTips":["Always include language in configuration-info requests","Validate parameter names before sending (language, not lang)","Use the server's /v2/languages to confirm valid short codes","Centralize query building in one client helper"],"tags":["http","api","validation","languagetool-server"],"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-14T00:17:10.932Z"}