Using a HTTP Error code doesn’t stop you serving up a custom error page. In fact thats the best way to do it.
People who visit with a web browser will be none the wiser, but anyone that needs to programatically find out what the server responded with can. And if you’re serving up an API error page by returning HTTP status 200, expect people like me to hunt you down and slap you. *Hard.* Because I check the status code to find out if I hit an error in the API or not, as you’re supposed to. Its a standard for a reason.