---
title: "qs Breaking Changes on npm | Since.dev"
description: "What each qs release removed, renamed or changed: 8 breaking changes in 4 versions on npm, each with its source."
canonical_url: https://since.dev/packages/npm/qs
last_updated: 2026-08-29
---

# qs breaking changes

Every breaking API change we have recorded in qs on npm: 8 breaking changes in 4 versions. Below are its newest 4 versions, removals and renames first, each with its source.

Newest change August 29, 2026

## 6.16.0

2 breaking changes, first published August 29, 2026.

- **Behavior changed** `parse`  

With throwOnLimitExceeded set, parse now throws when comma groups under \[\]= exceed arrayLimit, where it previously did not. Code relying on the old lenient parsing may now get an error. [github.com](https://github.com/ljharb/qs/blob/v6.16.0/CHANGELOG.md)
- **Behavior changed** `stringify`  

An empty array with own properties is now checked for cycles and its own keys are serialized when allowEmptyArrays is set, so output for such arrays can change. [github.com](https://github.com/ljharb/qs/blob/v6.16.0/CHANGELOG.md)

## 6.15.3

2 breaking changes, first published June 24, 2026.

- **Behavior changed** `parse`  

Inputs that grow arrays past the limit through combine or merge can now throw when throwOnLimitExceeded is set, where they previously did not. Code that relies on those inputs succeeding may need to handle the error. [github.com](https://github.com/ljharb/qs/blob/v6.15.3/CHANGELOG.md)
- **Behavior changed** `utils.merge`  

Merging arrays that exceed arrayLimit now throws on every array path, where some paths previously accepted them. Code that merges large arrays may need to handle the error or raise the limit. [github.com](https://github.com/ljharb/qs/blob/v6.15.3/CHANGELOG.md)

## 6.15.0

3 breaking changes, first published February 15, 2026.

- **Behavior changed** `parse`  

The duplicates option of parse no longer applies to keys written in bracket notation. Code that relied on duplicates handling for bracket keys will see different results. [github.com](https://github.com/ljharb/qs/blob/v6.15.0/CHANGELOG.md)
- **Signature changed** `defaultDecoder`  

Was type defaultDecoder = (str: string, decoder?: any, charset?: string) => string; now type defaultDecoder = (str: string, decoder?: unknown, charset?: string) => string. [npmjs.com](https://www.npmjs.com/package/qs/v/6.15.0)
- **Signature changed** `defaultEncoder`  

Was type defaultEncoder = (str: any, defaultEncoder?: any, charset?: string) => string; now type defaultEncoder = (str: unknown, defaultEncoder?: unknown, charset?: string) => string. [npmjs.com](https://www.npmjs.com/package/qs/v/6.15.0)

## 6.14.2

1 breaking change, first published February 11, 2026.

- **Behavior changed** `arrayLimit`  

The arrayLimit option is now applied as a maximum count of items rather than a maximum index, and indexed keys exceeding the limit become overflow objects. Code relying on the previous index-based limit may get different parsed results. [github.com](https://github.com/ljharb/qs/blob/v6.14.2/CHANGELOG.md)

## Check your code

These are the changes. To see which of them reach your code, [scan a public repository](https://since.dev/scan.md), or have your coding agent call `check_code` with your manifest or lockfile over [MCP](https://since.dev/docs.md#mcp). [The API](https://since.dev/docs.md#api) reads every change in every version, not only the newest. On Team and up, a fix pull request opens for the changes that reach a connected repository. Nothing merges or deploys.

## Put your code on continuous management.

Scan a public repository now, or give your agent one line.

### See how out of date your code is.

[Scan a repository](https://since.dev/scan.md). Any public GitHub repository. No sign-in.

### Tell your agent what changed since it was trained.

`claude mcp add --transport http since https://api.since.dev/mcp`

---

Every page on this site as Markdown: https://since.dev/sitemap.md. For agents: https://since.dev/llms.txt.
