Next.js Middleware

Payment middleware for Next.js API routes.

API Route Handler

app/api/premium/route.ts
import { NextResponse } from 'next/server'
import { VantaMiddleware } from '@vanta/middleware'

const paywall = VantaMiddleware({
  price: '0.001',
  recipient: process.env.WALLET_ADDRESS!,
  network: 'base',
})

export async function GET(request: Request) {
  const paywallResult = await paywall(request)
  if (paywallResult) return paywallResult // Returns 402 if unpaid
  
  return NextResponse.json({ data: 'Premium content' })
}

Edge Middleware

middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
import { validateVantaToken } from '@vanta/middleware/edge'

export async function middleware(request: NextRequest) {
  if (request.nextUrl.pathname.startsWith('/api/premium')) {
    const token = request.headers.get('Authorization')?.replace('Bearer ', '')
    
    if (!token || !await validateVantaToken(token, process.env.TOKEN_SECRET!)) {
      return new NextResponse(null, { status: 402, headers: {
        'WWW-Authenticate': 'x402 ...'
      }})
    }
  }
  return NextResponse.next()
}

export const config = { matcher: '/api/premium/:path*' }

Server Actions

actions.ts
'use server'
import { verifyPayment } from '@vanta/sdk'

export async function premiumAction(paymentProof: string) {
  const verified = await verifyPayment(paymentProof, {
    recipient: process.env.WALLET_ADDRESS!,
    network: 'base',
  })
  
  if (!verified.valid) throw new Error('Payment required')
  
  return { data: 'Premium result' }
}