fix(kvstore): send camelCase body for bulkSets and updateList#24
Merged
Conversation
The KV REST API expects `addSets`/`deleteSets` and `addItems`/`removeItems` in JSON request bodies. `BulkSetsParams` and `UpdateListParams` had no serde rename, so the wire body was snake_case. The server silently ignored the unknown fields, treated each request as an empty bulk op, and returned 200 OK — calls resolved as success but no data persisted. Closes DX-5341, DX-5342.
AlejandroFabianCampos
approved these changes
May 26, 2026
rx294
approved these changes
May 26, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
BulkSetsParamsandUpdateListParamswere emitting snake_case JSON (add_sets/delete_sets,add_items/remove_items) but the KV REST API expects camelCase. The server silently ignored the unknown fields, treated each request as an empty bulk op, and returned 200 OK — calls resolved as success but no data was persisted.#[serde(rename_all = "camelCase")]to both structs. Update the three wiremock asserts that had baked in the buggy body.No language-API surface change — Node already exposed camelCase via napi's auto-conversion (that's why the bug didn't surface as a TS type error); Python kwargs and Ruby hash keys stay snake_case as the bindings build the struct internally.
OpenAPI audit also covered Streams (snake_case ✓), Webhooks (snake_case + camelCase template tag already handled ✓), and Admin (mixed per-endpoint, every current struct already matches its endpoint ✓). KV was the only product with broken structs.
Closes DX-5341, DX-5342.
Test plan
cargo test -p quicknode-sdk --lib— 196/196 pass; the three updated kvstore wire-body tests now assert camelCase and pass.just lint— clean.just node-build,just python-build,just ruby-build— all bindings compile.cargo run --example kvstore_e2e -p quicknode-sdkwithQN_API_KEY, or re-run the original Node reproducer —bulkSets({ addSets: { k: 'v' } })thengetSet('k')should return'v'instead of 404.