one difference is API invocation will return you the instance id in the calling script whereas the UCA invoker never gets the instance id back.
other is you can directly bind a complex variable to a UCA invocation but you have to create a map of variables to invoke through API.
API invocation Example
var map= new tw.object.Map();
map.put("input1", tw.local.input1);
map.put("input2", tw.local.input2);
.....
map.put("inputn", tw.local.inputn);
var instance = tw.system.startProcessByName("Test API Invocation Process",map);
The above return is of type TWProcessInstance.
tw.local.instanceID = instance.id;
you may need to split this variable to get the actual instance id e.g. from (2072.660) 660 is the actual instance ID.
if any of the input is optional meaning it will not crash the process you need not send it
One common misconception is that through API invocation you can not send complex variables that is not true Complex Variables can be sent as inputs