Route Handlers
Route Handlers allow you to create custom request handlers for a given route using the Web Request and Response APIs.

Good to know: Route Handlers are only available inside the
app
directory. They are the equivalent of API Routes inside thepages
directory meaning you do not need to use API Routes and Route Handlers together.
Convention
Route Handlers are defined in a route.js|ts
file inside the app
directory:
Route Handlers can be nested inside the app
directory, similar to page.js
and layout.js
. But there cannot be a route.js
file at the same route segment level as page.js
.
Supported HTTP Methods
The following HTTP methods are supported: GET
, POST
, PUT
, PATCH
, DELETE
, HEAD
, and OPTIONS
. If an unsupported method is called, Next.js will return a 405 Method Not Allowed
response.
Extended NextRequest
and NextResponse
APIs
In addition to supporting native Request and Response. Next.js extends them with
NextRequest
and NextResponse
to provide convenient helpers for advanced use cases.
Behavior
Caching
Route Handlers are cached by default when using the GET
method with the Response
object.
TypeScript Warning:
Response.json()
is only valid from TypeScript 5.2. If you use a lower TypeScript version, you can useNextResponse.json()
for typed responses instead.
Opting out of caching
You can opt out of caching by:
- Using the
Request
object with theGET
method. - Using any of the other HTTP methods.
- Using Dynamic Functions like
cookies
andheaders
. - The Segment Config Options manually specifies dynamic mode.
For example:
Similarly, the POST
method will cause the Route Handler to be evaluated dynamically.
Good to know: Like API Routes, Route Handlers can be used for cases like handling form submissions. A new abstraction for handling forms and mutations that integrates deeply with React is being worked on.
Route Resolution
You can consider a route
the lowest level routing primitive.
- They do not participate in layouts or client-side navigations like
page
. - There cannot be a
route.js
file at the same route aspage.js
.
Page | Route | Result |
---|---|---|
app/page.js | app/route.js | Conflict |
app/page.js | app/api/route.js | Valid |
app/[user]/page.js | app/api/route.js | Valid |
Each route.js
or page.js
file takes over all HTTP verbs for that route.
Examples
The following examples show how to combine Route Handlers with other Next.js APIs and features.
Revalidating Cached Data
You can revalidate cached data using the next.revalidate
option:
Alternatively, you can use the revalidate
segment config option:
Dynamic Functions
Route Handlers can be used with dynamic functions from Next.js, like cookies
and headers
.
Cookies
You can read or set cookies with cookies
from next/headers
. This server function can be called directly in a Route Handler, or nested inside of another function.
Alternatively, you can return a new Response
using the Set-Cookie
header.
You can also use the underlying Web APIs to read cookies from the request (NextRequest
):
Headers
You can read headers with headers
from next/headers
. This server function can be called directly in a Route Handler, or nested inside of another function.
This headers
instance is read-only. To set headers, you need to return a new Response
with new headers
.
You can also use the underlying Web APIs to read headers from the request (NextRequest
):
Redirects
Dynamic Route Segments
We recommend reading the Defining Routes page before continuing.
Route Handlers can use Dynamic Segments to create request handlers from dynamic data.
Route | Example URL | params |
---|---|---|
app/items/[slug]/route.js | /items/a | { slug: 'a' } |
app/items/[slug]/route.js | /items/b | { slug: 'b' } |
app/items/[slug]/route.js | /items/c | { slug: 'c' } |
URL Query Parameters
The request object passed to the Route Handler is a NextRequest
instance, which has some additional convenience methods, including for more easily handling query parameters.
Streaming
Streaming is commonly used in combination with Large Language Models (LLMs), such as OpenAI, for AI-generated content. Learn more about the AI SDK.
These abstractions use the Web APIs to create a stream. You can also use the underlying Web APIs directly.
Request Body
You can read the Request
body using the standard Web API methods:
Request Body FormData
You can read the FormData
using the request.formData()
function:
Since formData
data are all strings, you may want to use zod-form-data
to validate the request and retrieve data in the format you prefer (e.g. number
).
CORS
You can set CORS headers for a specific Route Handler using the standard Web API methods:
Good to know:
- To add CORS headers to multiple Route Handlers, you can use Middleware or the
next.config.js
file.- Alternatively, see our CORS example package.
Webhooks
You can use a Route Handler to receive webhooks from third-party services:
Notably, unlike API Routes with the Pages Router, you do not need to use bodyParser
to use any additional configuration.
Edge and Node.js Runtimes
Route Handlers have an isomorphic Web API to support both Edge and Node.js runtimes seamlessly, including support for streaming. Since Route Handlers use the same route segment configuration as Pages and Layouts, they support long-awaited features like general-purpose statically regenerated Route Handlers.
You can use the runtime
segment config option to specify the runtime:
Non-UI Responses
You can use Route Handlers to return non-UI content. Note that sitemap.xml
, robots.txt
, app icons
, and open graph images all have built-in support.
Segment Config Options
Route Handlers use the same route segment configuration as pages and layouts.
See the API reference for more details.