You don't have to build a dynamically generated interface. Though it could be nice it's not required. If you cannot build a dynamic interface just use the links and you are done. Disadvantage is that you are again hard linked to the backend and will crash if something changes.
Using the dynamic layout can be quite simple btw:
links.forEach(function(link) { switch(link.rel) { case 'deposit': showDepositButton(); break; case 'withdraw': loadWithDrawFormloadWithdrawForm(link.href); showWithDrawButtonshowWithdrawButton(); break; } }); It saves you in your client code like:
if (balance<=0balance <= 0 && negativeBalanceAllowed === false) { showWithDrawButtonshowWithdrawButton(); } You can implement an allowed negative position (by borrowing money for example) without changing your client.