Which Node versions to test the Sume SDK on: 22, 24 and 26
Node 26.10.0 is Current, 24.21.0 and 22.23.3 are LTS. A small CI matrix and smoke test for code that calls the Sume API with fetch and WebCrypto.

Test on the two LTS lines the Node release page lists, 24.21.0 and 22.23.3, plus the Current line, 26.10.0. Sume's SDK docs say @sume-com/sdk needs only fetch and WebCrypto and states Node 18 or newer as the floor, so a matrix of 22, 24 and 26 sits comfortably above it.
This post gives a three-row matrix and a one-file smoke test that proves the runtime can reach the API, without spending any credits.
What the Node page lists
The versions below are as listed on the page.
| Line | Version listed | Status |
|---|---|---|
| 26 | v26.10.0 | Current |
| 24 | v24.21.0 | LTS |
| 22 | v22.23.3 | LTS |
What the SDK needs
The SDK docs describe @sume-com/sdk@0.2.0 as MIT licensed with no runtime dependencies. It needs fetch and WebCrypto, so it runs on Node, Bun, Deno and Cloudflare Workers. The client sends x-api-key only, and the API rejects a request that carries both Authorization: Bearer and x-api-key.
Because there are no dependencies, a failure on one Node line is almost always your own code or a transitive package of yours, not the SDK.
The CI matrix
Pin the major lines and let the patch float, so the job picks up new releases without edits.
name: node-matrix
on: [push]
jobs:
smoke:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node: ["22", "24", "26"]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
- run: node smoke.mjs
env:
SUME_API_KEY: ${{ secrets.SUME_API_KEY }}A smoke test that costs nothing
GET /v1/me is a read call that confirms the key, the network path and the runtime together. It does not create a job, so it does not reserve or spend credits.
const key = process.env.SUME_API_KEY;
if (!key) throw new Error("SUME_API_KEY is not set");
const res = await fetch("https://api.sume.com/v1/me", {
headers: { "x-api-key": key },
});
console.log(process.version, res.status);
if (!res.ok) process.exit(1);
// WebCrypto is what the SDK uses for webhook verification
console.log(typeof globalThis.crypto?.subtle?.importKey);What to watch for
A few failure modes are worth checking in the matrix, each independent of Sume.
- A key stored in a repository secret that is empty on forked pull requests; the smoke test fails loudly instead of sending a blank header.
- A
fetchwrapper in your code that addsAuthorizationon top ofx-api-key, which Sume answers with401 unauthorized. - Generation tests that wait on real jobs. Keep those out of the matrix; run them once on one line, with
Idempotency-Keyset.
Choosing what blocks a merge
Not every row needs to block a merge. A reasonable policy is to make the two LTS lines required and the Current line advisory, since Current is where behavior changes land first. If the advisory row fails and the LTS rows pass, open an issue rather than reverting a change. The reverse, an LTS failure with Current passing, usually means you used something newer than the oldest line you support.
Keep paid generation out of this job entirely. A matrix triples every call, and a retried CI run on a paid endpoint creates new jobs unless the Idempotency-Key is the same. The read-only call above gives you the runtime signal without that cost.
When to move the floor
The release page is the source for which lines are maintained. When a line drops off it, remove it from the matrix and raise the engines field in your own package. Sume's stated floor is a minimum for the SDK, not a recommendation to stay on an old runtime.
Sources
Related posts
More in Developers
- OpenAI Agents API sandbox: keep the Sume API key out of it
The OpenAI Agents API beta adds a sandbox and hosted-browser computer use. Where a Sume API key can live when an agent runs there, and what to hand it instead.
- OpenAI Realtime GA migration: drop the OpenAI-Beta header
Beta Realtime integrations must move to GA and stop sending OpenAI-Beta: realtime=v1. A short checklist, a code scan for the header, and where Sume jobs fit.
- OpenAI TTS: 13 built-in voices vs 9 legacy ones, pick the model first
OpenAI's guide lists gpt-4o-mini-tts with 13 built-in voices and legacy tts-1 and tts-1-hd with 9. Formats, custom voice consent and disclosure, as a checklist.
- Pause between narration lines: TTS pause markers or audio concat?
Deepgram Flux TTS allows pause markers of 500 to 3000 ms, max 8 per request. Sume's timeline audio concat joins lines with no gap. Where to put the pause.
Written by Sume