{"record":{"id":"820481daf0432673","repo":"flowable/flowable-engine","slug":"illegal-action-action","errorCode":null,"errorMessage":"Illegal action: '${action}'.","messagePattern":"Illegal action: '(.+?)'\\.","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":400,"severity":"error","filePath":"modules/flowable-rest/src/main/java/org/flowable/rest/service/api/runtime/process/ExecutionCollectionResource.java","lineNumber":145,"sourceCode":"\n        return getQueryResponse(queryRequest, allRequestParams);\n    }\n\n    //FIXME Documentation ?\n    @ApiOperation(value = \"Signal event received\", tags = { \"Executions\" }, code = 204)\n    @ApiResponses(value = {\n            @ApiResponse(code = 204, message = \"Indicates request was successful and the executions are returned\"),\n            @ApiResponse(code = 404, message = \"Indicates a parameter was passed in the wrong format . The status-message contains additional information.\")\n    })\n    @PutMapping(value = \"/runtime/executions\")\n    @ResponseStatus(HttpStatus.NO_CONTENT)\n    public void executeExecutionAction(@RequestBody ExecutionActionRequest actionRequest) {\n        if (restApiInterceptor != null) {\n            restApiInterceptor.doExecutionActionRequest(actionRequest);\n        }\n        \n        if (!ExecutionActionRequest.ACTION_SIGNAL_EVENT_RECEIVED.equals(actionRequest.getAction())) {\n            throw new FlowableIllegalArgumentException(\"Illegal action: '\" + actionRequest.getAction() + \"'.\");\n        }\n\n        if (actionRequest.getSignalName() == null) {\n            throw new FlowableIllegalArgumentException(\"Signal name is required.\");\n        }\n\n        if (actionRequest.getVariables() != null) {\n            runtimeService.signalEventReceived(actionRequest.getSignalName(), getVariablesToSet(actionRequest.getVariables()));\n        } else {\n            runtimeService.signalEventReceived(actionRequest.getSignalName());\n        }\n    }\n}\n","sourceCodeStart":127,"sourceCodeEnd":159,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-rest/src/main/java/org/flowable/rest/service/api/runtime/process/ExecutionCollectionResource.java#L127-L159","documentation":"FlowableIllegalArgumentException thrown by ExecutionCollectionResource.executeExecutionAction when the ExecutionActionRequest 'action' is anything other than 'signal-event-received' — the only action this collection-level endpoint supports. This endpoint signals the whole process instance via a signal event; other execution actions must go through the single-execution endpoint.","triggerScenarios":"POST /runtime/executions with body {\"action\":\"...\"} where action is not \"signal-event-received\" (e.g. \"message-event-received\", \"trigger\", or a typo like \"signalEventReceived\").","commonSituations":"Copying action strings from code that targets the per-execution endpoint (which allows trigger/message actions); camelCase vs kebab-case confusion with ExecutionActionRequest.ACTION_* constants; using old Activiti-style action names.","solutions":["Set action to exactly \"signal-event-received\" in the request body.","Use the per-execution endpoint POST /runtime/executions/{executionId} instead if you need 'trigger' or 'message-event-received' actions.","Check for typos/casing: the value is kebab-case and case-sensitive.","Consult the ExecutionActionRequest.ACTION_SIGNAL_EVENT_RECEIVED constant for the canonical value."],"exampleFix":"// before\n{\"action\": \"message-event-received\", \"messageName\": \"orderMsg\"}\n// after\n{\"action\": \"signal-event-received\", \"signalName\": \"orderSignal\"}","handlingStrategy":"validation","validationCode":"const ALLOWED_ACTIONS = ['signal-event-received']; // collection endpoint supports only this\nif (!ALLOWED_ACTIONS.includes(body.action)) {\n  throw new Error(`POST /runtime/executions only supports action \"signal-event-received\", got \"${body.action}\"`);\n}","typeGuard":"function isSignalAction(a: unknown): a is 'signal-event-received' {\n  return a === 'signal-event-received';\n}","tryCatchPattern":"try {\n  await restClient.post('/runtime/executions', body);\n} catch (e) {\n  if (e.response && e.response.status === 400 && /Illegal action/.test(e.response.data && e.response.data.message || '')) {\n    console.error(`Unsupported action \"${body.action}\" for this endpoint; use the per-execution endpoint for trigger/message actions`);\n  }\n  throw e;\n}","preventionTips":["Use string constants (ExecutionActionRequest.ACTION_SIGNAL_EVENT_RECEIVED) instead of literals.","Remember kebab-case values: 'signal-event-received', 'message-event-received', 'trigger'.","Route trigger/message actions to POST /runtime/executions/{executionId}, not the collection endpoint.","Keep an API-client wrapper that exposes typed methods (signalProcessInstance) instead of raw action strings."],"tags":["rest-api","validation","execution-action","flowable"],"backgroundTag":"invalid-enum-value","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}