Blog post: Better Auth 1.6
better-authfreshAge calculation with session creation time instead of update time (#8762)Migration:
session.freshAgenow calculates fromcreatedAt. Setsession: { freshAge: 0 }to disable the check entirely.
resendStrategy option to reuse existing OTP in email-otp plugin (#8560)enable option for HaveIBeenPwned plugin (#8728)sendMagicLink callback (#8571)secret option to OAuth proxy to reduce shared key exposure (#8699)organizationId parameter in team endpoints (#5062)twoFactorPage config option for custom 2FA page routing (#5329)oidc-provider plugin in favor of @better-auth/oauth-provider (#8985)accountId instead of internal id (#8786)skipOriginCheck array handling (#8582)user field through idToken sign-in body for Apple name support (#8417)operationId in admin plugin endpoints (#8570)sendOTP failures instead of silently swallowing them (#8842)cookieCache maxAge to match session.expiresIn (#8648)autoSignIn: false without requireEmailVerification (#8521)accountInfo endpoint to use accountId instead of internal id (#8346)createAdapter and type exports for backwards compatibility (#8461)Response return for HTTP request contexts (#7521)throw: true handling in client session refresh (#8610)generateId: "uuid" over adapter customIdGenerator (#8679)safeJSONParse for pre-parsed objects (#8248)CREATE INDEX (#8538)sessionSignal after requesting email change in email-otp (#8816)/magic-link/verify (#7223)form_post (#8895)storeIdentifier is hashed (#8980)redirect_uri validation for prompt=none in oidc-provider (#8398)listUserInvitations (#8694)twoFactorTable option to schema modelName (#8443)any from collapsing auth.$Infer and client inference types (#8981)updateUser to not overwrite unrelated username fields (#7570)updateUser (#8731)For detailed changes, see CHANGELOG
@better-auth/ssoMigration: Set
sso({ saml: { enableInResponseToValidation: false } })to restore the previous behavior.
node-forge vulnerability via samlify pin (#8838)sub claim correctly (#8276)provisionUser inconsistency and added provisionUserOnEveryLogin option (#8818)internalAdapter (#8353)For detailed changes, see CHANGELOG
@better-auth/mongo-adapterMigration: New documents use native BSON UUIDs. Existing string UUIDs continue to work. No data migration required.
For detailed changes, see CHANGELOG
@better-auth/oauth-providerisLocalhost function (#8286)customIdTokenClaims to override standard claims (#7865)baseURL config handling in init (#8649)oauth_query in client plugin (#8320)customIdTokenClaims to override acr and auth_time (#8633)auth_time timestamps across adapter shapes (#8761)skip_consent (#8632)prompt=none support (#8554)For detailed changes, see CHANGELOG
@better-auth/stripeprorationBehavior per plan (#8525)customerType check (#8609){CHECKOUT_SESSION_ID} placeholder in success callbackURL (#8568)priceId for annual subscriptions in list (#8810)For detailed changes, see CHANGELOG
@better-auth/drizzle-adaptermode: "insensitive") (#8556)IS NULL / IS NOT NULL for null value comparisons (#8660)For detailed changes, see CHANGELOG
@better-auth/exporequire issue (#8253)For detailed changes, see CHANGELOG
@better-auth/prisma-adapterupdateMany fallback for non-unique updates (#8524)deleteMany when deleting by non-unique field (#8314)For detailed changes, see CHANGELOG
authmcp.better-auth.com (#8747)required as true in Drizzle and Prisma generators (#8614)For detailed changes, see CHANGELOG
@better-auth/electronsafeStorage encryption failures gracefully (#8530)For detailed changes, see CHANGELOG
@better-auth/passkeyFor detailed changes, see CHANGELOG
@better-auth/test-utils@better-auth/test-utils/adapter (#8564)using keyword for runtime compatibility (#8756)For detailed changes, see CHANGELOG
@better-auth/api-keyFor detailed changes, see CHANGELOG
@better-auth/coreAPIErrors as span errors in OpenTelemetry traces (#8850)For detailed changes, see CHANGELOG
@better-auth/kysely-adapternumUpdatedOrDeletedRows from D1 dialect (#8798)For detailed changes, see CHANGELOG
@better-auth/telemetryFor detailed changes, see CHANGELOG
Thanks to everyone who contributed to this release:
@aarmful, @bytaesu, @dvanmali, @Eric-Song-Nop, @formatlos, @GautamBytes, @GoPro16, @gustavovalverde, @himself65, @jonathansamines, @jslno, @mrgrauel, @NathanColosimo, @okisdev, @olliethedev, @Oluwatobi-Mustapha, @OscarCornish, @ping-maxwell, @raihanbrillmark, @sicarius97, @Sigmabrogz, @wuzgood98, @xiaoyu2er, @YevheniiKotyrlo
Full changelog: v1.5.6...v1.6.0
Fetched May 1, 2026