{"record":{"id":"91ef1762aa47aba4","repo":"flowable/flowable-engine","slug":"signal-name-is-required-91ef17","errorCode":null,"errorMessage":"Signal name is required","messagePattern":"Signal name is required","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":400,"severity":"error","filePath":"modules/flowable-rest/src/main/java/org/flowable/rest/service/api/runtime/process/ExecutionResource.java","lineNumber":79,"sourceCode":"        Execution execution = getExecutionFromRequest(executionId);\n        \n        if (restApiInterceptor != null) {\n            restApiInterceptor.doExecutionActionRequest(execution, actionRequest);\n        }\n\n        if (ExecutionActionRequest.ACTION_SIGNAL.equals(actionRequest.getAction())\n                || ExecutionActionRequest.ACTION_TRIGGER.equals(actionRequest.getAction())) {\n            if (actionRequest.getTransientVariables() != null && actionRequest.getVariables() != null) {\n                runtimeService.trigger(execution.getId(), getVariablesToSet(actionRequest.getVariables()), getVariablesToSet(actionRequest.getTransientVariables()));\n            } else if (actionRequest.getVariables() != null) {\n                runtimeService.trigger(execution.getId(), getVariablesToSet(actionRequest.getVariables()));\n            } else {\n                runtimeService.trigger(execution.getId());\n            }\n            \n        } else if (ExecutionActionRequest.ACTION_SIGNAL_EVENT_RECEIVED.equals(actionRequest.getAction())) {\n            if (actionRequest.getSignalName() == null) {\n                throw new FlowableIllegalArgumentException(\"Signal name is required\");\n            }\n            if (actionRequest.getVariables() != null) {\n                runtimeService.signalEventReceived(actionRequest.getSignalName(), execution.getId(), getVariablesToSet(actionRequest.getVariables()));\n            } else {\n                runtimeService.signalEventReceived(actionRequest.getSignalName(), execution.getId());\n            }\n            \n        } else if (ExecutionActionRequest.ACTION_MESSAGE_EVENT_RECEIVED.equals(actionRequest.getAction())) {\n            if (actionRequest.getMessageName() == null) {\n                throw new FlowableIllegalArgumentException(\"Message name is required\");\n            }\n            if (actionRequest.getVariables() != null) {\n                runtimeService.messageEventReceived(actionRequest.getMessageName(), execution.getId(), getVariablesToSet(actionRequest.getVariables()));\n            } else {\n                runtimeService.messageEventReceived(actionRequest.getMessageName(), execution.getId());\n            }\n            \n        } else {","sourceCodeStart":61,"sourceCodeEnd":97,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-rest/src/main/java/org/flowable/rest/service/api/runtime/process/ExecutionResource.java#L61-L97","documentation":"FlowableIllegalArgumentException thrown by ExecutionResource.performExecutionAction when the action is 'signal-event-received' but signalName is null. This per-execution endpoint delivers a signal to a specific execution waiting at a signal-catching event; the signal name identifies which event to fire.","triggerScenarios":"POST /runtime/executions/{executionId} with body {\"action\":\"signal-event-received\"} and no (or null) signalName field.","commonSituations":"Clients migrating from the collection endpoint forgetting the payload shape; building the body dynamically where the signal name variable is null; typos like 'signal-name' in JSON keys.","solutions":["Add \"signalName\" to the request body with the exact signal name from the BPMN model.","Verify the JSON key spelling/casing is 'signalName'.","If you meant to just continue a waiting execution without an event, use action \"trigger\" instead (no signalName needed).","Ensure the execution is actually waiting at a signal-catching event with that name, otherwise the next call will fail with a different error."],"exampleFix":"// before\n{\"action\": \"signal-event-received\"}\n// after\n{\"action\": \"signal-event-received\", \"signalName\": \"paymentReceived\"}","handlingStrategy":"validation","validationCode":"if (body.action === 'signal-event-received' && (!body.signalName || typeof body.signalName !== 'string')) {\n  throw new Error(`POST /runtime/executions/${executionId} requires \"signalName\" for action signal-event-received`);\n}","typeGuard":"function isSignalRequest(b: { action?: string; signalName?: unknown }): b is { action: 'signal-event-received'; signalName: string } {\n  return b.action === 'signal-event-received' && typeof b.signalName === 'string' && b.signalName.length > 0;\n}","tryCatchPattern":"try {\n  await restClient.post(`/runtime/executions/${executionId}`, body);\n} catch (e) {\n  if (e.response && e.response.status === 400 && /Signal name is required/.test(e.response.data && e.response.data.message || '')) {\n    console.error('Add \"signalName\" to the execution action request body');\n  }\n  throw e;\n}","preventionTips":["Set signalName whenever action is 'signal-event-received' on the per-execution endpoint.","Use action 'trigger' (no signalName) when you only want to continue the execution.","Derive request bodies from typed client methods, not ad-hoc objects.","Verify the target execution is waiting at the matching signal catch event."],"tags":["rest-api","validation","signal","flowable"],"backgroundTag":"missing-required-argument","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"}