Route Handlers in Next.js – Custom Request Handling with Web APIs and Typed Context

Route Handlers in Next.js allow you to define custom HTTP request handlers directly within the app directory. This article explains how to create route.ts files, use supported HTTP methods like GET and POST, leverage NextRequest and NextResponse, control caching, and type route parameters using RouteContext.

NextRequestNextResponseRouteContext

~2 min read • Updated Oct 25, 2025

What Are Route Handlers?


Route Handlers in Next.js let you define custom logic for HTTP requests using the native Request and Response APIs. They are only available inside the app directory and replace the need for traditional API Routes.


File Structure


Create a route.ts file inside any folder in the app directory:

// app/api/route.ts
export async function GET(request: Request) {
  // Handle GET request
}

Note: You cannot place a route.ts file at the same level as a page.tsx file.


Supported HTTP Methods


Route Handlers support the following methods:

  • GET
  • POST
  • PUT
  • PATCH
  • DELETE
  • HEAD
  • OPTIONS

Unsupported methods return a 405 Method Not Allowed response.


Using NextRequest and NextResponse


Next.js extends the native APIs with NextRequest and NextResponse for advanced use cases like cookies, headers, and URL parsing.


Caching GET Requests


By default, Route Handlers are not cached. To cache a GET method, use the dynamic = 'force-static' config:

// app/items/route.ts
export const dynamic = 'force-static'

export async function GET() {
  const res = await fetch('https://data.mongodb-api.com/...', {
    headers: {
      'Content-Type': 'application/json',
      'API-Key': process.env.DATA_API_KEY,
    },
  })
  const data = await res.json()
  return Response.json({ data })
}

Other HTTP methods are never cached, even if defined in the same file.


Route Conflicts


Route Handlers cannot coexist with page.tsx at the same path level:

PageRouteResult
app/page.jsapp/route.jsConflict ❌
app/page.jsapp/api/route.jsValid ✅
app/[user]/page.jsapp/api/route.jsValid ✅

Typing Route Parameters with RouteContext


Use RouteContext to type route parameters in TypeScript:

// app/users/[id]/route.ts
import type { NextRequest } from 'next/server'

export async function GET(_req: NextRequest, ctx: RouteContext<'/users/[id]'>) {
  const { id } = await ctx.params
  return Response.json({ id })
}

Note: Types are generated during next dev, next build, or next typegen.


Conclusion


Route Handlers in Next.js offer a powerful way to manage HTTP requests directly within your app structure. With support for multiple methods, typed context, and caching control, they provide a clean and scalable alternative to traditional API routes.


Written & researched by Dr. Shahin Siami