Error handling
The library separates three kinds of failure and is deliberately consistent about which methods throw and which return.
The two error classes
import { AllauthRequestError, AllauthTransportError } from 'react-allauth'AllauthRequestError— the server answered with a well-formed allauth envelope carrying an error status. It exposesstatusand the structurederrorsarray (message,code, andparamfor field errors).AllauthTransportError— no valid envelope was produced: network failure, non-JSON body (HTML error page, gateway timeout), or a malformed payload. It exposesstatuswhen a response was received at all.
Flow methods return the envelope
Methods that advance an authentication flow do not throw on API error statuses — they return the envelope so your form can read the field errors and the flow state:
const response = await login({ email, password })
if (response.errors?.length) {
// e.g. [{ message: "The email address and/or password you specified are not correct.", code: "email_password_mismatch", param: "password" }]
}This applies to login, signup, logout, reauthenticate (useAuth), verify (useEmails), confirmReset (usePassword), authenticate / reauthenticate (useMFA), the WebAuthn ceremonies and authenticateByToken / providerSignup (useSocialAuth). Transport failures still throw AllauthTransportError.
Mutation methods throw
Account-management mutations (useEmails().add/remove/markPrimary, useSessions().revoke, useMFA().activateTOTP/deactivateTOTP, usePassword().change, useSocialAuth().disconnect...) throw AllauthRequestError on failure:
try {
await revoke(session)
} catch (error) {
if (error instanceof AllauthRequestError) {
console.log(error.status, error.errors)
}
}Data hooks expose an error channel
Hooks that fetch data (useConfig, useEmails, useMFA, useSessions, useSocialAuth) never reject from their initial load. They expose the last load failure as state, alongside loading and reload:
const { sessions, loading, error, reload } = useSessions()
if (loading) return <Spinner />
if (error) return <Retry onClick={() => reload()} />The initial session check follows the same rule: a failed check surfaces on useAuth().error with status resolving to unauthenticated, never a permanent loading state.