Please move the thread to Products to continue (Move link is at the right).
It's not true that you can't set Velocity tokens via the API. What is true is that you can't pass temporary runtime Velocity tokens when calling the Request Campaign or Schedule Campaign methods. You have to change Velocity tokens permanently, i.e. you can set them before calling Request or Schedule.
Also, using preexisting Velocity tokens is not itself an issue. You'll have to provide far more detail about the output you're seeing in an API-sent email vs. that same email in standard batch or trigger mode, and your actual Velocity code.