# Minified React error codes for hydration

> Minified React error 418, 423, 425 and the other hydration codes (407, 419, 421, 422, 424) decoded: the React 18 and 19 message behind each, and the fix.

Source: https://hydration.jscrate.dev/docs/errors/minified-react-error-codes
Last updated: 2026-09-18

Minified React error 418, 423, 425 and the other codes on this page are
React's hydration errors as a production build prints them: a number and a
link instead of the message. #418 is a mismatch, #425 is a text mismatch in
React 18, and #423 says React re-rendered the whole page. Decode yours below.

## The error

A React 19 production build prints:

```text
Minified React error #418; visit https://react.dev/errors/418?args[]=HTML&args[]= for the full message or use the non-minified dev environment for full errors and additional helpful warnings.
```

React 18 links to the old decoder instead:

```text
Minified React error #423; visit https://reactjs.org/docs/error-decoder.html?invariant=423 for the full message or use the non-minified dev environment for full errors and additional helpful warnings.
```

The number identifies the message. The `args[]` values fill in its
placeholders; for #418 in newer React 19 releases that is only the word
`HTML` or `text`, never the element.

## Minified React error 418, 423, 425 and the rest, decoded

| Code | React 18 message                                                                                                                                                                                             | React 19 message                                                                                                                 | Reported by hydration-proof as                                                               |
| ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
| #407 | Missing getServerSnapshot, which is required for server-rendered content. Will revert to client rendering.                                                                                                   | Same                                                                                                                             | [HP2003](https://hydration.jscrate.dev/docs/issues/hp2003), [HP2004](https://hydration.jscrate.dev/docs/issues/hp2004)                                 |
| #418 | Hydration failed because the initial UI does not match what was rendered on the server.                                                                                                                      | Hydration failed because the server rendered HTML (or text) didn't match the client.                                             | The exact difference, such as [HP1001](https://hydration.jscrate.dev/docs/issues/hp1001) or [HP1007](https://hydration.jscrate.dev/docs/issues/hp1007) |
| #419 | The server could not finish this Suspense boundary, likely due to an error during server rendering. Switched to client rendering.                                                                            | Same                                                                                                                             | [HP2006](https://hydration.jscrate.dev/docs/issues/hp2006)                                                                |
| #421 | This Suspense boundary received an update before it finished hydrating. This caused the boundary to switch to client rendering. The usual way to fix this is to wrap the original update in startTransition. | No longer reported                                                                                                               | [HP2005](https://hydration.jscrate.dev/docs/issues/hp2005)                                                                |
| #422 | There was an error while hydrating this Suspense boundary. Switched to client rendering.                                                                                                                     | There was an error while hydrating but React was able to recover by instead client rendering from the nearest Suspense boundary. | [HP2003](https://hydration.jscrate.dev/docs/issues/hp2003)                                                                |
| #423 | There was an error while hydrating. Because the error happened outside of a Suspense boundary, the entire root will switch to client rendering.                                                              | There was an error while hydrating but React was able to recover by instead client rendering the entire root.                    | [HP2004](https://hydration.jscrate.dev/docs/issues/hp2004)                                                                |
| #424 | This root received an early update, before anything was able hydrate. Switched the entire root to client rendering.                                                                                          | Same                                                                                                                             | [HP2005](https://hydration.jscrate.dev/docs/issues/hp2005)                                                                |
| #425 | Text content does not match server-rendered HTML.                                                                                                                                                            | Not used: text mismatches are #418                                                                                               | [HP1001](https://hydration.jscrate.dev/docs/issues/hp1001)                                                                |

### The mismatch codes: #418 and #425

These are the bug. [Minified React error #418](https://hydration.jscrate.dev/docs/errors/minified-react-error-418)
is an element or text that differs between the server HTML and the first
client render. In React 18, a text difference has its own code,
[#425](https://hydration.jscrate.dev/docs/errors/minified-react-error-425).

### The recovery codes: #422 and #423

These say what React did about an earlier error. Minified React error #422
means it rendered one Suspense boundary again in the browser, and
[#423](https://hydration.jscrate.dev/docs/errors/minified-react-error-423) means it rendered the whole
root again. In React 18 they follow every mismatch. In React 19 they follow a
component that threw during hydration. See
[there was an error while hydrating](https://hydration.jscrate.dev/docs/errors/there-was-an-error-while-hydrating).

### The server code: #419

Minified React error #419 means the server threw while rendering a Suspense
boundary, sent its fallback, and left the browser to render it. The real error
is in your server logs, not in the browser.

### The early update codes: #421 and #424

Minified React error #421 means a Suspense boundary received an update
before it finished hydrating, and minified React error #424 means the same for
the root. See
[Suspense boundary received an update before hydrating](https://hydration.jscrate.dev/docs/errors/suspense-boundary-received-update-before-hydrating).

### The API code: #407

`useSyncExternalStore` was called without its third argument during server
rendering or hydration. See
[Missing getServerSnapshot](https://hydration.jscrate.dev/docs/errors/missing-getserversnapshot).

## Why React minifies its errors

Production builds of React replace every error message with its number, so
the long strings are not shipped to every user. The development build keeps
the full text, the diff, the component stack and the warnings, such as
`Warning: Text content did not match`, that production does not print at all.

That is why a React 18 production console often shows #418 followed by #423
and nothing else: the warnings that named the element exist only in development.

## How to get the full message

1. **Open the link in the error.** react.dev/errors decodes the number and
   fills in the arguments. It will not tell you which element, because
   production does not record it.
2. **Reproduce it in development.** Run the same page with a development build
   (`next dev`, `vite dev`) and read the full message and diff.
3. **If it only happens in production,** test the production build and the
   development build side by side:

   ```bash
   npx hydration-proof test --mode both
   ```

   hydration-proof finds the difference in the production build itself, by
   comparing the DOM, and marks findings that appear in only one mode. With
   browser source maps (`productionBrowserSourceMaps: true` in Next.js) it
   also names the component. See
   [hydration errors only in production](https://hydration.jscrate.dev/docs/guides/hydration-error-only-in-production).

## Find every instance

Minified codes arrive one at a time from users' browsers. To find all of them
before users do, run hydration-proof on every route in CI; see
[detect hydration errors in CI](https://hydration.jscrate.dev/docs/ci). Each code is mapped to a stable
[issue code](https://hydration.jscrate.dev/docs/issues) with the element, both values and the likely cause.

## Related

- [Minified React error #418](https://hydration.jscrate.dev/docs/errors/minified-react-error-418)
- [Minified React error #423](https://hydration.jscrate.dev/docs/errors/minified-react-error-423)
- [Minified React error #425](https://hydration.jscrate.dev/docs/errors/minified-react-error-425)
- [Why hydration errors only happen in production](https://hydration.jscrate.dev/docs/guides/hydration-error-only-in-production)
- [All hydration error messages in full](https://hydration.jscrate.dev/docs/errors)
