Ok I DID get this to work by using text/html content type and curl.
For example:
curl -L -i -X PUT ‘AUTH0_APP_URL/api/v2/branding/templates/universal-login’
-H ‘Content-Type: text/html’
-H ‘Authorization: Bearer AUTH_TOKEN’
–data-raw ‘HTML GOES HERE’
There must be some issue with the json parsing here (not surprising since it’s asking you to shove a LOT of html into a json field, but hope this helps someone else because the docs don’t really cover this with a working example.