
- Next.js - Home
- Next.js - Overview
- Next.js - Project Setup
- Next.js - Folder Structure
- Next.js - App Router
- Next.js - Page Router
- Next.js Features
- Next.js - Pages
- Next.js - Data Fetching
- Next.js - ISR
- Next.js - Static File Serving
- Next.js - Pre-Rendering
- Next.js - Partial Pre Rendering
- Next.js - Server Side Rendering
- Next.js - Client Side Rendering
- Next.js Routing
- Next.js - Routing
- Next.js - Nested Routing
- Next.js - Dynamic Routing
- Next.js - Parallel Routing
- Next.js - Imperative Routing
- Next.js - Shallow Routing
- Next.js - Intercepting Routes
- Next.js - Redirecting Routes
- Next.js - Navigation and Linking
- Next.js Configuration
- Next.js - TypeScript
- Next.js - Environment Variables
- Next.js - File Conventions
- Next.js - ESLint
- Next.js API & Backend
- Next.js - API Routes
- Next.js - Dynamic API Routes
- Next.js - Route Handlers
- Next.js - API MiddleWares
- Next.js - Response Helpers
- Next.js API Reference
- Next.js - CLI Commands
- Next.js - Functions
- Next.js - Directives
- Next.js - Components
- Next.js - Image Component
- Next.js - Font Component
- Next.js - Head Component
- Next.js - Form Component
- Next.js - Link Component
- Next.js - Script Component
- Next.js Styling & SEO
- Next.js - CSS Support
- Next.js - Global CSS Support
- Next.js - Meta Data
- Next.js Advanced Topics
- Next.js - Error Handling
- Next.js - Server Actions
- Next.js - Fast Refresh
- Next.js - Internationalization
- Next.js - Authentication
- Next.js - Session Management
- Next.js - Authorization
- Next.js - Caching
- Next.js - Data Caching
- Next.js - Router Caching
- Next.js - Full Route Caching
- Next.js - Request Memoization
- Next.js Performance Optimization
- Next.js - Optimizations
- Next.js - Image Optimization
- Next.js - Lazy Loading
- Next.js - Font Optimization
- Next.js - Video Optimization
- Next.js - Script Optimization
- Next.js - Memory Optimization
- Next.js - Using OpenTelemetry
- Next.js - Package Bundling Optimization
- Next.js Testing
- Next.js - Testing
- Next.js - Testing with Jest
- Next.js - Testing with Cypress
- Next.js - Testing with Vitest
- Next.js - Testing with Playwright
- Next.js Debugging & Deployment
- Next.js - Debugging
- Next.js - Deployment
- Next.js Useful Resources
- Next.js - Interview Questions
- Next.js - Quick Guide
- Next.js - Useful Resources
- Next.js - Discussion
Next.js - userAgent() Function
The userAgent() Function
The Next.js userAgent() function extents the Web Request API, to provide additional properties and methods to interact with the user agent object from the request. This is useful for getting information about the user's device, operating system, and browser.
Syntax
Following is syntax of userAgent() function:
import { userAgent } from 'next/server' export function middleware(request: NextRequest) { const { device, engine, browser, os, cpu } = userAgent(request) }
Parameters
The userAgent() function takes a request object as its parameter. This object will provide information about the incoming request, such as headers, cookies, query parameters, etc.
Return Value
The function returns an object containing the following properties:
- device: The type of device (e.g., desktop, mobile, tablet, etc.)
- engine: The rendering engine of the browser (e.g., Blink, WebKit, Gecko, etc.)
- browser: The name of the browser
- os: The operating system of the device
- cpu: The architecture of the device's CPU (e.g., x86, ARM, etc.)
Key Points
- The userAgent() function is middleware-specific, means it can be used only in middleware functions.
- The function will execute before page rendering
- The function is useful for customizing the content based on the user's device, browser, or operating system.
Example 1
The example below shows how to use the userAgent function in a middleware to add device information to the URL parameters.
// app/middleware.ts import { NextRequest, NextResponse, userAgent } from 'next/server' export function middleware(request: NextRequest) { const ua = userAgent(request) const url = request.nextUrl // Add device info to URL params url.searchParams.set('device', ua.device.type) url.searchParams.set('browser', ua.browser.name) url.searchParams.set('os', ua.os.name) url.searchParams.set('engine', ua.engine.name) url.searchParams.set('cpu', ua.cpu.architecture) return NextResponse.rewrite(url) }
Output
When a user visits the page, the URL will be modified to include the device, browser, OS, engine, and CPU information as query parameters.

Example 2
The example below shows how to use the userAgent function in a middleware to add viewport information to the URL parameters based on the user's device type.
import { NextRequest, NextResponse, userAgent } from 'next/server' export function middleware(request: NextRequest) { const url = request.nextUrl const { device } = userAgent(request) const viewport = device.type === 'mobile' ? 'mobile' : 'desktop' url.searchParams.set('viewport', viewport) return NextResponse.rewrite(url) }