Bird
Raised Fist0
NextJSframework~10 mins

Dynamic API routes in NextJS - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Dynamic API routes
Request comes in
Check URL path
Match dynamic route pattern
Extract dynamic params
Run API handler with params
Send response back
When a request hits the API, Next.js matches the URL to a dynamic route file, extracts parameters, runs the handler, and returns the response.
Execution Sample
NextJS
export default function handler(req, res) {
  const { id } = req.query;
  res.status(200).json({ message: `Item ID is ${id}` });
}
This API route returns a JSON message showing the dynamic id from the URL.
Execution Table
StepRequest URLRoute MatchedExtracted ParamsHandler ActionResponse Sent
1/api/items/42/api/items/[id].js{ id: '42' }Return JSON { message: 'Item ID is 42' }200 OK with JSON
2/api/items/abc/api/items/[id].js{ id: 'abc' }Return JSON { message: 'Item ID is abc' }200 OK with JSON
3/api/itemsNo match{}No handler run404 Not Found
💡 Execution stops when no matching dynamic route is found or response is sent.
Variable Tracker
VariableStartAfter 1After 2After 3
req.query.idundefined42abcundefined
res.statusCode200200200404
response JSON messageundefinedItem ID is 42Item ID is abcundefined
Key Moments - 2 Insights
Why does the handler receive the id as a string even if it looks like a number?
Because URL parameters are always strings. See execution_table rows 1 and 2 where id is '42' and 'abc' as strings.
What happens if the URL does not match any dynamic route?
No handler runs and Next.js returns a 404 error, as shown in execution_table row 3.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the extracted param when the request URL is '/api/items/abc'?
A{ id: 123 }
B{}
C{ id: 'abc' }
D{ item: 'abc' }
💡 Hint
Check execution_table row 2 under Extracted Params column.
At which step does the response status code become 404?
AStep 3
BStep 2
CStep 1
DNever
💡 Hint
Look at execution_table row 3 under Response Sent column.
If the URL was '/api/items/100', what would the response JSON message be?
A"Item ID is id"
B"Item ID is 100"
C"Item ID is undefined"
D"Item ID is null"
💡 Hint
Refer to execution_table rows 1 and 2 for response JSON message pattern.
Concept Snapshot
Dynamic API routes in Next.js use filenames with brackets like [id].js
The id part is extracted from the URL as a string
The handler receives params in req.query
Handler returns response using res object
If no route matches, Next.js returns 404
Useful for APIs needing variable input in URL
Full Transcript
Dynamic API routes in Next.js let you create API endpoints that change based on the URL. For example, a file named [id].js inside the api folder matches URLs like /api/items/42 or /api/items/abc. When a request comes in, Next.js checks the URL, matches it to the dynamic route, extracts the id parameter as a string, and passes it to the handler function in req.query. The handler then uses this id to create a response, often JSON. If the URL does not match any route, Next.js returns a 404 error. This lets you build flexible APIs that respond differently depending on the URL path.

Practice

(1/5)
1. What is the purpose of using square brackets in Next.js API route filenames like [id].js?
easy
A. To create dynamic API routes that capture parts of the URL
B. To mark the file as a static API route
C. To import external modules dynamically
D. To define middleware for the API route

Solution

  1. Step 1: Understand file naming in Next.js API routes

    Square brackets in filenames like [id].js indicate a dynamic segment in the URL path.
  2. Step 2: Recognize the effect on routing

    This allows the API route to capture the value in that part of the URL and use it inside the handler.
  3. Final Answer:

    To create dynamic API routes that capture parts of the URL -> Option A
  4. Quick Check:

    Dynamic routes use brackets = D [OK]
Hint: Square brackets in filenames mean dynamic URL parts [OK]
Common Mistakes:
  • Thinking brackets mark static routes
  • Confusing with dynamic imports
  • Assuming brackets define middleware
2. Which of the following is the correct way to access the dynamic parameter id inside a Next.js API route handler in [id].js?
easy
A. const id = req.params.id;
B. const id = req.body.id;
C. const id = req.query.id;
D. const id = req.route.id;

