I’d also like to point these out - if you run the example code for the CreateAsset endpoint and receive a 415 code, add the ...bodyFormData.getHeaders() line:
Axios.post("https://apis.roblox.com/assets/v1/assets", bodyFormData, {
headers: {
...bodyFormData.getHeaders(),
'x-api-key': YOUR_TOKEN_HERE,
}
and if you still receive 400 when everything is filled in properly, console.log the response or err variables and look at the bottom of the response data in the console:

In this case, the entire asset name was moderated, so all I have to do was change it. It appears that in the case of a single word of the name and not the entire thing the asset will still upload and #'s will replace the filtered word.