Andrew, something just occurred to me regarding the validation mode.
If you are running your api calls with the p_validation_mode parameter set to TRUE in each case, it may be that the act of rolling back the previous transaction(s) will cause the last one to fail.
It's better, I think, to create a save point prior to your first API call, then set all your p_validation_mode parameters to false - meaning they aren't rolled back (but then neither are they committed).
Then, after the last API call has completed, establish whether you were doing validate-only, and do a ROLLBACK TO <savepoint name> if so.
I'd probably go further and have that entire 3-api sequence in a single procedure with appropriate error handling as well as the savepoint stuff (in case either the second or third APIs failed for some weird reason) that way, you are able to treat the succession of API calls as a pseudo-API in itself - if you see what I mean! No? OK then!