{"record":{"id":"1785f43a754a12ab","repo":"pinpoint-apm/pinpoint","slug":"invalid-servicetype-servicetype-is-required","errorCode":null,"errorMessage":"Invalid serviceType. ServiceType is required","messagePattern":"Invalid serviceType\\. ServiceType is required","errorType":"http","errorClass":"ResponseStatusException","httpStatus":400,"severity":"warning","filePath":"web/src/main/java/com/navercorp/pinpoint/web/authorization/controller/AgentV2Controller.java","lineNumber":82,"sourceCode":"        this.rangeValidator = new ForwardRangeValidator(Duration.ofDays(configProperties.getInspectorPeriodMax()));\n    }\n\n    @PreAuthorize(\"@naverPermissionEvaluator.hasInspectorPermission(#serviceName.getName(), #applicationName)\")\n    @GetMapping(value = \"/agents\", params = {\"applicationName\", \"from\", \"to\"})\n    public List<AgentIdView> getAgents(\n            @ServiceParam ServiceName serviceName,\n            @RequestParam(\"applicationName\") @NotBlank String applicationName,\n            @RequestParam(value = \"serviceTypeCode\", required = false) Integer serviceTypeCode,\n            @RequestParam(value = \"serviceTypeName\", required = false) String serviceTypeName,\n            @RequestParam(\"from\") Timestamp from,\n            @RequestParam(\"to\") Timestamp to) {\n        final Service service = serviceModelResolver.getService(serviceName.getName());\n        final ServiceType serviceType = findServiceType(serviceTypeCode, serviceTypeName);\n        Range range = Range.between(from, to);\n        rangeValidator.validate(range);\n\n        if (serviceType.equals(ServiceType.UNDEFINED)) {\n            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, \"Invalid serviceType. ServiceType is required\");\n        }\n        return agentListV2Service.getActiveAgentList(service, applicationName, serviceType, range).stream()\n                .map(entry -> AgentIdView.of(entry, range.getTo()))\n                .toList();\n    }\n\n    @PreAuthorize(\"@naverPermissionEvaluator.hasInspectorPermission(#serviceName.getName(), #applicationName)\")\n    @GetMapping(value = \"/agents\", params = {\"applicationName\", \"!from\", \"!to\"})\n    public List<AgentIdView> getAgents(\n            @ServiceParam ServiceName serviceName,\n            @RequestParam(\"applicationName\") @NotBlank String applicationName,\n            @RequestParam(value = \"serviceTypeCode\", required = false) Integer serviceTypeCode,\n            @RequestParam(value = \"serviceTypeName\", required = false) String serviceTypeName) {\n        final Service service = serviceModelResolver.getService(serviceName.getName());\n        final ServiceType serviceType = findServiceType(serviceTypeCode, serviceTypeName);\n        if (serviceType.equals(ServiceType.UNDEFINED)) {\n            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, \"Invalid serviceType. ServiceType is required\");\n        }","sourceCodeStart":64,"sourceCodeEnd":100,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/web/src/main/java/com/navercorp/pinpoint/web/authorization/controller/AgentV2Controller.java#L64-L100","documentation":"This Pinpoint Web API endpoint /getAgentList (active agents) rejects the request with HTTP 400 when the resolved ServiceType equals ServiceType.UNDEFINED, meaning neither a valid serviceTypeCode nor serviceTypeName query parameter was supplied or resolvable. The controller requires the caller to explicitly identify the application's service type before listing agents.","triggerScenarios":"Calling GET /getAgentList without serviceTypeCode/serviceTypeName params, or passing a serviceTypeName that findServiceType cannot resolve, so findServiceType returns ServiceType.UNDEFINED.","commonSituations":"Older dashboards/scripts calling the v2 agent-list API before the serviceType params became mandatory; typos in serviceTypeName; code copied from API versions where the parameter was optional.","solutions":["Pass a valid serviceTypeName (e.g. TOMCAT, SPRING_BOOT) or serviceTypeCode query parameter to /getAgentList","Check the serviceTypeName spelling against Pinpoint's service-type registry (service-types.yml / ServiceTypeRegistryService)","If the code is unknown, omit serviceTypeCode and provide serviceTypeName instead, or look up the code in the Pinpoint service type list"],"exampleFix":"// before\ncurl 'http://pinpoint:8080/getAgentList?applicationName=myApp&from=...&to=...'\n// after\ncurl 'http://pinpoint:8080/getAgentList?applicationName=myApp&serviceTypeName=TOMCAT&from=...&to=...'","handlingStrategy":"validation","validationCode":"if (serviceTypeCode == null && (serviceTypeName == null || serviceTypeName.isBlank())) { throw new IllegalArgumentException(\"serviceTypeCode or serviceTypeName is required\"); }","typeGuard":null,"tryCatchPattern":"try { ... } catch (ResponseStatusException e) { if (e.getStatusCode() == HttpStatus.BAD_REQUEST) { /* prompt for serviceType param */ } else { throw e; } }","preventionTips":["Always include serviceTypeName in v2 agent-list API calls","Keep a constant/map of valid service type names","Validate params client-side before the request"],"tags":["http-400","rest-api","missing-parameter","pinpoint"],"backgroundTag":"missing-required-argument","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}