Following the Auth0 React quickstart with auth0-spa-js, the code exchange failed with 401 Unauthorized from POST /oauth/token, and the Auth0 logs showed Type: Failed exchange, Description: Unauthorized. The same domain and clientId worked in an older auth0-js implementation. The cause was the application type in the Auth0 dashboard: machine-to-machine (and other non-SPA types) cannot perform the SPA authorization-code exchange.