Releases: slackapi/node-slack-sdk
Release list
@slack/webhook@8.0.2
@slack/webhook@8.0.1
Patch Changes
-
3a459f6: fix: stop
WebhookTrigger.send()from retrying after a successful deliveryA 2xx response with an empty or non-JSON body no longer throws. It now resolves to
{ ok: true }. Before this fix that body threw a parse error, which was retried as a request error and caused duplicate Workflow Builder runs. A valid{ ok: false, error }body is still surfaced to the caller. -
Updated dependencies [916d8e9]
-
Updated dependencies [f5e9a01]
- @slack/types@3.1.0
@slack/web-api@8.1.1
@slack/web-api@8.1.0
Minor Changes
-
955e6b9: feat(web-api): add support for
admin.users.getExpiration -
4322e14: feat(web-api): add
agents.sessions.renameandagents.sessions.setStatus -
4ba30a1: feat(web-api): add
session_statustochat.stopStreamarguments -
bff3398: feat(web-api): add webapi response changes as of 2026-08-21
Regenerate response types with new stable response properties (e.g.
agent_sessionon message-bearing responses,ListViewgrouping/sort/filter fields,bots.infoconnector/workflow flags).Two fields are removed from
UsersListResponse, neither of which is a real success-response property:Member.is_connector_bot— not returned byusers.list; this flag is surfaced onbots.info(added here toBotsInfoResponse).arg— an error-response echo field, not part of a successfulusers.listbody.
-
f5fd35a: feat(web-api): add
blocks.validatemethod
Patch Changes
@slack/types@3.1.0
Minor Changes
- 916d8e9: feat(types): add
agent_session_stoppedandagent_session_title_changedevents - f5e9a01: feat(types): add optional
min_linesandmax_linesproperties toRichTextInputelement
@slack/socket-mode@3.0.1
Patch Changes
-
5c2362c: Fix leaked TCP sockets on disconnect (#2709). Moving from
wsto undici'sWebSocketin 3.0.0 dropped every force-close mechanism, soESTABLISHEDsockets were never torn down and accumulated toward Slack's per-app connection cap.disconnect()now arms a 30s close-handshake timeout, so a peer that never replies to the close frame no longer leaves the socket stuck inCLOSINGindefinitely.- On the default dispatcher path, the underlying TCP socket is now captured and force-destroyed during cleanup. A user-supplied
dispatcherowns its own socket and instead relies on the close-handshake timeout — this limitation is documented on thedispatcheroption. - The
closehandler no longer schedules a reconnect on stale or overlapping close events, so at most one reconnect is scheduled per disconnect.
@slack/webhook@8.0.0
Major Changes
-
fc98c8c: Drop Node.js 18 support. The minimum supported Node.js version is now 20.
-
fc98c8c: Restructured error classes to use proper
Errorsubclasses extending a newSlackWebhookErrorbase class.Breaking changes to
IncomingWebhookHTTPError:- The
originalproperty has been removed. HTTP response details are now direct properties:statusCode: numberstatusMessage: stringbody: string
- Migrate from
error.original.response.statustoerror.statusCode,error.original.response.datatoerror.body, etc.
Breaking changes to
IncomingWebhookRequestError:- The
originalproperty is now a standardError(previously it was anAxiosError). The original error is also available via the standardcauseproperty.
Removed factory functions (use
newwith the corresponding class instead):requestErrorWithOriginal()→new IncomingWebhookRequestError(original)httpErrorWithOriginal()→new IncomingWebhookHTTPError(statusCode, statusMessage, body)errorWithCode()— Use the specific error class directly.
Migration: Replace
if (error.code === ErrorCode.HTTPError)withif (error instanceof IncomingWebhookHTTPError). You can also catch all webhook errors withif (error instanceof SlackWebhookError).The
CodedErrorinterface is deprecated — useinstanceofchecks with theSlackWebhookErrorbase class or specific error subclasses instead. - The
-
fc98c8c: Replaced
axioswith the standard Fetch API for HTTP transport.Removed options from
IncomingWebhookDefaultArguments:agent— Use the newfetchoption to provide a custom fetch implementation with proxy or TLS support. For proxies, prefer the built-inhttp.setGlobalProxyFromEnv()orNODE_USE_ENV_PROXY=1(Node.js 24+). For advanced use cases:import { fetch, Agent } from "undici"; const webhook = new IncomingWebhook(url, { fetch: (url, init) => fetch(url, { ...init, dispatcher: new Agent({ connect: { ca: myCA } }), }), });
The
axiosdependency has been removed. The default fetch implementation isglobalThis.fetch(available in Node.js 20+). Thetimeoutoption remains available and is implemented viaAbortController.
Minor Changes
-
fc98c8c: feat: add
WebhookTriggerclass for Workflow Builder triggers and opt-in retries forIncomingWebhookandWebhookTriggerWebhookTriggersurfaces its ownWebhookTriggerHTTPErrorandWebhookTriggerRequestError(subclasses ofSlackWebhookError), so trigger failures can be distinguished fromIncomingWebhookfailures viainstanceof.
Patch Changes
- Updated dependencies [fc98c8c]
- @slack/types@3.0.0
@slack/web-api@8.0.0
Major Changes
-
fc98c8c: Drop Node.js 18 support. The minimum supported Node.js version is now 20.
-
fc98c8c: Redesigned error handling to use proper
Errorsubclasses instead of plain objects with acodeproperty.Migration: Replace
if (error.code === ErrorCode.PlatformError)withif (error instanceof WebAPIPlatformError). All error classes extend a commonSlackErrorbase class (which extendsError), so you can also catch all SDK errors withif (error instanceof SlackError).New error class hierarchy:
SlackError(abstract base)WebAPIPlatformError— Slack API returnedok: falseWebAPIRequestError— Network/transport failure (original error incause)WebAPIHTTPError— Non-200 HTTP status from SlackWebAPIRateLimitedError— HTTP 429 withretryAftersecondsWebAPIFileUploadInvalidArgumentsError— Invalid file upload argumentsWebAPIFileUploadReadFileDataError— Failed to read file data for upload
Removed factory functions (these were internal but exported — use
newwith the corresponding class instead):errorWithCode()platformErrorFromResult()→new WebAPIPlatformError(...)requestErrorWithOriginal()→new WebAPIRequestError(...)httpErrorFromResponse()→new WebAPIHTTPError(...)rateLimitedErrorWithDelay()→new WebAPIRateLimitedError(...)
Other breaking type changes:
WebAPIHTTPError.headerstype changed fromIncomingHttpHeaderstoRecord<string, string>.- The
CodedErrorinterface is deprecated — useinstanceofchecks with specific error classes instead. - Error
.namevalues changed from generic'Error'to descriptive class names (e.g.,'WebAPIPlatformError').
-
fc98c8c: Replaced
axioswith the standard Fetch API for all HTTP transport. The following options and types have been removed fromWebClientOptions:agent— Use the newfetchoption to provide a custom fetch implementation with proxy or keep-alive support. For proxies, prefer the built-inhttp.setGlobalProxyFromEnv()orNODE_USE_ENV_PROXY=1(Node.js 24+). For advanced use cases:import { fetch, Agent } from "undici"; const client = new WebClient(token, { fetch: (url, init) => fetch(url, { ...init, dispatcher: new Agent({ keepAliveTimeout: 60_000 }), }), });
tlsandTLSOptions— Configure TLS via a customfetchimplementation with an undiciAgent, or use theNODE_EXTRA_CA_CERTSenvironment variable.requestInterceptorandRequestInterceptortype — Wrap thefetchfunction to intercept or modify requests before they are sent.adapterandAdapterConfigtype — Use thefetchoption instead.RequestConfigtype (was an alias for Axios'InternalAxiosRequestConfig) — Removed entirely.attachOriginalToWebAPIRequestErroroption — Removed. The original error is now always available via the standardcauseproperty onWebAPIRequestError.
The dependencies
axios,form-data,is-electron, andis-streamhave been removed. The defaultfetchimplementation isglobalThis.fetch(available in Node.js 20+).New exported types for custom fetch implementations:
FetchFunction,FetchResponse,FetchRequestInit,FetchHeaders. -
fc98c8c: Removed previously-deprecated API methods and their associated request/response types:
files.upload— UsefilesUploadV2instead (available since v6.7). ThefilesUploadV2method handles the multi-step upload process automatically.rtm.start— Usertm.connectinstead. Thertm.startmethod was deprecated by Slack in favor of the lighter-weightrtm.connect.workflows.stepCompleted,workflows.stepFailed,workflows.updateStep— These methods supported the retired Steps from Apps feature (deprecated August 2023, retired September 2024). Theworkflows.featured.*andadmin.workflows.*methods for the current Workflow Builder remain available.
Minor Changes
- fc98c8c: feat: expand app manifest types — add
agent_viewandassistant_viewfeatures, recent agent events (app_context_changed,assistant_thread_started,assistant_thread_context_changed), optional OAuth scopes (bot_optional/user_optional), and eventmetadata_subscriptions
Patch Changes
@slack/types@3.0.0
Major Changes
- fc98c8c: Drop Node.js 18 support. The minimum supported Node.js version is now 20.
@slack/socket-mode@3.0.0
Major Changes
-
fc98c8c: Drop Node.js 18 support. The minimum supported Node.js version is now 20.
-
fc98c8c: Redesigned error handling to use proper
Errorsubclasses instead of plain objects with acodeproperty.Migration: Replace
if (error.code === ErrorCode.WebsocketError)withif (error instanceof SMWebsocketError).New error classes (all extend a common
SlackSocketModeErrorabstract base class, which extendsError):SMPlatformError— Slack platform returned an error eventSMWebsocketError— WebSocket connection failure (original error incause)SMNoReplyReceivedError— Timed out waiting for a reply to an acknowledgementSMSendWhileDisconnectedError— Attempted to send while not connectedSMSendWhileNotReadyError— Attempted to send before the connection was ready
Catch any socket-mode error with
if (error instanceof SlackSocketModeError).Removed factory functions (use
newwith the corresponding class instead):websocketErrorWithOriginal()→new SMWebsocketError(original)platformErrorFromEvent()→new SMPlatformError(event)noReplyReceivedError()→new SMNoReplyReceivedError()sendWhileDisconnectedError()→new SMSendWhileDisconnectedError()sendWhileNotReadyError()→new SMSendWhileNotReadyError()
The
CodedErrorinterface is deprecated — useinstanceofchecks with specific error classes instead. Theerror.codeproperty still exists for backward-compatible checks, buterror.namevalues changed from generic'Error'to descriptive class names (e.g.,'SMWebsocketError'). -
fc98c8c: Replaced the
wsWebSocket library with a spec-compliant WebSocket implementation backed byundici.undici@^7is now a peer dependency that must be installed alongside@slack/socket-mode:npm install @slack/socket-mode undici@^7
Removed options:
clientOptions.agent(thehttpAgentpassed to the underlying web-api client). Use the new top-leveldispatcheroption instead. The dispatcher handles both the WebSocket connection and HTTP API calls (unlessclientOptions.fetchis also provided, in which casedispatcheronly applies to WebSocket).
New
dispatcheroption:import { SocketModeClient } from "@slack/socket-mode"; import { ProxyAgent } from "undici"; const client = new SocketModeClient({ appToken: process.env.SLACK_APP_TOKEN, dispatcher: new ProxyAgent("http://proxy:3128"), });
For simple proxy use cases, prefer the Node.js built-in proxy support: call
http.setGlobalProxyFromEnv()at startup or setNODE_USE_ENV_PROXY=1(Node.js 24+) withHTTP_PROXY/HTTPS_PROXYenvironment variables.The
dispatcheroption accepts any object implementing theSocketModeDispatcherinterface (structurally compatible with undici'sAgent,ProxyAgent,Client, etc.).This package now depends on
@slack/web-api@^8— anyclientOptionsyou pass are subject to web-api v8 breaking changes (e.g., theagentandtlsoptions are no longer available; useclientOptions.fetchinstead).