# What changed in @reduxjs/toolkit

> 46 changes in @reduxjs/toolkit 2 from its official release notes, upgrade guides and advisories: 5 breaking, 4 new APIs and options. Each one cited. Sources checked 2026-10-18. HTML: https://unstale.sh/npm/@reduxjs/toolkit/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## @reduxjs/toolkit 2

### Breaking changes

- Aborts that happen before the pending action is dispatched are no longer swallowed. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- RTK now uses TypeScript's built-in NoInfer utility, which is available with TypeScript 5.4 and later. (2.12.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.12.0)
- RTK calls setUseStrictIteration(false), so Immer copies only string keys in objects by default for RTK updates, improving performance; apps using symbol keys can call setUseStrictIteration(true) to restore the previous behavior. (2.10.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.10.0)
- Initiates requests without adding a subscription, so cache entries remain only for the keepUnusedDataFor period unless the app subscribes. (2.9.2) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.9.2)
- Dispatching resetApiState now aborts all in-flight requests. (2.9.2) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.9.2)

### New APIs and options

- The infinite query hook result type now includes the page error flags. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- RTK Query hook options types are exported for reuse, so you no longer need to extract them with Parameters. (2.12.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.12.0)
- The RTK package now includes agent skill files for using and migrating to modern RTK, managing client and server state, and handling side effects. (2.12.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.12.0)
- Adds an option for infinite queries that, when false, refetches only the first cached page and shrinks the cache from N pages to 1. (2.11.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.11.0)

### Performance

- Composed middleware chains are cached when the middleware list has not changed. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)

### Behavior and default changes

- The sorted adapter merges multiple updates for the same ID before applying them. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- Listener middleware matcher types now accept interface-based type guards as well as type-based definitions. (2.12.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.12.0)
- Sets the accept header based on the selected responseHandler, choosing JSON or text. (2.9.2) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.9.2)
- Stops retrying when the request's AbortSignal is aborted. (2.9.2) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.9.2)

### Fixes and other changes

- Its internal state proxy cache is now scoped per instance, preventing multiple combined reducers from interfering with each other. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- rejectedWithValue is now set correctly when rejectWithValue is called with a falsy payload. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- setAll keeps the last item when given duplicate IDs, matching setMany. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- A URL is treated as absolute only when it starts with a scheme. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- The middleware now handles circular references in state. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- Fetching past the end of an infinite query list no longer triggers onQueryStarted. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- Lazy query hooks now re-subscribe when effects restart while hook state is preserved, such as with Fast Refresh or Activity. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- Polling checks current cache state when each poll fires, so focus loss after scheduling is respected and polling stops if the cache entry was removed. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- Rehydrating state no longer errors when an endpoint name has no definition. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- Tags with falsy IDs, such as 0, now invalidate and clean up correctly. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- Queued tag invalidations are no longer run too early and lost when a duplicate query request is rejected by the thunk condition. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- RTK now supports TypeScript 7.0 and 7.1. The tested support matrix is TypeScript 5.6+. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- data now reflects updateQueryData cache changes made while a refetch is in flight. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- isSuccess now stays false during an unrelated re-render while a query is refetching after an error. (2.13.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.13.0)
- The enhancer's requestAnimationFrame timer now has a 100ms timeout fallback so updates flush when rAF does not work in background tabs or opened windows. (2.12.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.12.0)
- The isSuccess status flag stays true when switching infinite query cache entries, preventing accidental UI flashes. (2.12.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.12.0)
- AbortSignal handling falls back to a plain Error when DOMException is unavailable, including in React Native environments. (2.11.2) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.11.2)
- The type now correctly includes the fetchNextPage and fetchPreviousPage fields. (2.11.2) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.11.2)
- Reworked AbortController handling to avoid an error in a rare case involving resetApiState and retry(). (2.11.1) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.11.1)
- Fixes the immutability development middleware so regex values in ignoredPaths are tested as regexes rather than treated as strings. (2.11.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.11.0)
- Fixes an issue where byte-shaving work in 2.10 caused window access to break in SSR. (2.10.1) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.10.1)
- Improves type inference when PreloadedState might not match the incoming type, such as with persisted values. (2.10.0) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.10.0)
- Fixes the calculation of whether a request is active when checking for cache entry cleanup. (2.9.2) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.9.2)
- Does not set the content-type header for non-JSONifiable request bodies such as FormData, allowing the browser to set it. (2.9.2) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.9.2)
- Returns unknown errors as {error} instead of rethrowing them, as a base query is supposed to. (2.9.2) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.9.2)
- Respects maxRetries when retrying after unknown errors, as it already did for known errors. (2.9.2) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.9.2)
- Internal subscription data is per-store again, preventing subscription IDs from appearing across SSR requests. (2.9.2) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.9.2)
- Initiates requests without adding a subscription, so cache entries remain only for the keepUnusedDataFor period unless the app subscribes. (2.9.2) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.9.2)
- Sorted entity adapters now keep the first occurrence when addMany receives duplicate IDs. (2.9.1) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.9.1)
- RTK Query types ensure data is non-undefined when isSuccess is true, including with exactOptionalPropertyTypes. (2.9.1) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.9.1)
- clearListeners can cancel effects that have become unsubscribed. (2.9.1) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.9.1)
- Sorted entity adapters now keep only unique IDs in state.ids when setMany receives duplicate IDs. (2.9.1) — [release notes](https://github.com/reduxjs/redux-toolkit/releases/tag/v2.9.1)
