# Async Patterns In Next.js 15+, `params`, `searchParams`, `cookies()`, and `headers()` are asynchronous. ## Async Params and SearchParams Always type them as `Promise<...>` and await them. ### Pages and Layouts ```tsx type Props = { params: Promise<{ slug: string }> } export default async function Page({ params }: Props) { const { slug } = await params } ``` ### Route Handlers ```tsx export async function GET( request: Request, { params }: { params: Promise<{ id: string }> } ) { const { id } = await params } ``` ### SearchParams ```tsx type Props = { params: Promise<{ slug: string }> searchParams: Promise<{ query?: string }> } export default async function Page({ params, searchParams }: Props) { const { slug } = await params const { query } = await searchParams } ``` ### Synchronous Components Use `React.use()` for non-async components: ```tsx import { use } from 'react' type Props = { params: Promise<{ slug: string }> } export default function Page({ params }: Props) { const { slug } = use(params) } ``` ### generateMetadata ```tsx type Props = { params: Promise<{ slug: string }> } export async function generateMetadata({ params }: Props): Promise { const { slug } = await params return { title: slug } } ``` ## Async Cookies and Headers ```tsx import { cookies, headers } from 'next/headers' export default async function Page() { const cookieStore = await cookies() const headersList = await headers() const theme = cookieStore.get('theme') const userAgent = headersList.get('user-agent') } ``` ## Migration Codemod ```bash npx @next/codemod@latest next-async-request-api . ```