Data Object validation on process start using REST API

Dear Community, I strated recently working with Camunda and reached to problem that’s blocking me to go further. I use v 7.12 on Spring Boot.
I’m trying to build simple HR application, with the process as follows:

<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_141rtur" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.7.3">
  <bpmn:process id="Recruitment" name="Recruitment" isExecutable="true">
    <bpmn:startEvent id="openNewPosting" name="New Posting">
      <bpmn:outgoing>Flow_1ofd5e6</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:sequenceFlow id="Flow_1ofd5e6" sourceRef="openNewPosting" targetRef="HrApproval" />
    <bpmn:exclusiveGateway id="requestAccepted" name="Request Accepted">
      <bpmn:incoming>Flow_0q85m3h</bpmn:incoming>
      <bpmn:outgoing>Approved</bpmn:outgoing>
      <bpmn:outgoing>notApproved</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:sequenceFlow id="Flow_0q85m3h" sourceRef="HrApproval" targetRef="requestAccepted" />
    <bpmn:sequenceFlow id="Approved" name="Approved" sourceRef="requestAccepted" targetRef="CandidateEvaluation">
      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{hrApproval == true}</bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:endEvent id="Event_1urby0r">
      <bpmn:incoming>Flow_1e7pogt</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_1e7pogt" sourceRef="CandidateEvaluation" targetRef="Event_1urby0r" />
    <bpmn:sequenceFlow id="notApproved" name="Not approved" sourceRef="requestAccepted" targetRef="postingCorrection">
      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{hrApproval == false}</bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:sequenceFlow id="Flow_1j72qjl" sourceRef="postingCorrection" targetRef="HrApproval" />
    <bpmn:userTask id="HrApproval" name="HR Approval">
      <bpmn:extensionElements>
        <camunda:formData>
          <camunda:formField id="hrApproval" label="Hr Approval" type="boolean" defaultValue="false" />
        </camunda:formData>
      </bpmn:extensionElements>
      <bpmn:incoming>Flow_1ofd5e6</bpmn:incoming>
      <bpmn:incoming>Flow_1j72qjl</bpmn:incoming>
      <bpmn:outgoing>Flow_0q85m3h</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:userTask id="CandidateEvaluation" name="Candidate Evaluation">
      <bpmn:incoming>Approved</bpmn:incoming>
      <bpmn:outgoing>Flow_1e7pogt</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:userTask id="postingCorrection" name="Posting Correction">
      <bpmn:incoming>notApproved</bpmn:incoming>
      <bpmn:outgoing>Flow_1j72qjl</bpmn:outgoing>
    </bpmn:userTask>
  </bpmn:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Recruitment">
      <bpmndi:BPMNEdge id="Flow_1j72qjl_di" bpmnElement="Flow_1j72qjl">
        <di:waypoint x="310" y="210" />
        <di:waypoint x="310" y="157" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1mb3lsu_di" bpmnElement="notApproved">
        <di:waypoint x="440" y="142" />
        <di:waypoint x="440" y="250" />
        <di:waypoint x="360" y="250" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="456" y="193" width="67" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1e7pogt_di" bpmnElement="Flow_1e7pogt">
        <di:waypoint x="620" y="117" />
        <di:waypoint x="682" y="117" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1739h2q_di" bpmnElement="Approved">
        <di:waypoint x="465" y="117" />
        <di:waypoint x="520" y="117" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="470" y="99" width="47" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_0q85m3h_di" bpmnElement="Flow_0q85m3h">
        <di:waypoint x="360" y="117" />
        <di:waypoint x="415" y="117" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_1ofd5e6_di" bpmnElement="Flow_1ofd5e6">
        <di:waypoint x="168" y="117" />
        <di:waypoint x="260" y="117" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="Gateway_11j53ib_di" bpmnElement="requestAccepted" isMarkerVisible="true">
        <dc:Bounds x="415" y="92" width="50" height="50" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="418" y="62" width="46" height="27" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Event_1urby0r_di" bpmnElement="Event_1urby0r">
        <dc:Bounds x="682" y="99" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_0smrg03_di" bpmnElement="HrApproval">
        <dc:Bounds x="260" y="77" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_14eqgon_di" bpmnElement="CandidateEvaluation">
        <dc:Bounds x="520" y="77" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_1n0c035_di" bpmnElement="postingCorrection">
        <dc:Bounds x="260" y="210" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="openNewPosting">
        <dc:Bounds x="132" y="99" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="119" y="142" width="63" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>

The process is started with rest api call to → http://localhost:8080/rest/process-definition/key/{processKey}/start
In body request I send following payload:

{
 "variables": {
  "formData": {
       "value": {
           "briefingForm": {
               "openPosition": "",
               "experienceLevel": "",
               "minSalary": 0,
               "maxSalary": 0,
               "contractType": "",
               "location": [],
               "remoteWork": "",
               "lineManager": "",
               "projectOverview": "",
               "projectDuration": "",
               "projectPhase": "",
               "team": "",
               "projectMethodology": "",
               "jobDescription": "",
               "techStack": [],
               "softSkills": [],
               "languages": []
           },
           "candidates": [],
           "hrApproval": false,
           "status": ""
       },
       "valueInfo": {
           "objectTypeName": "com.test.firstApp.model.hr.OpenPosition",
           "serializationDataFormat": "application/json"
       }
 }
 }
}

I’m thinking how can I introduce validation to such payload? Currently there is total freedom in terms of fields validation and malformed requests (containing either fields not listed in above payload, or too few arguments)?
I was thinking of:
Option 1.
Define form fields corresponding to the payload fields and then apply field validator. Conisdering my knwoledge level, this is my preffered solution, but I’m not sure how to bind incoming payload with form field.

Option 2.
Execution listerner on start. However I’m nut sure if it’s good approach to apply logic after process is started.

Are there any other options that I could consider? Preferably with some examples that I could follow.
Thanks
Marek