Skip to content
emailkit
Esc
navigateopen⌘Jpreview
On this page

Next.js adapter

Add one Next.js route for provider webhooks, login callbacks, and verification requests.

The optional emailkit/nextjs adapter connects the Next.js App Router to emailkit. It handles request conversion and keeps the exact request body needed to verify provider webhooks.

Single driver

import { createNextEmailKitHandler } from "emailkit/nextjs";
import { emailkit } from "@/src/emailkit";

export const { GET, POST } = createNextEmailKitHandler(emailkit);

Multiple drivers

import { createNextEmailKitHandler } from "emailkit/nextjs";
import { emailkit } from "@/src/emailkit";

export const { GET, POST } = createNextEmailKitHandler(emailkit, {
  emailDriver: async (_request, context) => {
    const params = await context.params;
    return typeof params?.emailDriver === "string"
      ? params.emailDriver
      : undefined;
  },
});

Set PUBLIC_BASE_URL=https://app.example.com. emailkit uses it with /api/email/:emailDriverId to create the callback URL for each provider.

What emailkit handles for you

  • Reads JSON, URL-encoded forms, file uploads, and text request bodies.
  • Preserves the exact body needed to verify Resend and AIInbx signatures.
  • Converts Mailgun file uploads to Uint8Array content.
  • Selects a provider from route params, the query string, or the x-emailkit-driver header.
  • Turns emailkit responses into Next.js responses.
  • Returns a clean 400 response for malformed request bodies.

Lower-level helpers

Import toEmailKitRequest and toNextResponse when you need custom routing or middleware:

import { toEmailKitRequest, toNextResponse } from "emailkit/nextjs";

const normalized = await toEmailKitRequest(request, {
  emailDriver: "resend",
  headers: { "x-request-id": requestId },
});

return toNextResponse(await emailkit.handler()(normalized));

Last updated on July 24, 2026

Was this page helpful?