Solution

  1. Step 1: Recall how Next.js passes dynamic route params

    Next.js provides dynamic route parameters inside req.query in API routes.
  2. Step 2: Identify the correct syntax

    Accessing id is done by req.query.id, not req.params or others.
  3. Final Answer:

    const id = req.query.id; -> Option C
  4. Quick Check:

    Dynamic params in API routes = req.query [OK]
Hint: Use req.query to get dynamic route params in Next.js API [OK]
Common Mistakes:
  • Using req.params instead of req.query
  • Trying to get params from req.body
  • Using incorrect property like req.route
3. Given the API route file pages/api/user/[userId].js with this handler:
export default function handler(req, res) {
  const { userId } = req.query;
  res.status(200).json({ message: `User ID is ${userId}` });
}

What will be the JSON response when a client requests /api/user/42?
medium
A. 404 Not Found
B. {"message":"User ID is userId"}
C. {"message":"User ID is undefined"}
D. {"message":"User ID is 42"}

Solution

  1. Step 1: Extract dynamic parameter from URL

    The URL /api/user/42 matches the dynamic route [userId].js, so userId is "42".
  2. Step 2: Check the handler response

    The handler reads userId from req.query and returns JSON with message including that value.
  3. Final Answer:

    {"message":"User ID is 42"} -> Option D
  4. Quick Check:

    Dynamic param value used in response = A [OK]
Hint: Dynamic param in URL becomes req.query value [OK]
Common Mistakes:
  • Expecting literal string 'userId' instead of value
  • Assuming undefined if param missing
  • Thinking route returns 404 for dynamic routes
4. Consider this Next.js API route file named pages/api/product/[pid].js with the handler:
export default function handler(req, res) {
  const pid = req.query.pid;
  if (!pid) {
    res.status(400).json({ error: "Product ID missing" });
  }
  res.status(200).json({ productId: pid });
}

What is the bug in this code?
medium
A. It should use res.send instead of res.json
B. It does not return after sending 400 response, causing headers to be sent twice
C. It uses req.query.pid instead of req.params.pid
D. The file name should be [pid].ts instead of .js

Solution

  1. Step 1: Analyze the conditional response

    If pid is missing, the code sends a 400 response but does not stop execution.
  2. Step 2: Understand HTTP response behavior

    Without a return after sending 400, the code continues and tries to send a 200 response, causing an error.
  3. Final Answer:

    It does not return after sending 400 response, causing headers to be sent twice -> Option B
  4. Quick Check:

    Return after error response to avoid double send [OK]
Hint: Always return after sending error response in API handlers [OK]
Common Mistakes:
  • Ignoring missing return after res.status(400).json()
  • Confusing req.query with req.params
  • Thinking res.send is required over res.json
5. You want to create a Next.js API route that handles multiple dynamic segments like /api/order/[orderId]/item/[itemId].js. How should you structure the files and access both orderId and itemId inside the handler?
hard
A. Create nested folders: pages/api/order/[orderId]/item/[itemId].js and access via req.query.orderId and req.query.itemId
B. Create a single file pages/api/order-item.js and parse URL manually
C. Use query parameters like /api/order?orderId=1&itemId=2 and access req.query
D. Create a file pages/api/order/[orderId]-[itemId].js and access req.query as an array

Solution

  1. Step 1: Understand nested dynamic routes in Next.js

    Next.js supports nested folders with dynamic segments using square brackets for each segment.
  2. Step 2: Access multiple dynamic params in handler

    Both orderId and itemId appear in req.query as separate keys.
  3. Final Answer:

    Create nested folders: pages/api/order/[orderId]/item/[itemId].js and access via req.query.orderId and req.query.itemId -> Option A
  4. Quick Check:

    Nested folders with brackets = multiple params in req.query [OK]
Hint: Use nested folders with brackets for multiple dynamic params [OK]
Common Mistakes:
  • Trying to parse multiple params in one filename
  • Using query string instead of dynamic routes
  • Assuming req.query returns array for multiple params