Skip to content
The Auth.js project is now part of Better Auth.

PostgreSQL Adapter

Resources

Setup

Installation

npm install @auth/pg-adapter pg

Environment Variables

DATABASE_HOST= DATABASE_NAME= DATABASE_USER= DATABASE_PASSWORD=

Configuration

./auth.ts
import NextAuth from "next-auth" import PostgresAdapter from "@auth/pg-adapter" import { Pool } from "pg"   const pool = new Pool({  host: process.env.DATABASE_HOST,  user: process.env.DATABASE_USER,  password: process.env.DATABASE_PASSWORD,  database: process.env.DATABASE_NAME,  max: 20,  idleTimeoutMillis: 30000,  connectionTimeoutMillis: 2000, })   export const { handlers, auth, signIn, signOut } = NextAuth({  adapter: PostgresAdapter(pool),  providers: [], })

If you are using Neon’s PostgreSQL like Vercel Postgres, you can use @neondatabase/serverless to work with edge runtime.

./auth.ts
import NextAuth from "next-auth" import PostgresAdapter from "@auth/pg-adapter" import { Pool } from "@neondatabase/serverless"   // *DO NOT* create a `Pool` here, outside the request handler. // Neon's Postgres cannot keep a pool alive between requests.   export const { handlers, auth, signIn, signOut } = NextAuth(() => {  // Create a `Pool` inside the request handler.  const pool = new Pool({ connectionString: process.env.DATABASE_URL })  return {  adapter: PostgresAdapter(pool),  providers: [],  } })

Schema

The SQL schema for the tables used by this adapter is as follows. Learn more about the models at our doc page on Database Models.

CREATE TABLE verification_token (  identifier TEXT NOT NULL,  expires TIMESTAMPTZ NOT NULL,  token TEXT NOT NULL,    PRIMARY KEY (identifier, token) );   CREATE TABLE accounts (  id SERIAL,  "userId" INTEGER NOT NULL,  type VARCHAR(255) NOT NULL,  provider VARCHAR(255) NOT NULL,  "providerAccountId" VARCHAR(255) NOT NULL,  refresh_token TEXT,  access_token TEXT,  expires_at BIGINT,  id_token TEXT,  scope TEXT,  session_state TEXT,  token_type TEXT,    PRIMARY KEY (id) );   CREATE TABLE sessions (  id SERIAL,  "userId" INTEGER NOT NULL,  expires TIMESTAMPTZ NOT NULL,  "sessionToken" VARCHAR(255) NOT NULL,    PRIMARY KEY (id) );   CREATE TABLE users (  id SERIAL,  name VARCHAR(255),  email VARCHAR(255),  "emailVerified" TIMESTAMPTZ,  image TEXT,    PRIMARY KEY (id) );  
Auth.js © Better Auth Inc. - 2025