I do think it's a good idea to have a low-level interface to the application that you can use without a browser per se, and that the site should use that interface to do its stuff.
That interface doesn't have to be the API itself, it could be a layer that's lower in level than the API, and that is used by both the API and the production website.
It's generally a bad idea if the API just duplicates the website.
i.e., the following is bad
# hypothetical example of bad duplication
def website_update_blog_post(request):
user = request.username()
ensure_logged_in(user)
post = Posts.objects.upsert(request.post_title, request.post_body)
trigger_notifications(post)
.....
def api_update_blog_post(user, password, title, body):
verify_login(user, password)
post = Posts.objects.upsert(title, body)
trigger_notifications(post)