mirror of
https://github.com/better-auth/better-auth.git
synced 2026-05-22 22:32:01 -05:00
[GH-ISSUE #7034] Cookies not set when using auth.api.signUpEmail() programmatically in NestJS #10708
Closed
opened 2026-04-13 07:00:31 -05:00 by GiteaMirror
·
43 comments
No Branch/Tag Specified
2026-05-22/chore/adopt-agents-md
2026-05-22/refactor/string-case-utils
dependabot/npm_and_yarn/uuid-14.0.0
dependabot/npm_and_yarn/turbo-2.9.14
changeset-release/main
main
2026-05-14/fix/passkey-verify-error-and-claim
dependabot/npm_and_yarn/samlify-2.13.0
dependabot/npm_and_yarn/ws-8.20.1
changeset-release/next
next
ping-maxwell/c-ping-maxwell/fix-error-link-apostrophe-f89a
dependabot/npm_and_yarn/demo/electron/demo-minor-patch-519ef7475f
dependabot/github_actions/github-actions-98f3470200
client-assertions-main
2026-05-15/ci/fix-sqlite-abi-mismatch
2026-05-15/fix/organization-team-add-cascade
2026-05-15/fix/parse-set-cookie-value-validation
2026-05-13/feat/captcha-wildcard-endpoints
2026-05-13/ci/stabilize-docker-startup
fix/i18n-before-hook-translation
fix/disable-migration-generate
2026-05-07/fix/admin-set-password-upsert
2026-05-10/fix/cookie-drain-order
2026-05-10/feat/hooks-finally
2026-05-09/fix/cookie-drain-order
2026-05-09/feat/hooks-finally
2026-05-08/feat/register-before-send
fix/stripe/subscription-data-merge
2026-05-01/chore/pnpm-v11-harden
chore/pnpm-v11
2026-04-29/feat/google-include-granted-scopes
2026-04-29/fix/oauth-account-scope-semantics
2026-04-27/fix/nextcookies-idempotent-writes
2026-04-26/fix/harden-proxy-host-validation
2026-04-26/refactor/stripe-callback-signature-cleanup
2026-04-26/fix/stripe-subscription-callback-timing
2026-04-11/fix/sveltekit-app-modules
feat/open-api-zod-contract
feat/oauth-provider-backchannel-logout-next
feat/oauth-idp-initiated-bounce
refactor/sign-in-challenges
2026-04-21/fix/oauth-rfc-input-validation
fix/release-notes-new-packages
fix/two-factor-identity-guard
fix/resource
feat/emailpassword-authorize
2026-04-12/security/dynamic-baseurl-proxy-trust-default
feat/oauth-provider-at-hash-v2
fix/release-grep-fallback
claude/address-review-comments-JhFLr
claude/slack-update-stripe-docs-consistency-8Sc0w
feat/async-auth
fix/two-factor-totp-verified-enrollment
feat/plugin-ui
codex/blog-1-6-release-post
2026-04-06/fix/type-any-guards
2026-04-05/chore/downgrade-better-call
2026-04-04/ci/skip-vercel-fork-prs
2026-03-28/ci/add-autofix-ci
chore/release-preview-script
himself65/2026/02/19/role
2026-03-24/fix/update-user-info-on-link
2026-03-20/docs/improve-website
2026-03-20/fix/anonymous-onlinkaccount-expo
2026-02-17/fix/anonymous-link-state
fix/8607-saml-inresponseto
fix/8549-scim-patch-noop
v1.4.x
refactor/migration-snapshot-tests
worktree-magic-link-additional-data
chore/migrate-build-to-rollup
worktree-fix-dynamic-baseurl-8447
2026-03-06/chore/public-api-check
fix/close-8156-regression-test
fix/secondary-storage-json-error-handling
himself65/verification-namespace
cursor/issue-8307-validation-79a3
himself65/2026/01/30/error-mdx
v1.4.x-staging
fix/email-otp-user
fix/restrict-full-organization-access-roles
himself65/2026/02/12/count
himself65/2026/02/04/define-plugin
2026-02-04/feat/add-pluralize
cursor/better-auth-js-integration-ec21
cursor/expo-state-mismatch-394c
2026-02-01/fix/org-update-role-sync-members
cursor/issue-7607-investigation-e146
cursor/email-generation-helper-0ff6
himself65/2026/01/21/avoid-spread-operator
himself65/2026/01/14/cli
claude/slack-add-docs-pr-NMvgO
claude/slack-add-advanced-useplural-WHKYL
feat/hooks-pos
feat/2fa-phone
feat/2fa
fix/rotation
fix/username-check
v1.3.x
refactor/organization
feat/multiple-client-ids-social-providers
better-auth@1.6.11
auth@1.6.11
@better-auth/test-utils@1.6.11
@better-auth/telemetry@1.6.11
@better-auth/stripe@1.6.11
@better-auth/sso@1.6.11
@better-auth/scim@1.6.11
@better-auth/api-key@1.6.11
@better-auth/redis-storage@1.6.11
@better-auth/core@1.6.11
@better-auth/oauth-provider@1.6.11
@better-auth/mongo-adapter@1.6.11
@better-auth/memory-adapter@1.6.11
@better-auth/kysely-adapter@1.6.11
@better-auth/i18n@1.6.11
@better-auth/expo@1.6.11
@better-auth/electron@1.6.11
@better-auth/drizzle-adapter@1.6.11
@better-auth/prisma-adapter@1.6.11
@better-auth/passkey@1.6.11
v1.6.11
better-auth@1.7.0-beta.3
auth@1.7.0-beta.3
@better-auth/test-utils@1.7.0-beta.3
@better-auth/telemetry@1.7.0-beta.3
@better-auth/stripe@1.7.0-beta.3
@better-auth/sso@1.7.0-beta.3
@better-auth/scim@1.7.0-beta.3
@better-auth/redis-storage@1.7.0-beta.3
@better-auth/prisma-adapter@1.7.0-beta.3
@better-auth/passkey@1.7.0-beta.3
@better-auth/oauth-provider@1.7.0-beta.3
@better-auth/mongo-adapter@1.7.0-beta.3
@better-auth/memory-adapter@1.7.0-beta.3
@better-auth/kysely-adapter@1.7.0-beta.3
@better-auth/i18n@1.7.0-beta.3
@better-auth/expo@1.7.0-beta.3
@better-auth/electron@1.7.0-beta.3
@better-auth/drizzle-adapter@1.7.0-beta.3
@better-auth/core@1.7.0-beta.3
@better-auth/cimd@1.7.0-beta.3
@better-auth/api-key@1.7.0-beta.3
v1.7.0-beta.3
better-auth@1.6.10
auth@1.6.10
@better-auth/test-utils@1.6.10
@better-auth/telemetry@1.6.10
@better-auth/stripe@1.6.10
@better-auth/sso@1.6.10
@better-auth/scim@1.6.10
@better-auth/redis-storage@1.6.10
@better-auth/prisma-adapter@1.6.10
@better-auth/passkey@1.6.10
@better-auth/oauth-provider@1.6.10
@better-auth/mongo-adapter@1.6.10
@better-auth/memory-adapter@1.6.10
@better-auth/kysely-adapter@1.6.10
@better-auth/i18n@1.6.10
@better-auth/expo@1.6.10
@better-auth/electron@1.6.10
@better-auth/drizzle-adapter@1.6.10
@better-auth/core@1.6.10
@better-auth/api-key@1.6.10
v1.6.10
better-auth@1.6.9
auth@1.6.9
@better-auth/test-utils@1.6.9
@better-auth/telemetry@1.6.9
@better-auth/stripe@1.6.9
@better-auth/sso@1.6.9
@better-auth/scim@1.6.9
@better-auth/redis-storage@1.6.9
@better-auth/prisma-adapter@1.6.9
@better-auth/passkey@1.6.9
@better-auth/oauth-provider@1.6.9
@better-auth/mongo-adapter@1.6.9
@better-auth/memory-adapter@1.6.9
@better-auth/kysely-adapter@1.6.9
@better-auth/i18n@1.6.9
@better-auth/expo@1.6.9
@better-auth/electron@1.6.9
@better-auth/drizzle-adapter@1.6.9
@better-auth/core@1.6.9
@better-auth/api-key@1.6.9
v1.6.9
better-auth@1.6.8
auth@1.6.8
@better-auth/test-utils@1.6.8
@better-auth/telemetry@1.6.8
@better-auth/stripe@1.6.8
@better-auth/sso@1.6.8
@better-auth/scim@1.6.8
@better-auth/redis-storage@1.6.8
@better-auth/prisma-adapter@1.6.8
@better-auth/passkey@1.6.8
@better-auth/oauth-provider@1.6.8
@better-auth/mongo-adapter@1.6.8
@better-auth/memory-adapter@1.6.8
@better-auth/kysely-adapter@1.6.8
@better-auth/i18n@1.6.8
@better-auth/expo@1.6.8
@better-auth/electron@1.6.8
@better-auth/drizzle-adapter@1.6.8
@better-auth/core@1.6.8
@better-auth/api-key@1.6.8
v1.6.8
@better-auth/api-key@1.7.0-beta.2
better-auth@1.7.0-beta.2
auth@1.7.0-beta.2
@better-auth/test-utils@1.7.0-beta.2
@better-auth/telemetry@1.7.0-beta.2
@better-auth/stripe@1.7.0-beta.2
@better-auth/sso@1.7.0-beta.2
@better-auth/scim@1.7.0-beta.2
@better-auth/redis-storage@1.7.0-beta.2
@better-auth/prisma-adapter@1.7.0-beta.2
@better-auth/passkey@1.7.0-beta.2
@better-auth/oauth-provider@1.7.0-beta.2
@better-auth/mongo-adapter@1.7.0-beta.2
@better-auth/memory-adapter@1.7.0-beta.2
@better-auth/kysely-adapter@1.7.0-beta.2
@better-auth/i18n@1.7.0-beta.2
@better-auth/expo@1.7.0-beta.2
@better-auth/electron@1.7.0-beta.2
@better-auth/drizzle-adapter@1.7.0-beta.2
@better-auth/core@1.7.0-beta.2
@better-auth/cimd@1.7.0-beta.2
v1.7.0-beta.2
better-auth@1.6.7
auth@1.6.7
@better-auth/test-utils@1.6.7
@better-auth/telemetry@1.6.7
@better-auth/stripe@1.6.7
@better-auth/sso@1.6.7
@better-auth/scim@1.6.7
@better-auth/redis-storage@1.6.7
@better-auth/prisma-adapter@1.6.7
@better-auth/passkey@1.6.7
@better-auth/oauth-provider@1.6.7
@better-auth/mongo-adapter@1.6.7
@better-auth/memory-adapter@1.6.7
@better-auth/kysely-adapter@1.6.7
@better-auth/i18n@1.6.7
@better-auth/expo@1.6.7
@better-auth/electron@1.6.7
@better-auth/drizzle-adapter@1.6.7
@better-auth/core@1.6.7
@better-auth/api-key@1.6.7
v1.6.7
better-auth@1.6.6
auth@1.6.6
@better-auth/test-utils@1.6.6
@better-auth/telemetry@1.6.6
@better-auth/stripe@1.6.6
@better-auth/sso@1.6.6
@better-auth/scim@1.6.6
@better-auth/redis-storage@1.6.6
@better-auth/prisma-adapter@1.6.6
@better-auth/passkey@1.6.6
@better-auth/oauth-provider@1.6.6
@better-auth/mongo-adapter@1.6.6
@better-auth/memory-adapter@1.6.6
@better-auth/kysely-adapter@1.6.6
@better-auth/i18n@1.6.6
@better-auth/expo@1.6.6
@better-auth/electron@1.6.6
@better-auth/drizzle-adapter@1.6.6
@better-auth/core@1.6.6
@better-auth/api-key@1.6.6
v1.6.6
better-auth@1.6.5
auth@1.6.5
@better-auth/test-utils@1.6.5
@better-auth/telemetry@1.6.5
@better-auth/stripe@1.6.5
@better-auth/sso@1.6.5
@better-auth/scim@1.6.5
@better-auth/redis-storage@1.6.5
@better-auth/prisma-adapter@1.6.5
@better-auth/passkey@1.6.5
@better-auth/oauth-provider@1.6.5
@better-auth/mongo-adapter@1.6.5
@better-auth/memory-adapter@1.6.5
@better-auth/kysely-adapter@1.6.5
@better-auth/i18n@1.6.5
@better-auth/expo@1.6.5
@better-auth/electron@1.6.5
@better-auth/drizzle-adapter@1.6.5
@better-auth/core@1.6.5
@better-auth/api-key@1.6.5
v1.6.5
@better-auth/api-key@1.6.4
better-auth@1.6.4
auth@1.6.4
@better-auth/test-utils@1.6.4
@better-auth/telemetry@1.6.4
@better-auth/stripe@1.6.4
@better-auth/sso@1.6.4
@better-auth/scim@1.6.4
@better-auth/redis-storage@1.6.4
@better-auth/prisma-adapter@1.6.4
@better-auth/passkey@1.6.4
@better-auth/oauth-provider@1.6.4
@better-auth/mongo-adapter@1.6.4
@better-auth/memory-adapter@1.6.4
@better-auth/kysely-adapter@1.6.4
@better-auth/i18n@1.6.4
@better-auth/expo@1.6.4
@better-auth/electron@1.6.4
@better-auth/drizzle-adapter@1.6.4
@better-auth/core@1.6.4
v1.6.4
@better-auth/cimd@1.7.0-beta.1
v1.7.0-beta.1
@better-auth/api-key@1.6.3
better-auth@1.6.3
auth@1.6.3
@better-auth/test-utils@1.6.3
@better-auth/telemetry@1.6.3
@better-auth/stripe@1.6.3
@better-auth/sso@1.6.3
@better-auth/scim@1.6.3
@better-auth/redis-storage@1.6.3
@better-auth/prisma-adapter@1.6.3
@better-auth/passkey@1.6.3
@better-auth/oauth-provider@1.6.3
@better-auth/mongo-adapter@1.6.3
@better-auth/memory-adapter@1.6.3
@better-auth/kysely-adapter@1.6.3
@better-auth/i18n@1.6.3
@better-auth/expo@1.6.3
@better-auth/electron@1.6.3
@better-auth/drizzle-adapter@1.6.3
@better-auth/core@1.6.3
v1.6.3
@better-auth/api-key@1.7.0-beta.0
better-auth@1.7.0-beta.0
auth@1.7.0-beta.0
@better-auth/test-utils@1.7.0-beta.0
@better-auth/telemetry@1.7.0-beta.0
@better-auth/stripe@1.7.0-beta.0
@better-auth/sso@1.7.0-beta.0
@better-auth/scim@1.7.0-beta.0
@better-auth/redis-storage@1.7.0-beta.0
@better-auth/prisma-adapter@1.7.0-beta.0
@better-auth/passkey@1.7.0-beta.0
@better-auth/oauth-provider@1.7.0-beta.0
@better-auth/mongo-adapter@1.7.0-beta.0
@better-auth/memory-adapter@1.7.0-beta.0
@better-auth/kysely-adapter@1.7.0-beta.0
@better-auth/i18n@1.7.0-beta.0
@better-auth/expo@1.7.0-beta.0
@better-auth/electron@1.7.0-beta.0
@better-auth/drizzle-adapter@1.7.0-beta.0
@better-auth/core@1.7.0-beta.0
v1.7.0-beta.0
better-auth@1.6.2
auth@1.6.2
@better-auth/test-utils@1.6.2
@better-auth/telemetry@1.6.2
@better-auth/stripe@1.6.2
@better-auth/sso@1.6.2
@better-auth/scim@1.6.2
@better-auth/redis-storage@1.6.2
@better-auth/prisma-adapter@1.6.2
@better-auth/passkey@1.6.2
@better-auth/oauth-provider@1.6.2
@better-auth/mongo-adapter@1.6.2
@better-auth/memory-adapter@1.6.2
@better-auth/kysely-adapter@1.6.2
@better-auth/i18n@1.6.2
@better-auth/expo@1.6.2
@better-auth/electron@1.6.2
@better-auth/drizzle-adapter@1.6.2
@better-auth/core@1.6.2
@better-auth/api-key@1.6.2
v1.6.2
better-auth@1.6.1
auth@1.6.1
@better-auth/test-utils@1.6.1
@better-auth/telemetry@1.6.1
@better-auth/stripe@1.6.1
@better-auth/sso@1.6.1
@better-auth/scim@1.6.1
@better-auth/redis-storage@1.6.1
@better-auth/prisma-adapter@1.6.1
@better-auth/passkey@1.6.1
@better-auth/oauth-provider@1.6.1
@better-auth/mongo-adapter@1.6.1
@better-auth/memory-adapter@1.6.1
@better-auth/kysely-adapter@1.6.1
@better-auth/i18n@1.6.1
@better-auth/expo@1.6.1
@better-auth/electron@1.6.1
@better-auth/drizzle-adapter@1.6.1
@better-auth/core@1.6.1
@better-auth/api-key@1.6.1
v1.6.1
better-auth@1.6.0
auth@1.6.0
@better-auth/test-utils@1.6.0
@better-auth/telemetry@1.6.0
@better-auth/stripe@1.6.0
@better-auth/sso@1.6.0
@better-auth/scim@1.6.0
@better-auth/redis-storage@1.6.0
@better-auth/prisma-adapter@1.6.0
@better-auth/passkey@1.6.0
@better-auth/oauth-provider@1.6.0
@better-auth/mongo-adapter@1.6.0
@better-auth/memory-adapter@1.6.0
@better-auth/kysely-adapter@1.6.0
@better-auth/i18n@1.6.0
@better-auth/expo@1.6.0
@better-auth/electron@1.6.0
@better-auth/drizzle-adapter@1.6.0
@better-auth/core@1.6.0
@better-auth/api-key@1.6.0
v1.6.0
v1.5.7-beta.1
v1.5.1-beta.4
v1.5.6
v1.4.22
v1.5.5
v1.5.4
v1.5.3
v1.5.2
v1.5.1-beta.3
v1.5.1-beta.2
v1.5.1
v1.4.21
v1.5.1-beta.1
v1.5.0
v1.4.20
v1.5.0-beta.20
v1.5.0-beta.19
v1.5.0-beta.18
v1.4.19
v1.5.0-beta.17
v1.5.0-beta.16
v1.5.0-beta.15
v1.5.0-beta.14
v1.5.0-beta.13
v1.5.0-beta.12
v1.5.0-beta.11
v1.4.18
v1.5.0-beta.10
v1.5.0-beta.9
v1.4.17
v1.4.16
v1.4.15
v1.5.0-beta.8
v1.4.14
v1.4.13
v1.5.0-beta.7
v1.4.12
v1.4.12-beta.2
v1.5.0-beta.6
v1.4.12-beta.1
v1.5.0-beta.5
v1.4.11
v1.5.0-beta.4
v1.4.11-beta.2
v1.5.0-beta.3
v1.4.11-beta.1
v1.4.10
v1.5.0-beta.2
v1.4.10-beta.1
v1.4.9-beta.1
v1.5.0-beta.1
v1.4.9
v1.4.8
v1.4.8-beta.7
v1.4.8-beta.6
v1.4.8-beta.5
v1.4.8-beta.4
v1.4.8-beta.3
v1.4.8-beta.2
v1.4.8-beta.1
v1.4.7
v1.4.7-beta.4
v1.4.7-beta.3
v1.4.7-beta.2
v1.4.6-beta.5
v1.4.7-beta.1
v1.4.6
v1.4.6-beta.4
v1.4.6-beta.3
v1.4.5
v1.4.6-beta.2
v1.4.6-beta.1
v1.4.5-beta.2
v1.4.5-beta.1
v1.4.4-beta.3
v1.4.4
v1.4.4-beta.2
v1.4.4-beta.1
v1.4.3
v1.4.2
v1.4.2-beta.5
v1.4.2-beta.4
v1.4.2-beta.3
v1.4.2-beta.2
v1.4.2-beta.1
v1.4.1
v1.4.1-beta.1
v1.4.0
v1.4.0-beta.28
v1.4.0-beta.27
v1.4.0-beta.26
v1.4.0-beta.25
v1.4.0-beta.24
v1.4.0-beta.23
v1.4.0-beta.22
v1.4.0-beta.21
v1.4.0-beta.20
v1.4.0-beta.19
v1.4.0-beta.18
v1.4.0-beta.17
v1.4.0-beta.16
v1.4.0-beta.15
v1.3.34
v1.3.33
v1.4.0-beta.14
v1.3.32
v1.3.31
v1.3.30
v1.4.0-beta.13
v1.3.29
v1.4.0-beta.12
v1.3.28
v1.4.0-beta.11
v1.4.0-beta.10
v1.4.0-beta.9
v1.4.0-beta.8
v1.3.27
v1.4.0-beta.7
v1.3.26
v1.3.25
v1.3.24
v1.4.0-beta.6
v1.3.23
v1.3.22
v1.3.21
v1.3.20
v1.3.19
v1.4.0-beta.5
v1.3.18
v1.4.0-beta.4
v1.3.17
v1.4.0-beta.3
v1.3.16
v1.3.15
v1.3.14
v1.4.0-beta.2
v1.3.13
v1.4.0-beta.1
v1.3.12
v1.3.11-beta.2
v1.3.11
v1.3.11-beta.1
v1.3.10
v1.3.10-beta.7
v1.3.10-beta.6
v1.3.10-beta.5
v1.3.10-beta.4
v1.3.10-beta.3
v1.3.10-beta.2
v1.3.10-beta.1
v1.3.9
v1.3.9-beta.4
v1.3.9-beta.3
v1.3.9-beta.2
v1.3.9-beta.1
v1.3.8
v1.3.8-beta.11
v1.3.8-beta.10
v1.3.8-beta.9
v1.3.8-beta.8
v1.3.8-beta.7
v1.3.8-beta.6
v1.3.8-beta.5
v1.3.8-beta.4
v1.3.8-beta.3
v1.3.8-beta.2
v1.3.8-beta.1
v1.3.7
v1.3.7-beta.4
v1.3.7-beta.3
v1.3.7-beta.2
v1.3.7-beta.1
v1.3.6
v1.3.6-beta.2
v1.3.6-beta.1
v1.3.5
v1.3.5-beta.7
v1.3.5-beta.6
v1.3.5-beta.5
v1.3.5-beta.4
v1.3.5-beta.3
v1.3.5-beta.2
v1.3.5-beta.1
better-auth@1.3.4
@better-auth/stripe@1.3.4
@better-auth/sso@1.3.4
@better-auth/expo@1.3.4
@better-auth/cli@1.3.4
v1.3.4-beta.3
v1.3.4-beta.2
v1.3.4-beta.1
v1.3.3
v1.3.2
v1.3.1
v1.3.1-beta.1
v1.3.0
v1.3.0-beta.11
v1.3.0-beta.10
v1.3.0-beta.9
v1.3.0-beta.8
v1.3.0-beta.7
v1.3.0-beta.6
v1.3.0-beta.5
v1.3.0-beta.4
v1.2.12
v1.3.0-beta.3
v1.3.0-beta.2
v1.3.0-beta.1
v1.2.11
v1.2.10
v1.2.10-pkce-fix.3
v1.2.10-beta.1
v1.2.9
v1.2.9-beta.10
v1.2.9-beta.9
feat/2867-oidcprovider-trusted
v1.2.9-beta.8
v1.2.9-beta.7
v1.2.9-beta.6
v1.2.9-beta.5
v1.2.9-beta.4
v1.2.9-beta.3
v1.2.9-beta.2
v1.2.9-beta.1
v1.2.8
v1.2.8-beta.8
v1.2.8-beta.7
v1.2.8-beta.6
v1.2.8-beta.5
v1.2.8-beta.4
v1.2.8-beta.3
v1.2.8-beta.2
v1.2.8-beta.1
v1.2.7
v1.2.7-beta.1
v1.2.6
v1.2.6-beta.13
v1.2.6-beta.12
v1.2.6-beta.11
v1.2.6-beta.10
v1.2.6-beta.9
v1.2.6-beta.8
v1.2.6-beta.7
v1.2.6-beta.6
v1.2.6-beta.5
v1.2.6-beta.4
v1.2.6-beta.3
v1.2.6-beta.2
v1.2.6-beta.1
v1.2.5
v1.2.5-beta.10
v1.2.5-beta.9
v1.2.5-beta.8
v1.2.5-beta.7
v1.2.5-beta.6
v1.2.5-beta.5
v1.2.5-beta.4
v1.2.5-beta.3
v1.2.5-beta.2
v1.2.5-beta.1
v1.2.4
v1.2.4-beta.12
v1.2.4-beta.11
v1.2.4-beta.10
v1.2.4-beta.9
v1.2.4-beta.8
v1.2.4-beta.7
v1.2.4-beta.6
v1.2.4-beta.5
v1.2.4-beta.4
v1.2.4-beta.3
v1.2.4-beta.2
v1.2.4-beta.1
v1.2.3
v1.2.3-beta.3
v1.2.3-beta.2
v1.2.3-beta.1
v1.2.2
v1.2.2-beta.6
v1.2.2-beta.5
v1.2.2-beta.4
v1.2.2-beta.3
v1.2.2-beta.2
v1.2.2-beta.1
v1.2.1
v1.2.1-beta.8
v1.2.1-beta.7
v1.2.1-beta.6
v1.2.1-beta.5
v1.2.1-beta.4
v1.2.1-beta.3
v1.2.1-beta.2
v1.2.1-beta.1
v1.2.0
v1.2.0-beta.19
v1.2.0-beta.18
v1.2.0-beta.17
v1.1.22-beta.2
v1.1.22-beta.1
v1.2.0-beta.16
v1.1.21
v1.1.21-beta.1
v1.2.0-beta.15
v1.1.20
v1.1.20-beta.5
v1.1.20-beta.4
v1.2.0-beta.14
v1.2.0-beta.13
v1.1.20-beta.3
v1.1.20-beta.2
v1.2.0-beta.12
v1.1.20-beta.1
v1.2.0-beta.11
v1.1.19
v1.1.19-beta.3
v1.2.0-beta.10
v1.2.0-beta.9
v1.2.0-beta.8
v1.2.0-beta.7
v1.1.19-beta.2
v1.1.19-beta.1
v1.1.18
v1.2.0-beta.6
v1.2.0-beta.5
v1.1.18-beta.3
v1.1.18-beta.2
v1.1.18-beta.1
v1.2.0-beta.4
v1.2.0-beta.3
v1.2.0-beta.2
v1.1.17
v1.2.0-beta.1
v1.1.17-beta.5
v1.1.17-beta.4
v1.1.17-beta.3
v1.1.17-beta.2
v1.1.17-beta.1
v1.1.16
v1.1.16-beta.10
v1.1.16-beta.9
v1.1.16-beta.8
v1.1.16-beta.7
v1.1.16-beta.6
v1.1.16-beta.5
v1.1.16-beta.4
v1.1.16-beta.3
v1.1.16-beta.2
v1.1.16-beta.1
v1.1.15
v1.1.15-beta.7
v1.1.15-beta.6
v1.1.15-beta.5
v1.1.15-beta.4
v1.1.15-beta.3
v1.1.15-beta.2
v1.1.15-beta.1
v1.1.14
v1.1.14-beta.6
v1.1.14-beta.5
v1.1.14-beta.4
v1.1.14-beta.3
v1.1.14-beta.2
v1.1.14-beta.1
v1.1.13
v1.1.13-beta.3
v1.1.13-beta.2
v1.1.13-beta.1
v1.1.12
v1.1.12-beta.4
v1.1.12-beta.3
v1.1.12-beta.2
v1.1.12-beta.1
v1.1.11
v1.1.11-beta.1
v1.1.10
v1.1.10-beta.2
v1.1.10-beta.1
v1.1.9
v1.1.9-beta.1
v1.1.8
v1.1.8-beta.3
v1.1.8-beta.2
v1.1.8-beta.1
v1.1.7
v1.1.7-beta.5
v1.1.7-beta.4
v1.1.7-beta.3
v1.1.7-beta.2
v1.1.7-beta.1
v1.1.6
v1.1.5
v1.1.4
v1.1.4-beta.2
v1.1.4-beta.1
v1.1.3
v1.1.3-beta.9
v1.1.3-beta.8
v1.1.3-beta.7
v1.1.3-beta.6
v1.1.3-beta.4
v1.1.3-beta.2
v1.1.3-beta.1
v1.1.2
v1.1.2-beta.4
v1.1.2-beta.3
v1.1.2-beta.2
v1.1.2-beta.1
v1.1.1
v1.1.0
v1.0.23-beta.6
v1.0.23-beta.5
v1.0.23-beta.4
v1.0.23-beta.3
v1.0.23-beta.2
v1.0.23-beta.1
v1.0.22
v1.0.22-beta.4
v1.0.22-beta.3
v1.0.22-beta.2
v1.0.22-beta.1
v1.0.21
v1.0.20
v1.0.19
v1.0.18
v1.0.17
v1.0.16
v1.0.16-beta.2
v1.0.16-beta.1
v1.0.15
v1.0.15-beta.1
v1.0.14
v1.0.13
v1.0.12
v1.0.12-beta.3
v1.0.12-beta.2
v1.0.12-beta.1
v1.0.11
v1.0.11-beta.8
v1.0.11-beta.7
v1.0.11-beta.6
v1.0.11-beta.5
v1.0.11-beta.4
v1.0.11-beta.3
v1.0.11-beta.2
v1.0.11-beta.1
v1.0.10
v1.0.10-beta.3
v1.0.10-beta.2
v1.0.10-beta.1
v1.0.9
v1.0.9-beta.7
v1.0.9-beta.6
v1.0.9-beta.5
v1.0.9-beta.4
v1.0.9-beta.3
v1.0.9-beta.2
v1.0.9-beta.1
v1.0.8
v1.0.8-beta.4
v1.0.8-beta.3
v1.0.8-beta.2
v1.0.8-beta.1
v1.0.7
v1.0.6
v1.0.5
v1.0.4
v1.0.3
v1.0.2
v1.0.1
v1.0.0
v1.0.0-canary.14
v1.0.0-canary.13
v1.0.0-canary.12
v1.0.0-canary.11
v1.0.0-canary.10
v1.0.0-canary.9
v1.0.0-canary.8
v1.0.0-canary.7
v1.0.0-canary.6
v0.8.9-beta.2
v0.8.9-beta.1
v1.0.0-canary.5
v1.0.0-canary.4
v1.0.0-canary.3
v1.0.0-canary.2
v1.0.0-canary.1
v0.8.8
v0.8.8-beta.2
v0.8.8-beta.1
v0.9.0-canary.1
v0.8.7
v0.8.7-canary.2
v0.8.7-canary.1
v0.8.7-beta.5
v0.8.7-beta.4
v0.8.7-beta.3
v0.8.7-beta.2
v0.8.7-beta.1
v0.8.6
v0.8.6-beta.6
v0.8.6-beta.5
v0.8.6-beta.4
v0.8.6-beta.3
v0.8.6-beta.2
v0.8.6-beta.1
v0.8.5
v0.8.5-beta.3
v0.8.5-beta.2
v0.8.5-beta.1
v0.8.4
v0.8.4-beta.7
v0.8.4-beta.6
v0.8.4-beta.5
v0.8.4-beta.4
v0.8.4-beta.2
v0.8.4-beta.1
v0.8.3
v0.8.3-beta.7
v0.8.3-beta.6
v0.8.3-beta.5
v0.8.3-beta.4
v0.8.3-beta.3
v0.8.3-beta.2
v0.8.3-beta.1
v0.8.2
v0.8.2-beta.3
v0.8.2-beta.2
v0.8.2-beta.1
v0.8.1
v0.8.1-beta.5
v0.8.1-beta.4
v0.8.1-beta.3
v0.8.1-beta.2
v0.8.1-beta.1
v0.8.0
v0.7.6-beta.4
v0.7.6-beta.3
v0.7.6-beta.2
v0.7.6-beta.1
v0.7.5
v0.7.5-beta.9
v0.7.5-beta.8
v0.7.5-beta.7
v0.7.5-beta.6
v0.7.5-beta.5
v0.7.5-beta.4
v0.7.5-beta.3
v0.7.5-beta.2
v0.7.5-beta.1
v0.7.4
v0.7.4-beta.1
v0.7.3
v0.7.3-beta.11
v0.7.3-beta.10
v0.7.3-beta.9
v0.7.3-beta.8
v0.7.3-beta.7
v0.7.3-beta.6
v0.7.3-beta.5
v0.7.3-beta.4
v0.7.3-beta.3
v0.7.3-beta.2
v0.7.3-beta.1
v0.7.2
v0.7.2-beta.5
v0.7.2-beta.4
v0.7.2-beta.3
v0.7.2-beta.2
v0.7.2-beta.1
v0.7.1
v0.7.1-beta.6
v0.7.1-beta.5
v0.7.1-beta.4
v0.7.1-beta.3
v0.7.1-beta.2
v0.7.1-beta.1
v0.7.0
v0.7.0-beta.1
v0.6.3-beta.5
v0.6.3-beta.4
v0.6.3-beta.3
v0.6.3-beta.2
v0.6.3-beta.1
v0.6.2
v0.6.2-beta.8
v0.6.2-beta.7
v0.6.2-beta.6
v0.6.2-beta.5
v0.6.2-beta.4
v0.6.2-beta.3
v0.6.2-beta.2
v0.6.2-beta.1
v0.6.1
v0.6.1-beta.9
v0.6.1-beta.8
v0.6.1-beta.7
v0.6.1-beta.6
v0.6.1-beta.5
v0.6.1-beta.4
v0.6.1-beta.3
v0.6.1-beta.2
v0.6.1-beta.1
v0.6.0
v0.6.0-beta.1
v0.5.4-beta.9
v0.5.4-beta.8
v0.5.4-beta.7
v0.5.4-beta.6
v0.5.4-beta.5
v0.5.4-beta.4
v0.5.4-beta.3
v0.5.4-beta.2
v0.5.4-beta.1
v0.5.3
v0.5.3-beta.17
v0.5.3-beta.16
v0.5.3-beta.15
v0.5.3-beta.14
v0.5.3-beta.13
v0.5.3-beta.12
v0.5.3-beta.11
v0.5.3-beta.10
v0.5.3-beta.9
v0.5.3-beta.8
v0.5.3-beta.7
v0.5.3-beta.6
v0.5.3-beta.5
v0.5.3-beta.4
v0.5.3-beta.3
v0.5.3-beta.2
v0.5.3-beta.1
v0.5.2
v0.5.2-beta.21
v0.5.2-beta.20
v0.5.2-beta.19
v0.5.2-beta.18
v0.5.2-beta.17
v0.5.2-beta.16
v0.5.2-beta.15
v0.5.2-beta.14
v0.5.2-beta.13
v0.5.2-beta.12
v0.5.2-beta.11
v0.5.2-beta.10
v0.5.2-beta.9
v0.5.2-beta.8
v0.5.2-beta.7
v0.5.2-beta.6
v0.5.2-beta.5
v0.5.2-beta.4
v0.5.2-beta.3
v0.5.2-beta.2
v0.5.2-beta.1
v0.5.1
v0.5.1-beta.7
v0.5.1-beta.6
v0.5.1-beta.5
v0.5.1-beta.4
v0.5.1-beta.3
v0.5.1-beta.2
v0.5.1-beta.1
v0.5.0
v0.4.14-beta.2
v0.4.14-beta.1
v0.4.13
v0.4.12
v0.4.12-beta.7
v0.4.12-beta.6
v0.4.12-beta.5
v0.4.12-beta.4
v0.4.12-beta.3
v0.4.12-beta.2
v0.4.12-beta.1
v0.4.11
v0.4.11-beta.3
v0.4.11-beta.2
v0.4.11-beta.1
v0.4.10-beta.10
v0.4.10-beta.9
v0.4.10
v0.4.10-beta.8
v0.4.10-beta.7
v0.4.10-beta.6
v0.4.10-beta.5
v0.4.10-beta.4
v0.4.10-beta.3
v0.4.10-beta.2
v0.4.10-beta.1
v0.4.9
v0.4.9-beta.14
v0.4.9-beta.13
v0.4.9-beta.12
v0.4.9-beta.11
v0.4.9-beta.10
v0.4.9-beta.9
v0.4.9-beta.8
v0.4.9-beta.7
v0.4.9-beta.6
v0.4.9-beta.5
v0.4.9-beta.4
v0.4.9-beta.3
v0.4.9-beta.2
v0.4.9-beta.1
v0.4.8
v0.4.7
v0.4.7-beta.2
v0.4.7-beta.1
v0.4.6
v0.4.5
v0.4.4
v0.4.4-beta.1
v0.4.3
v0.4.3-beta.1
v0.4.2
v0.4.2-beta.1
v0.4.1
v0.4.0
v0.3.6
v0.3.5
v0.3.5-beta.8
v0.3.5-beta.7
v0.3.5-beta.6
v0.3.5-beta.5
v0.3.5-beta.4
v0.3.5-beta.3
v0.3.5-beta.2
v0.3.5-beta.1
v0.3.4
v0.3.4-beta.6
v0.3.4-beta.5
v0.3.4-beta.4
v0.3.4-beta.3
v0.3.4-beta.2
v0.3.4-beta.1
v0.3.3
v0.3.3-beta.12
v0.3.3-beta.11
v0.3.3-beta.10
v0.3.3-beta.9
v0.3.3-beta.8
v0.3.3-beta.7
v0.3.3-beta.6
v0.3.3-beta.5
v0.3.3-beta.4
v0.3.3-beta.3
v0.3.3-beta.2
v0.3.3-beta.1
v0.3.2
v0.3.1
v0.3.0
v0.2.11
v0.2.10
v0.2.9
v0.2.9-beta.10
v0.2.9-beta.9
v0.2.9-beta.8
v0.2.9-beta.7
v0.2.9-beta.6
v0.2.9-beta.5
v0.2.9-beta.4
v0.2.9-beta.3
v0.2.9-beta.2
v0.2.9-beta.1
v0.2.8
v0.2.8-beta.13
v0.2.8-beta.12
v0.2.8-beta.11
v0.2.8-beta.10
v0.2.8-beta.9
v0.2.8-beta.8
v0.2.8-beta.7
v0.2.8-beta.6
v0.2.8-beta.5
v0.2.8-beta.4
v0.2.8-beta.3
v0.2.8-beta.2
v0.2.8-beta.1
v0.2.7
v0.2.6
v0.2.6-beta.10
v0.2.6-beta.9
v0.2.6-beta.8
v0.2.6-beta.7
v0.2.6-beta.6
v0.2.6-beta.5
v0.2.6-beta.4
v0.2.6-beta.3
v0.2.6-beta.2
v0.2.6-beta.1
v0.2.5
v0.2.5-beta.5
v0.2.5-beta.4
v0.2.5-beta.3
v0.2.5-beta.2
v0.2.5-beta.1
v0.2.4
v0.2.3
v0.2.3-beta.14
v0.2.3-beta.13
v0.2.3-beta.12
v0.2.3-beta.11
v0.2.3-beta.10
v0.2.3-beta.9
v0.2.3-beta.8
v0.2.3-beta.7
v0.2.3-beta.6
v0.2.3-beta.5
v0.2.3-beta.4
v0.2.3-beta.3
v0.2.3-beta.2
v0.2.3-beta.1
v0.2.2
v0.2.1
v0.2.1-beta.1
v0.2.0
v0.1.1-beta.6
v0.1.1-beta.5
v0.1.1-beta.4
v0.1.1-beta.3
v0.1.1-beta.2
v0.1.1-beta.1
v0.1.0
v0.0.10-beta.27
v0.0.10-beta.26
v0.0.10-beta.25
v0.0.10-beta.24
v0.0.10-beta.23
v0.0.10-beta.22
v0.0.10-beta.21
v0.0.10-beta.20
v0.0.10-beta.19
v0.0.10-beta.18
v0.0.10-beta.17
v0.0.10-beta.16
v0.0.10-beta.15
v0.0.10-beta.14
v0.0.10-beta.13
v0.0.10-beta.12
v0.0.10-beta.11
v0.0.10-beta.10
v0.0.10-beta.9
v0.0.10-beta.8
v0.0.10-beta.7
v0.0.10-beta.6
v0.0.10-beta.5
v0.0.10-beta.4
v0.0.10-beta.3
v0.0.10-beta.2
v0.0.10-beta.1
v0.0.9
v0.0.9-beta.38
v0.0.9-beta.37
v0.0.9-beta.36
v0.0.9-beta.35
v0.0.9-beta.34
v0.0.9-beta.33
v0.0.9-beta.32
v0.0.9-beta.31
v0.0.9-beta.30
v0.0.9-beta.29
v0.0.9-beta.28
v0.0.9-beta.27
v0.0.9-beta.26
v0.0.9-beta.25
v0.0.9-beta.24
v0.0.9-beta.23
v0.0.9-beta.22
v0.0.9-beta.21
v0.0.9-beta.20
v0.0.9-beta.19
v0.0.9-beta.18
v0.0.9-beta.17
v0.0.9-beta.16
v0.0.9-beta.15
v0.0.9-beta.14
v0.0.9-beta.13
v0.0.9-beta.12
v0.0.9-beta.11
v0.0.9-beta.10
v0.0.9-beta.9
v0.0.9-beta.8
v0.0.9-beta.7
v0.0.9-beta.6
v0.0.9-beta.5
v0.0.9-beta.4
v0.0.9-beta.3
v0.0.9-beta.2
v0.0.9-beta.1
v0.0.8
v0.0.8-beta.29
v0.0.8-beta.28
v0.0.8-beta.27
v0.0.8-beta.26
v0.0.8-beta.25
v0.0.8-beta.24
v0.0.8-beta.23
v0.0.8-beta.22
v0.0.8-beta.21
v0.0.8-beta.20
v0.0.8-beta.19
v0.0.8-beta.18
v0.0.8-beta.17
v0.0.8-beta.16
v0.0.8-beta.15
v0.0.8-beta.14
v0.0.8-beta.13
v0.0.8-beta.12
v0.0.8-beta.11
v0.0.8-beta.10
v0.0.8-beta.9
v0.0.8-beta.8
v0.0.8-beta.7
v0.0.8-beta.6
v0.0.8-beta.5
v0.0.8-beta.4
v0.0.8-beta.3
v0.0.8-beta.2
v0.0.8-beta.1
v0.0.7
v0.0.6
v0.0.5
v0.0.4
v0.0.3
v0.0.2
v0.0.2-beta.8
v0.0.2-beta.7
v0.0.2-beta.6
v0.0.2-beta.5
v0.0.2-beta.4
v0.0.2-beta.3
v0.0.2-beta.2
v0.0.2-beta.1
Labels
Clear labels
adapter
astro
awaiting external contributor
blocked
breaking
breaking change
bug
c-devops
core
credentials
database
dependencies
devops
devtools
docs
documentation
duplicate
elysia
enhancement
enterprise
expo
express
fastify
good first issue
help wanted
hono
identity
infra
integration
invalid
javascript
locked
maintenance
need-more-information
needs: info
needs: repro
nextjs
nuxt
oauth
organization
P0
payments
perf
platform
plugin
pull-request
question
ready
regression
remix
security
social-provider
solid
stale
svelte
tanstack-start
tracking
version-bump
vue
wontfix
Mirrored from GitHub Pull Request
No Label
locked
Milestone
No items
No Milestone
Projects
Clear projects
No project
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: github-starred/better-auth#10708
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @iamibadd on GitHub (Dec 28, 2025).
Original GitHub issue: https://github.com/better-auth/better-auth/issues/7034
Is this suited for github?
To Reproduce
When I register the auth routes via
BetterAuthModule.forRoot()and call the HTTP endpoint/auth/sign-in/email, cookies are correctly set in the response.However, when I call the auth API programmatically using
auth.api.signUpEmail(...), no cookies are set in the response—even when I passreturnHeaders: trueandasResponse: true.Current vs. Expected behavior
I expect the response to include the same Set-Cookie headers that are sent when hitting the HTTP endpoint directly.
What version of Better Auth are you using?
1.4.9
System info
Which area(s) are affected? (Select all that apply)
Backend
Auth config (if applicable)
Additional context
No response
@better-auth-agent[bot] commented on GitHub (Dec 28, 2025):
When using
auth.api.signUpEmail(...)programmatically, it's important to note that cookies may not be set automatically as they would be when accessing the HTTP endpoint directly. This behavior occurs because server actions in some frameworks, like Next.js, require the use of specific cookie helpers to set cookies correctly.To resolve this issue, you can integrate the
nextCookiesplugin into your configuration. This plugin allows cookies to be automatically set whenever aSet-Cookieheader is present in the response. Here's how you can implement it:Ensure you have imported and included the
nextCookiesplugin in your auth setup, placing it as the last plugin in the array.This configuration should help in setting cookies when
auth.api.signUpEmail(...)is called.If you're still encountering issues, you might want to double-check your environment setup, including any cross-domain cookie policies, if applicable.
Would you like assistance with any specific part of the integration or another question on Better Auth?
If you need more help, tag @better-auth-agent in a comment so I can respond.
Diagram • Discord • GitHub
@iamibadd commented on GitHub (Dec 28, 2025):
@better-auth-agent, I'm using Nestjs, not Nextjs.
@better-auth-agent[bot] commented on GitHub (Dec 28, 2025):
When using
auth.api.signUpEmail(...)programmatically in NestJS, you may not see the expected Set-Cookie headers in the response. This could be due to how the API interacts with cookies in different contexts. It's essential to ensure that the server-side implementation allows for cookie handling correctly.Ensure Secure Cookies: If your server is running in a non-production environment, make sure that
useSecureCookiesis correctly set in your configuration, as secure cookies are typically only sent over HTTPS.Check Cookie Options: Consider verifying your cookie attributes, like
sameSitesettings, especially if you're making cross-site requests. This can prevent cookies from being set or sent back correctly.Use Return Headers: As you already mentioned that you're passing
returnHeaders: trueandasResponse: true, ensure you're handling these correctly when catching the response.Cross-Domain Considerations: If you need to share cookies across subdomains, be sure that the domain attribute for cookies is configured appropriately in your authentication settings.
If these steps don’t resolve the issue, it might be beneficial to tag the Better Auth team members, Beka (@bekacru) and Max (@ping__), for more targeted assistance.
How have you structured the calls to
auth.api.signUpEmail(...), and are there any specific error messages you’re encountering?Diagram • Discord • GitHub
@iamibadd commented on GitHub (Dec 28, 2025):
@Bekacru @dosu could you please help
@dosubot[bot] commented on GitHub (Dec 28, 2025):
Hi @iamibadd! I'm Dosu and I’m helping the better-auth team.
Here's what's happening: when you use
auth.api.signUpEmail()programmatically in NestJS, Better Auth does generate the correctSet-Cookieheaders internally, but NestJS doesn't automatically forward those cookies to the client. You need to manually extract theSet-Cookieheader(s) from the response returned by Better Auth and set them on your outgoing NestJS HTTP response. This is a common integration detail across backend frameworks—it's not a bug, just how server-side APIs work with cookies [source].Here's a pattern you can use in your NestJS controller or route handler:
If there are multiple
Set-Cookieheaders (e.g., for session, cache, remember-me), you may need to split them and set each one individually. Always use the cookies generated by Better Auth—never manually construct them from raw tokens, as they need to be signed and encoded [source].This approach ensures the browser receives and stores the session cookies, syncing authentication state as expected [source].
Let me know if you want a more detailed NestJS example or run into any edge cases!
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Dec 28, 2025):
@dosu Below is an example of how I'm using it:
@dosubot[bot] commented on GitHub (Dec 28, 2025):
The reason cookies aren't being set in your current NestJS flow is that returning the result from
auth.api.signInEmail()doesn't forward the Set-Cookie headers to the client. You need to manually extract all Set-Cookie headers from the Better Auth response and set them on the outgoing NestJS HTTP response object—otherwise, the browser won't receive the session cookies and authentication won't work as expected (source).Here's how you can update your controller to handle this:
This pattern ensures all cookies generated by Better Auth are sent to the browser (source). If you ever see multiple Set-Cookie headers (for session, cache, remember-me, etc.), always forward all of them—never manually construct cookies from raw tokens (source).
Let me know if you need help adapting this for your service layer or have edge cases like redirects or custom cookie handling!
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Dec 28, 2025):
@dosu OT question — I was wondering whether it’s possible to apply rate limiting to auth.api methods.
When I register the auth routes via
BetterAuthModule.forRoot()and call the HTTP endpoint/auth/sign-in/email, rate limiting is applied as expected.However, when I call the auth API programmatically (e.g.
auth.api.signUpEmail(...)) and wrap it inside a custom API, rate limiting doesn’t apply. I know the docs mention that this isn’t supported, but I was wondering if there’s any workaround or recommended approach to achieve this.@dosubot[bot] commented on GitHub (Dec 28, 2025):
Rate limiting in Better Auth is only enforced at the HTTP layer—so when you call auth.api methods programmatically (like in a custom NestJS controller), you bypass the built-in rate limiter entirely. This is by design and confirmed by both maintainers and the codebase: rate limiting is tightly coupled to the HTTP request lifecycle and isn’t triggered by direct API calls ref ref.
There’s no built-in workaround, but the recommended approach is to apply rate limiting at your own HTTP route/controller level using NestJS features. The most common solution is to use the @nestjs/throttler package. For example:
This way, your custom API endpoints get rate limiting just like the built-in Better Auth HTTP endpoints. If you need more advanced logic (per-user, distributed, etc.), you can implement your own guard or middleware, or use a custom storage backend ref.
Let me know if you want a more detailed example or have a specific rate limiting scenario in mind!
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 1, 2026):
@dosu
I'm using the below in Nestjs
I've added http://localhost:5001/v1/auth/callback/google in Google console Authorized redirect URIs.
When I hit
/google/signinfrom the frontend, it returns 404 for/callback/googlewhich is true because I don't have this endpoint in my Nestjs auth controller. My question is, do I need to create a /callback/google endpoint? If so, what do I get in response or how should I create this function? Do I need to use any other auth.api method?Better auth config
@dosubot[bot] commented on GitHub (Jan 1, 2026):
You do need a /callback/google endpoint, but you don't have to implement the OAuth logic yourself. When you use BetterAuthModule.forRoot() and mount the built-in router, Better Auth automatically registers /v1/auth/callback/google (or whatever your basePath is) and handles the entire OAuth callback flow: exchanging the code, fetching user info, creating the session, setting cookies, and redirecting to your callbackURL. You should not call any extra auth.api methods for the callback—just make sure requests to /v1/auth/callback/google are routed to the Better Auth handler, not your custom controller.
If you're getting a 404, it usually means the built-in router isn't mounted or requests aren't reaching it. Double-check that BetterAuthModule.forRoot() is registered in your NestJS app and that /v1/auth/callback/google is not shadowed by another route. You don't need to create a custom controller for the callback; just let the Better Auth router handle it (source).
If you want to use only custom controllers and not the built-in router (not recommended), you would have to replicate all the callback logic yourself, which is complex and error-prone.
In summary: let the built-in Better Auth router handle /v1/auth/callback/google, and you don't need to use any other auth.api method for the callback. Make sure your NestJS routing setup doesn't block or override this path (source).
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 1, 2026):
@dosu
But I'm using auth.api methods and not the default behaviour of registering BetterAuthModule.forRoot(auth). So, if I need to keep both, can I do something like
@dosubot[bot] commented on GitHub (Jan 1, 2026):
Yes, you can import both your custom AuthModule (with controllers/services that use auth.api methods) and BetterAuthModule.forRoot(auth) in the same NestJS app. This lets you use the built-in Better Auth router for endpoints like
/v1/auth/callback/google(which handles the full OAuth flow), while still exposing custom endpoints that use auth.api methods for other flows.The main thing to watch out for is route conflicts: if both modules register the same HTTP path (for example,
/v1/auth/sign-in/email), whichever handler is registered first will take precedence and the other will be shadowed. To avoid this, make sure your custom controllers use routes that don’t overlap with the built-in Better Auth endpoints.Also, any middleware (like rate limiting, origin checks, or plugin hooks) attached to the BetterAuthModule routes will not run for requests handled by your custom controllers—you’ll need to add those protections yourself if you want them on your custom endpoints. The built-in router will handle all the standard auth endpoints, including social login callbacks, session management, etc. source
So your module structure is fine as long as you keep the routes distinct:
If you want to see which endpoints the built-in router exposes, check the Better Auth docs or the codebase for the full list. If you run into a 404 on a callback or built-in endpoint, double-check that no custom controller is shadowing that path and that the BetterAuthModule is mounted at the correct basePath.
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 1, 2026):
@dosu
Okay, so here is what I'm doing.
In Nestjs, I'm doing this
I'm adding a custom path i.e.
bauthinstead of the default i.e.auth. I have added it in Google console Authorized redirect URIs ashttps://localhost:5001/v1/bauth/callback/google.I'm registering, both my custom AuthModule and BetterAuthModule like below
I'm sending the signin url from Nestjs to Nextjs frontend
So, my redirect is happening correctly to
/v1/bauth/callback/googlebut now I'm running intostate_mismatcherror.Is my approach correct of initiating the OAuth from Nestjs or should I use Better Auth client in Nextjs frontend to initiate the OAuth process?
@dosubot[bot] commented on GitHub (Jan 1, 2026):
Your current approach—initiating the OAuth flow from your NestJS backend using
auth.api.signInSocialand sending the URL to the frontend—causes thestate_mismatcherror because the OAuth state cookie (used for CSRF protection) is set in the backend response, but never actually reaches the browser. When the user is redirected to/v1/bauth/callback/google, the browser doesn't have the required state cookie, so Better Auth rejects the callback with astate_mismatcherror (details, details, details).The recommended and most reliable approach is to initiate the OAuth flow directly from your frontend (Next.js) using the Better Auth client (e.g.,
authClient.signIn.social). This ensures the state cookie is set in the browser, so the callback can validate it and complete the login flow without errors (details, details).Migration path:
authClient.signIn.social({ provider: 'google', callbackURL: '/dashboard' }))./v1/bauth/callback/googleendpoint, which is handled by the built-in Better Auth router.callbackURL(e.g.,/dashboard).If you must initiate the flow from the backend, you would need to forward the Set-Cookie headers (containing the state cookie) from the backend response to the browser and ensure the browser stores them before redirecting to Google. This is fragile and not recommended for production (details).
Let me know if you want an example of how to trigger social login from the frontend or need help wiring up the Better Auth client in Next.js!
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 1, 2026):
@dosu
Okay, so the OAuth login works now. However, I have a few custom fields in the User schema/model on the backend and they are required. So, after the signup is completed, my User creation fails with
unable_to_create_userand reason isHow do we handle User creation with custom fields that are passed query/body params.
@dosubot[bot] commented on GitHub (Jan 1, 2026):
This error happens because Better Auth only uses the data returned by the OAuth provider (like Google) when creating a new user, and does not automatically merge in custom fields (like
accountType) from query/body params or your frontend. If your user schema requires fields that the provider doesn't supply, user creation will fail withunable_to_create_userref ref.The recommended way to handle required custom fields during social signup is to pass them in the OAuth
stateparameter when you initiate the login from your frontend. Then, use a Better Auth hook (likeuser.create.before) to extract those fields from the state and set them on the user during creation ref.How to do it:
stateparam:user.create.beforehook to read the state and set the custom field:Let me know if you want a more detailed example for your exact stack or have a specific custom field/flow in mind!
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 1, 2026):
@dosu
I've figured it out. It needs to be done using
databseHookson the server side.Server snippet:
Client snippet:
@dosubot[bot] commented on GitHub (Jan 1, 2026):
That's exactly the right approach and matches Better Auth's recommended pattern for handling required custom fields during social/OAuth signup. Passing additionalData from the client (which gets serialized into the OAuth state) and then extracting it server-side in a databaseHooks.user.create.before hook is both secure and flexible—especially when you assign sensitive fields like accountTypeId only in the hook, not directly from client input (reference).
A couple of best practices: always validate or sanitize any additionalData before assigning it, and if you want custom fields to appear in the session object on the client, you can use the customSession plugin to merge them in (reference). If you run into TypeScript type inference issues in your hooks, an explicit type cast can help (reference).
Let me know if you want an example for a more complex flow or have questions about session customization!
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 8, 2026):
@dosu
I have added a database hook in my Nestjs auth config like below and I'm throwing some error on a condition.
In my Nextjs, I'm using
authClient.signIn.socialAlthough, I'm not able to login and session is not created but the issue is, I'm not redirected to my Nextjs app, instead I see a call to my Nestjs server and its url in the browser with an error message. How can I handle the errors in Nextjs app?
PS: It takes me to http://localhost:5001/v1/bauth/callback/google?state=Pd1MoZz0-NX1oucT_y3j-nsLp39QyrkS&code=4%2F0ATX87lMn-zvWbJIcsjGJbTn0j3GV8E-eLKbLaR3hIYbsj4pFGxpfrPWBBXKaUABrmpWQpg&scope=email+profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+openid+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email&authuser=0&prompt=none
@dosubot[bot] commented on GitHub (Jan 8, 2026):
When you throw an error in a Better Auth database hook during the OAuth callback (like session.create.before), Better Auth should redirect the browser to your errorCallbackURL (e.g.,
http://localhost:3000/signin) with error details in the query string, such as?error=USER_PENDING_DELETION&error_description=User+is+added+for+pending+deletion(callback route code).If you’re seeing the error page on your backend instead of being redirected, double-check these points:
trustedOrigins: ['http://localhost:3000']) (docs).authClient.signIn.socialfrom the frontend.On the Next.js side, handle errors by parsing the
erroranderror_descriptionquery parameters in your/signinpage and displaying a user-friendly message. For example:If you want even more control, you can use the
onAPIError.errorURLoption in your Better Auth config or add a hook for the/errorroute to always redirect to your frontend error page (discussion).To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 8, 2026):
@dosu
I think the issue is that the Google OAuth callback completes successfully, and only after that the database session.create hook runs. At that point, throwing an error no longer affects the OAuth flow, so the user still gets redirected as if the OAuth step succeeded.
Is there a way to fail or abort the Google OAuth flow earlier, based on a custom condition (for example, user status), before the callback is treated as successful and the session is created?
With that said, I can use the
ctx.redirect()method to redirect to the frontend app but I'm just curious if there's a better way.@dosubot[bot] commented on GitHub (Jan 8, 2026):
You're right—throwing an error in the session.create hook is too late to abort the OAuth flow "early." At that point, the OAuth callback has already succeeded, and the user is treated as authenticated up to session creation. The recommended way to fail the flow earlier (for example, based on user status or other custom logic) is to perform your checks in the user.create.before hook instead. If you throw an error or return false in user.create.before, Better Auth will abort user creation and immediately redirect to your errorCallbackURL with error details, before any session is created or cookies are set (example, callback code).
Example:
This will stop the OAuth flow before any session is created, and the user will be redirected to your errorCallbackURL with the error code and message in the query string. There is currently no hook to abort the flow even earlier (before user creation), but user.create.before is the earliest reliable interception point for backend validation (reference).
Let me know if you want help with a more complex validation or need to handle errors differently!
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 8, 2026):
@dosu
My use case is different. If a user exists and the status is pending_delete, I don't want that user to signin. I am preventing it in the credentials provider before but for the Google OAuth, it seems like the callback runs successfully.
@dosubot[bot] commented on GitHub (Jan 8, 2026):
You're right—blocking in session.create.before is too late for existing users in the OAuth flow. For Google OAuth, Better Auth first looks up the user, then immediately creates a session if the user exists, without running user.create hooks (those only run for new users). There’s currently no built-in hook to intercept and block sign-in for existing users based on custom status (like pending_delete) before the session is created and the callback succeeds (relevant issue).
The only reliable way to block these users is to patch Better Auth locally: after the user is found in handleOAuthUserInfo (see link-account.ts), add a check for user.status === 'pending_delete' and return an error object (which will trigger a redirect to your errorCallbackURL with error details). There’s no config option or hook for this yet.
If you want this to be supported out of the box, you could follow or upvote the feature request for a beforeCreateSession or beforeSignIn hook (see discussion). For now, a local patch or fork is the only way to block existing users with custom statuses during social sign-in.
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 9, 2026):
@dosu
I have two questions:
linkSocialmethod doesn't let me link my account with another email for example, abcd@gmail.com. Why is it so?@dosubot[bot] commented on GitHub (Jan 10, 2026):
The linkSocial method enforces that the email of the social account you’re linking must match the email of your existing (credential) account by default. This is a security and data integrity measure to prevent accidental account takeover or confusion—otherwise, someone could link a social account they control to a different user’s email/password account. If you want to allow linking accounts with different emails, you can set
account.accountLinking.allowDifferentEmails = truein your Better Auth config, but this is off by default and comes with a warning about potential risks. Reference Reference ReferenceYes, if you sign up with Google OAuth, you can later link a credential (email/password) login to the same user. The recommended way is to use the server-side
setPasswordAPI method to securely add a password to your existing OAuth user. Account linking is enabled by default, but you can further control it with theaccount.accountLinkingconfig (e.g., trustedProviders, allowDifferentEmails). Reference ReferenceIf you want code samples or more details on either flow, let me know!
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 15, 2026):
@dosu
I have added two callback URIs in Google console Authorized redirect URIs:
http://localhost:5001/v1/bauth/callback/google
https://api1.mydomain.com//v1/bauth/callback/google
I'm initiating the flow from Nextjs on localhost:3000.
When I use http://localhost:5001 auth is successful while it fails with
state_mistmatchfor https://api1.mydomain.com.Why so? Below are my auth config.
@dosubot[bot] commented on GitHub (Jan 15, 2026):
The state_mismatch error on https://api1.mydomain.com happens because the OAuth state cookie (used for CSRF protection) is not being set or sent correctly during the callback. This is almost always due to one or more of these cross-domain requirements not being met:
If auth works on localhost but fails on your remote domain, it's almost always because Secure cookies require HTTPS and/or the domain is not in trustedOrigins. Double-check that https://api1.mydomain.com is using HTTPS, that your browser isn't blocking cookies, and that all origins are correctly listed in trustedOrigins. If you use a proxy or CDN, make sure it doesn't strip Set-Cookie headers.
If you need to support multiple subdomains, consider enabling crossSubDomainCookies with domain: '.mydomain.com' (not a public suffix), but cookies cannot be shared across unrelated domains due to browser security reference.
For a step-by-step checklist and more debugging tips, see the linked issues above.
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 15, 2026):
@dosu
So you mean that calls from localhost:3000 won't be entertained by api.domain.com since I'm using secure cookies?
@dosubot[bot] commented on GitHub (Jan 15, 2026):
You've reached the anonymous usage limit of
10interactions per month. Your usage will reset on2026-02-01. If you'd like to use Dosu before then, please register to increase your limit to100interactions per month for free.To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 15, 2026):
@dosu
So you mean that calls from localhost:3000 won't be entertained by api.domain.com since I'm using secure cookies?
@dosubot[bot] commented on GitHub (Jan 15, 2026):
Correct—if your frontend is running on
localhost:3000(usually HTTP) and your backend is onapi.domain.com(HTTPS), browsers will not send or accept Secure cookies from the backend when making requests from localhost. Secure cookies (Secure: true) are only sent over HTTPS, and cookies set for a remote domain (like.domain.com) are not accessible from localhost due to browser restrictions. This breaks authentication flows that rely on cookies for session or OAuth state, causing issues likestate_mismatcherrors in OAuth callbacks reference reference reference.For local development, you can either:
secure: falsefor cookies in your Better Auth config (not recommended for production).In production, both frontend and backend must be served over HTTPS, and cookies must be set with
SameSite: 'none'andSecure: truefor cross-origin authentication to work reference.Let me know if you want a setup example for local development or have a specific scenario in mind!
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 15, 2026):
@dosu
I also noticed one thing, in my Nestjs backend after login if I set cookies like
and deploy the backend using a domain, i.e. https://api.mydomain.com and call backend from Nextjs, localhost:3000, then upon login, cookies are not set up in the browser and protected APIs fail with 401.
I see this in the network tab,
"This attempt to set cookie via Set-Cookie header was blocked because it had the SameSite=Lax attribute and came from a cross-site response which was not a top-level navigation."
@dosubot[bot] commented on GitHub (Jan 15, 2026):
The browser blocks cookies with
SameSite=Laxon cross-origin XHR/fetch responses unless the request is a top-level navigation (like a redirect). That's why you see the warning and why your session cookies aren't set, resulting in 401s on protected APIs reference.To fix this, update your Better Auth config so session cookies use
SameSite: "none"andSecure: true(required for cross-origin cookies). You can set this globally or per cookie:reference reference
For cross-origin cookies to work, both frontend and backend must be served over HTTPS, your frontend requests must use
credentials: "include"(fetch) orwithCredentials: true(axios), and your backend CORS config must allow credentials and echo the exact origin reference.For local development, browsers treat
localhostas insecure, so Secure cookies may not be sent unless you use HTTPS locally or setsecure: false(not recommended for production). You can't share cookies betweenlocalhostand a remote domain due to browser restrictions reference.If you need a local workaround, use a proxy or custom local domains mapped to
127.0.0.1so both frontend and backend share a parent domain, or temporarily relax cookie security for dev only.Check your Set-Cookie headers in the browser dev tools—they should show
SameSite=None; Secureand the correct domain. If you still see issues, double-check for CORS, proxy/CDN interference, or browser-specific cookie policies.To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 25, 2026):
@dosu
What is the correct usage of
useSessionon the client side in Nextjs?Typescript complains with the below for
useSession.@dosubot[bot] commented on GitHub (Jan 25, 2026):
The TypeScript error happens because you're importing
createAuthClientfrom"better-auth/client", which gives you an atom-like object foruseSession(not a callable hook). For React/Next.js, you need to import from"better-auth/react"—this provides a real React hook foruseSession()that works as expected in client components (source, source, source).Update your import like this:
Then you can use either of these patterns (just don’t mix them in the same component):
Mixing destructured and direct calls (e.g.,
authClient.signIn(...); useSession();) can break reactivity and cause subtle bugs (source).No extra provider or context is needed—
useSessionis a standard React hook. If you run into hydration issues in Next.js, consider wrapping your component in a hydration guard or using a customSessionProvider(source).Let me know if you still see errors after switching to the
"better-auth/react"import!To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 27, 2026):
@dosu,
I’m using better-auth v1.4.17 with social sign-in enabled.
Google OAuth works as expected, but Apple sign-in consistently fails with
state_not_found.From the logs and code snippets I’ve attached, it looks like there’s a behavioral difference between providers:
Google
/callback/googleis invoked via GET, and the state parameter is included in the query string.Apple
/callback/appleis invoked via POST, and the state parameter is included in the request body instead of the query string.Because of this, Better Auth doesn’t seem to find the state, resulting in
state_not_found.My questions:
Is this a recent change or expected behavior for Apple sign-in in v1.4.17?
Does Better Auth currently expect the state to be present in the query params even for Apple, or should it also handle the body?
For context, in Apple Developer settings:
Frontend domain: merge-shield-basin-members.trycloudflare.com
Backend callback URL:
https://nation-crucial-possession-fast.trycloudflare.com/v1/bauth/callback/apple
Both are added under Website URLs for the Apple Service ID.
backend
fronted
Backend logs
@dosubot[bot] commented on GitHub (Jan 27, 2026):
This is a known limitation in better-auth v1.4.17: Apple sends its OAuth callback as a POST with the state parameter in the body, but v1.4.17 does not reliably extract state from the POST body, so you get a
state_not_founderror. This isn’t a new Apple behavior—it's a gap in better-auth that was fixed in a later release.A fix was merged in PR #7181 (2026-01-14) that updates the callback handler to extract the state from both the query string and POST body, so Apple sign-in works as expected (see PR #7181). To resolve this, upgrade to the latest better-auth version that includes this PR or newer.
Also, make sure your state cookie config uses
SameSite: 'none'andSecure: true, and that all domains are served over HTTPS and listed intrustedOrigins(reference).Once you upgrade, Apple sign-in should work without the
state_not_founderror, even when the callback is a POST.To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 27, 2026):
@dosu
I did that and I'm using the correct better-auth version. So, my observation is that, even though if I set a random clientSecret in Apple's clientSecret config, I still see state_not_found. I'm guessing, my clientSecret is incorrect. I created the clientSecret from https://www.better-auth.com/docs/authentication/apple by following the docs. How do I verify if the JWT secret is correct?
@dosubot[bot] commented on GitHub (Jan 27, 2026):
To verify your Apple clientSecret JWT, decode it using a tool like jwt.io and check these claims:
The JWT must be signed with your downloaded .p8 private key using ES256. If any of these values are wrong, or the signature is invalid, Apple will reject the token and Better Auth will fail the OAuth flow—sometimes surfacing as state_not_found or invalid_code errors, depending on where the failure occurs (reference, reference).
If you set a random string as clientSecret, Apple will always reject it, and the flow will fail. To debug, always check your Better Auth logs for errors during the callback—if the error is invalid_code, it's almost certainly a clientSecret/JWT problem; if it's state_not_found, it could be a cookie/state/callback issue, but a totally invalid clientSecret can sometimes cause state errors too (reference).
For production, generate the clientSecret dynamically and rotate it before it expires (reference). If you want to fully verify the JWT, you can use the jose library to check the signature against Apple’s public keys (reference).
If you want to share your JWT (with sensitive parts redacted), I can help you inspect the claims.
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other
@iamibadd commented on GitHub (Jan 27, 2026):
@dosu
JWT decode looks fine
I'm sharing my config
backendurl = "https://nation-crucial-possession-fast.trycloudflare.com"
@dosubot[bot] commented on GitHub (Jan 27, 2026):
Your JWT's aud claim is set to your Service ID, but for Apple Sign In, it must be exactly https://appleid.apple.com—not your Service ID or its reverse URI. The sub claim should be your Service ID (e.g., com.bragmant.api1.si), and iss must be your Team ID. The JWT must be signed with your .p8 key and the correct kid.
If aud is not exactly https://appleid.apple.com, Apple will reject the clientSecret, and Better Auth will fail the OAuth flow—sometimes surfacing as state_not_found or invalid_code errors, even if your logs aren't explicit about the JWT problem (source).
Regenerate your clientSecret JWT with aud: "https://appleid.apple.com" and keep all other claims as you have them. Then update your Better Auth config and try again. If you still see state_not_found, double-check that your callback URLs and trustedOrigins are correct, and that your cookies are set with SameSite: "none" and Secure: true (source).
If you want to fully verify the JWT, you can use jwt.io to decode and inspect the claims, but signature verification requires the private key and Apple's public keys (source).
To reply, just mention @dosu.
How did I do? Good | Irrelevant | Incorrect | Verbose | Hallucination | Report 🐛 | Other