vercel/next.js · error · Error

Route ${workStore.route} used `headers()` inside `generateSt

Error message

Route ${workStore.route} used `headers()` inside `generateStaticParams`. This is not supported because `generateStaticParams` runs at build time without an HTTP request. Read more: https://nextjs.org/docs/messages/next-dynamic-api-wrong-context

What it means

Error "Route ${workStore.route} used `headers()` inside `generateStaticParams`. This is not supported because `generateStaticParams` runs at build time without an HTTP request. Read more: https://nextjs.org/docs/messages/next-dynamic-api-wrong-context" thrown in vercel/next.js.

Source

Thrown at packages/next/src/server/request/headers.ts:74

      // When using forceStatic we override all other logic and always just return an empty
      // headers object without tracking
      const underlyingHeaders = HeadersAdapter.seal(new Headers({}))
      return makeUntrackedHeaders(underlyingHeaders)
    }

    if (workUnitStore) {
      switch (workUnitStore.type) {
        case 'cache': {
          const error = createHeadersInUseCacheError(workStore.route)
          Error.captureStackTrace(error, headers)
          applyOwnerStack(error)
          workStore.invalidDynamicUsageError ??= error
          throw error
        }
        case 'unstable-cache':
          throw createHeadersInUnstableCacheError(workStore.route)
        case 'generate-static-params':
          throw new Error(
            `Route ${workStore.route} used \`headers()\` inside \`generateStaticParams\`. This is not supported because \`generateStaticParams\` runs at build time without an HTTP request. Read more: https://nextjs.org/docs/messages/next-dynamic-api-wrong-context`
          )
        case 'prerender':
        case 'prerender-client':
        case 'validation-client':
        case 'private-cache':
        case 'prerender-runtime':
        case 'prerender-legacy':
        case 'request':
          break
        default:
          workUnitStore satisfies never
      }
    }

    if (workStore.dynamicShouldError) {
      throw new StaticGenBailoutError(
        `Route ${workStore.route} with \`dynamic = "error"\` couldn't be rendered statically because it used \`headers()\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`

View on GitHub (pinned to 258b1c1bc0)

Solutions

  1. Do not call headers() inside generateStaticParams; use params passed to it instead.
Defensive patterns

Strategy: try-catch

When it happens

Trigger: headers() is called inside generateStaticParams.

Common situations: Using headers at build time inside generateStaticParams where no request exists.


AI-assisted analysis of vercel/next.js@258b1c1bc0 (2026-09-01). Data as JSON: /api/errors/aa96d1e7978c35af. Report an issue: GitHub.