All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Block Kit:
CardBlockandCarouselBlock— Support for two of the new agent-UI blocks announced in the April 16 Slack changelog.CardBlockis constructed viaNewCardBlockwith a functional-options pattern and fluentWith*builders (WithTitle,WithSubtitle,WithBody,WithIcon,WithHeroImage,WithActions).CarouselBlockis constructed viaNewCarouselBlockwith a variadic*CardBlocklist plusWithBlockIDandAddCardhelpers. Both blocks wire intoBlocks.UnmarshalJSONfor round-trip fidelity, and reuse existingImageBlockElement/ButtonBlockElement/BlockElementstypes rather than introducing new composition objects. The Alert block is deliberately not included in this release pending sandbox-verified rendering. - Streaming-message chunks API —
chat.startStream/chat.appendStream/chat.stopStreamnow accept achunksparameter. AddedMsgOptionChunksalong with aStreamChunkinterface and four chunk types:MarkdownTextChunk,TaskUpdateChunk,PlanUpdateChunk, andBlocksChunk(each with aNew*Chunkconstructor). This is the supported transport for streaming Block Kit content and the new agent-UI blocks in particular (whichchat.postMessagerejects asUnsupported block type). MsgOptionTaskDisplayMode— New option forchat.startStreamcontrolling whether task chunks render as a sequential timeline or a grouped plan. AcceptsTaskDisplayModeTimelineorTaskDisplayModePlan.
0.22.0 - 2026-04-12
- Added missing parameters to
assistant.search.context(Sort,SortDir,Before,After,Highlight,IncludeContextMessages,IncludeDeletedUsers,IncludeMessageBlocks,IncludeArchivedChannels,DisableSemanticSearch,Modifiers,TermClauses) and new response types (AssistantSearchContextFile,AssistantSearchContextChannel,AssistantSearchContextMessageContext) to match the full Real-Time Search API surface. - Added
Underline,Highlight,ClientHighlight, andUnlinkfields toRichTextSectionTextStyle. AddedStylefield toRichTextSectionUserGroupElement. - Added
BotOptionalandUserOptionalfields toOAuthScopesfor app manifests. - Added PKCE support for OAuth:
OAuthOptionCodeVerifieroption forGetOAuthV2Response,GenerateCodeVerifier()andGenerateCodeChallenge()helper functions (RFC 7636).client_secretis now conditionally omitted when empty in bothGetOAuthV2ResponseContextandRefreshOAuthV2TokenContext.
ChannelTypesandContentTypesnow send comma-separated values instead of repeated form keys, matching the convention used by every other method in the library.- In
socketmodemalformed JSON messages no longer force an unnecessary reconnect. Instead the error is emitted and the connection continues as normal.
0.21.1 - 2026-04-08
slackevents.ChannelType*constants andMessageEventhelpers — AddedChannelTypeChannel,ChannelTypeGroup,ChannelTypeIM,ChannelTypeMPIMconstants andIsChannel(),IsGroup(),IsIM(),IsMpIM()methods onMessageEventso callers no longer need to compare raw strings.
-
Duplicate attachment/block serialization in
MsgOptionAttachments/MsgOptionBlocks— Attachments and blocks were serialized twice: once into typed struct fields (for the JSON response-URL path) and again intourl.Values(for the form POST path). Serialization for the form path now happens insideformSender.BuildRequestContext, so each sender owns its own marshalling. This fixes the long-standing FIXME and eliminates redundantjson.Marshalcalls in the option functions. (#1547)[!NOTE]
UnsafeApplyMsgOptionsreturnsconfig.valuesdirectly. After this change,attachmentsandblockskeys are no longer present in those values since marshalling is deferred to send time. This function is documented as unsupported.
0.21.0 - 2026-04-05
slackevents.ParseActionEvent— Cannot parseblock_actionspayloads (returns unmarshalling error). Useslack.InteractionCallbackwithjson.Unmarshalinstead, orslack.InteractionCallbackParsefor HTTP requests.InteractionCallbackhandles all interaction types. (#596)slackevents.MessageAction,MessageActionEntity,MessageActionResponse— Associated types that only support legacyinteractive_messagepayloads.
-
IMstruct — Removed theIMstruct (and unused internal typesimChannel,imResponseFull). TheIsUserDeletedfield has been moved toConversation, where it is populated for IM-type conversations. Code usingIMshould switch toConversation.[!NOTE] In practice no user should be affected —
IMwas never returned by any public API method in this library, so there was no way to obtain one outside of manual construction. -
Info.GetBotByID,GetUserByID,GetChannelByID,GetGroupByID,GetIMByID— These methods were deprecated and returnednilunconditionally. They have been removed.[!WARNING] Breaking change. If you are calling any of these methods, remove those calls — they were already no-ops.
admin.teams.settings.*API support —AdminTeamsSettingsInfo,AdminTeamsSettingsSetDefaultChannels,AdminTeamsSettingsSetDescription,AdminTeamsSettingsSetDiscoverability,AdminTeamsSettingsSetIcon, andAdminTeamsSettingsSetName. IncludesTeamDiscoverabilityenum withOpen,InviteOnly,Closed, andUnlistedvariants. ([#960])OAuthOptionAPIURLfor package-level OAuth functions — All package-level OAuth functions (GetOAuthV2Response,GetOpenIDConnectToken,RefreshOAuthV2Token, etc.) now accept variadicOAuthOptionarguments. UseOAuthOptionAPIURL(url)to override the default Slack API URL, enabling integration tests against a local HTTP server. Existing callers are unaffected. ([#744])GetOpenIDConnectUserInfo/GetOpenIDConnectUserInfoContext— Returns identity information about the user associated with the token viaopenid.connect.userInfo. Complements the existingGetOpenIDConnectTokenmethod. ([#967])- HTTP response headers — Slack API response headers (e.g.
X-OAuth-Scopes,X-Accepted-OAuth-Scopes,X-Ratelimit-*) are now accessible.AuthTestResponseexposes aHeaderfield directly. For all other methods, useOptionOnResponseHeaders(func(method string, headers http.Header))to register a callback that fires after every API call. (#1076) DNDOptionTeamID—GetDNDInfoandGetDNDTeamInfonow accept optionalParamOptionarguments. UseDNDOptionTeamID("T...")to passteam_id, which is required after workspace migration (Slack returnsmissing_argumentwithout it). (#1157)UpdateUserGroupMembersList/UpdateUserGroupMembersListContext— Convenience wrappers aroundUpdateUserGroupMembersthat accept[]stringinstead of a comma-separated string, enabling clean chaining withGetUserGroupMembers. (#1172)SetUserProfile/SetUserProfileContext— Set multiple user profile fields in a single API call by passing a*UserProfilestruct tousers.profile.set. Complements the existing single-field methods (SetUserRealName,SetUserCustomStatus, etc.). ([#1158])- API warning callbacks — Slack API responses may include a
warningsfield with deprecation notices or usage hints. UseOptionWarnings(func(warnings []string))to register a callback that receives these warnings. ([#1540]) - RTM support for
user_status_changed,user_huddle_changed,user_profile_changedevents — these events are now mapped inEventMappingwith dedicated structs (UserStatusChangedEvent,UserHuddleChangedEvent,UserProfileChangedEvent). Previously they triggeredUnmarshallingErrorEvent. (#1541) - RTM support for
sh_room_join,sh_room_leave,sh_room_update,channel_updatedevents — Slack Call/Huddle room events and channel property updates are now mapped with dedicated structs (SHRoomJoinEvent,SHRoomLeaveEvent,SHRoomUpdateEvent,ChannelUpdatedEvent). ([#858]) CacheTSandEventTSfields onUserChangeEvent— these fields were sent by Slack but silently dropped during unmarshalling.workflows.featuredAPI support — add, list, remove, and set featured workflows on channels viaWorkflowsFeaturedAdd,WorkflowsFeaturedList,WorkflowsFeaturedRemove, andWorkflowsFeaturedSetIsConnectorBotandIsWorkflowBotinUser— boolean flags for connector and workflow bot usersGuestInvitedByinUserProfile— user ID of whoever invited a guest userBlocksfield onMessageEvent— block data from webhook payloads is now directly accessible viaevent.Blocksinstead of only throughevent.Message.Blocks. (#1257)Usernamefield onUser— Slack's interaction payloads (block_actions, shortcuts) include ausernamefield in the user object that was previously dropped during unmarshalling. ([#1218])Blocks,Attachments,Files,Uploadfields onAppMentionEvent— these fields are sent by Slack inapp_mentionevent payloads but were silently dropped. ([#961])HandleShortcut,HandleViewSubmission,HandleViewClosedin socketmode handler — Level 3 handlers that dispatchshortcut/message_action,view_submission, andview_closedinteractions byCallbackID, matching the pattern ofHandleInteractionBlockActionandHandleSlashCommand. ([#1161])BlockFromJSON/MustBlockFromJSON— Create blocks from raw JSON strings, enabling direct use of output from Slack's Block Kit Builder or quick adoption of new block types before the library adds typed support. The original JSON is preserved through marshalling. (#1497)
ViewSubmissionResponseconstructors —NewClearViewSubmissionResponse,NewUpdateViewSubmissionResponse,NewPushViewSubmissionResponse, andNewErrorsViewSubmissionResponsenow have doc comments explaining the HTTP response pattern (write JSON and return promptly) and the Socket Mode pattern (pass as Ack payload).NewErrorsViewSubmissionResponseadditionally documents that map keys must beBlockIDs ofInputBlockelements. ([#726], [#1013])- Socket Mode examples —
examples/socketmode/andexamples/socketmode_handler/now have doc comments explaining the two-token requirement: app-level token (xapp-) for the WebSocket connection and bot token (xoxb-) for API calls. ([#941])
UnknownBlockround-trip data loss — Unrecognized block types (e.g. new Slack block types not yet supported by this library) now preserve their full JSON through unmarshal/marshal cycles. Previously onlytypeandblock_idwere retained, silently discarding all other fields.
-
Adjusted some
adminerrors that started with uppercase to be lowercase per go conventions.[!WARNING] Breaking change. If you are matching the error content in your code, this is a BREAKING CHANGE.
-
WebhookMessage.UnfurlLinksandUnfurlMediaare now*bool— Previously these wereboolwithomitempty, which meantfalsewas silently stripped from the JSON payload. Users could not explicitly disable link or media unfurling via webhooks. The fields are now*boolso thatnil(omit),false, andtrueall serialize correctly. ([#1231])[!WARNING] Breaking change. Code that sets these fields directly must be updated:
// Before msg := slack.WebhookMessage{UnfurlLinks: true} // After — use a helper or a variable t := true msg := slack.WebhookMessage{UnfurlLinks: &t}
Leaving the fields unset (
nil) preserves the previous default behavior — Slack's server-side defaults apply (unfurl_links=false,unfurl_media=true). -
User.Has2FAis now*bool— When using a bot token, Slack'susers.listAPI omitshas_2faentirely. With a plainbool, this was indistinguishable from explicitlyfalse. Nownilmeans absent/unknown,falsemeans explicitly disabled,truemeans enabled. ([#1121])[!WARNING] Breaking change. Code that reads
Has2FAmust handle the pointer:// Before if user.Has2FA { ... } // After if user.Has2FA != nil && *user.Has2FA { ... }
-
ListReactionsnow uses cursor-based pagination —ListReactionsParametersreplacesCount/PagewithCursor/Limit, andListReactions/ListReactionsContextnow return([]ReactedItem, string, error)where the string is the next cursor, instead of([]ReactedItem, *Paging, error). ([#825])[!WARNING] Breaking change. Both the parameters and return signature have changed:
// Before params := slack.NewListReactionsParameters() params.Count = 100 params.Page = 2 items, paging, err := api.ListReactions(params) // After params := slack.NewListReactionsParameters() params.Limit = 100 items, nextCursor, err := api.ListReactions(params) // Use nextCursor for the next page: params.Cursor = nextCursor
-
ListStars/GetStarrednow use cursor-based pagination —StarsParametersreplacesCount/PagewithCursor/Limit(and addsTeamID), andListStars/ListStarsContext/GetStarred/GetStarredContextnow returnstring(next cursor) instead of*Paging. Slack'sstars.listAPI no longer returnspagingdata — onlyresponse_metadata.next_cursor.[!WARNING] Breaking change. Both the parameters and return signature have changed:
// Before params := slack.NewStarsParameters() params.Count = 100 params.Page = 2 items, paging, err := api.ListStars(params) // After params := slack.NewStarsParameters() params.Limit = 100 items, nextCursor, err := api.ListStars(params) // Use nextCursor for the next page: params.Cursor = nextCursor
-
GetAccessLogsnow uses cursor-based pagination —AccessLogParametersreplacesCount/PagewithCursor/Limit(and addsBefore), andGetAccessLogs/GetAccessLogsContextnow returnstring(next cursor) instead of*Paging. Slack'steam.accessLogsAPI warnsuse_cursor_pagination_insteadwhen using the old parameters.[!WARNING] Breaking change. Both the parameters and return signature have changed:
// Before params := slack.NewAccessLogParameters() params.Count = 100 params.Page = 2 logins, paging, err := api.GetAccessLogs(params) // After params := slack.NewAccessLogParameters() params.Limit = 100 logins, nextCursor, err := api.GetAccessLogs(params) // Use nextCursor for the next page: params.Cursor = nextCursor
-
Socket Mode: large Ack payloads no longer silently fail — Two issues caused
Ack()payloads to be silently dropped by Slack. First, gorilla/websocket's default 4KB write buffer fragmented messages into WebSocket continuation frames that Slack does not reassemble. The library now uses a 32KB write buffer. Second, Slack silently drops Socket Mode responses at or above 20KB —Ack(),Send(), andSendCtx()now return an error when the serialized response reaches this limit. (#1196)[!WARNING] Breaking change.
Ack()andSend()now returnerror. Existing call sites that don't capture the return value continue to compile without changes. -
MsgOptionBlocks()with no arguments now sendsblocks=[]— Previously, callingMsgOptionBlocks()with no arguments or a nil spread was a silent no-op, making it impossible to clear blocks from a message viachat.update. The Slack API requires an explicitblocks=[]to reliably remove blocks. ([#1214])[!WARNING] Breaking change.
MsgOptionBlocks()with no arguments now sendsblocks=[]instead of being a no-op. If you were relying on this to be a no-op, remove the option entirely:// Before — this was a no-op, now it sends blocks=[] api.PostMessage(ch, slack.MsgOptionBlocks(), slack.MsgOptionText("text", false)) // After — omit MsgOptionBlocks entirely to not set blocks api.PostMessage(ch, slack.MsgOptionText("text", false))
-
WorkflowButtonBlockElementmissing fromUnmarshalJSON—workflow_buttonblocks now unmarshal correctly throughBlockElements,InputBlock, andAccessorypaths. Also adds missingmulti_*_selectandfile_inputcases toBlockElements.UnmarshalJSON, and fixestoBlockElementforRichTextInputElementandWorkflowButtonElement. ([#1539]) -
NewBlockHeadernil pointer dereference — passing a nil text object no longer panics. (#1236) -
ValidateUniqueBlockIDrejects empty block IDs — multiple input blocks with no explicitblock_idset (empty string) were incorrectly flagged as duplicates, causingOpenViewto fail. ([#1184])
0.20.0 - 2026-03-21
Warning
trigger_id and workflow_id are NOT in any documentation or in any of the official
libraries, so exercise caution if you use these.
workflow_idandtrigger_idinMessage— It seems that some types of messages, e.g:bot_message, can carrytrigger_idandworkflow_id.RichTextQuote.Borderfield — optional border toggle (matches the docs now)RichTextPreformatted.Languagefield — enables syntax highlighting for preformatted blocks
- Remove embedding of
RichTextSection—RichTextQuoteandRichTextPreformattedare now flattened as they should have always been. This is a breaking change for anyone using these structs directly.
0.19.0 - 2026-03-04
- Optional HTTP retry for Web API — Retries are off by default. Enable with
OptionRetry(n)for 429-only retries orOptionRetryConfig(cfg)for full control including 5xx and connection errors with exponential backoff. (#1532) task_cardandplanagent blocks — New block types for task cards and plan agent blocks. (#1536)
0.18.0 - 2026-02-21
focus_on_loadsupport for remaining block elements — Static/external/users/conversations/channels select, multi-select variants, datepicker, timepicker, plain_text_input, checkboxes, radio_buttons, and number_input. (#1519)PlainTextandPreviewPlainTextfields onFile— Email file objects now include the plain text body fields instead of silently discarding them. (#1522)- Missing fields on
User,UserProfile, andEnterpriseUser—who_can_share_contact_card,always_active,pronouns,image_1024,is_custom_image,status_text_canonical,huddle_state,huddle_state_expiration_ts,start_date, andis_primary_owner. (#1526) - Work Objects support — Chat unfurl with Work Object metadata, entity details (flexpane),
entity_details_requestedevent, and associated types (WorkObjectMetadata,WorkObjectEntity,WorkObjectExternalRef). (#1529) admin.roles.*API methods —admin.roles.listAssignments,admin.roles.addAssignments, andadmin.roles.removeAssignments. (#1520)
UserProfile.SkypeJSON tag — Corrected typo from"skyp"to"skype". (#1524)assistant.threads.setSuggestedPromptstitle parameter — Title is now sent when non-empty. (#1528)
- CI test matrix updated: dropped Go 1.24, added Go 1.26; bumped golangci-lint to v2.10.1. (#1530)
0.18.0-rc2 - 2026-01-28
- Audit Logs example - New example demonstrating how to use the Audit Logs API. (#1144)
- Admin Conversations API support - Comprehensive support for
admin.conversations.*methods including core operations (archive, unarchive, create, delete, rename, invite, search, lookup, getTeams, convertToPrivate, convertToPublic, disconnectShared, setTeams), bulk operations (bulkArchive, bulkDelete, bulkMove), preferences, retention management, restrict access controls, and EKM channel info. (#1329)
- BREAKING: Removed deprecated
UploadFile,UploadFileContext, andFileUploadParameters. Thefiles.uploadAPI was discontinued by Slack on November 12, 2025. ([#1481]) - BREAKING: Renamed
UploadFileV2→UploadFile,UploadFileV2Context→UploadFileContext, andUploadFileV2Parameters→UploadFileParameters. The "V2" suffix is no longer needed now that the old API is removed. ([#1481])
- File upload error wrapping -
UploadFilenow wraps errors with the step name (GetUploadURLExternal,UploadToURL, orCompleteUploadExternal) so callers can identify which of the three upload steps failed. (#1491) - Audit Logs API endpoint - Fixed
GetAuditLogsto use the correct endpoint (api.slack.com) instead of the regular API endpoint (slack.com/api). The Audit Logs API requires a different base URL. AddedOptionAuditAPIURLfor testing. (#1144) - Socket mode websocket dial debugging - Added debug logging when a custom dialer is used including HTTP response status on dial failures. This helps diagnose proxy/TLS issues like "bad handshake" errors. (#1360)
MsgOptionPostMessageParametersnow passesMetaData- Previously, metadata was silently dropped when usingPostMessageParameters. (#1343)
0.18.0-rc1 - 2026-01-26
- Huddle support - New
HuddleRoom,HuddleParticipantEvent, andHuddleRecordingtypes for handling Slack huddle events (huddle_threadsubtype messages). - Call block data parsing -
CallBlocknow includes full call data when retrieved from Slack messages, with newCallBlockData,CallBlockDataV1, andCallBlockIconURLstypes. (#897) - Chat Streaming API support - New streaming API for real-time chat interactions with example usage. (#1506)
- Data Access API support - Full support for Slack's Data Access API with example implementation. (#1439)
- Cursor-based pagination for
GetUsers- More efficient user retrieval with cursor pagination. (#1465) GetAllConversationswith pagination - Retrieve all conversations with automatic pagination handling, including rate limit and server error handling. (#1463)- Table blocks support - Parse and create table blocks with proper unmarshaling. (#1490, #1511)
- Context actions block support - New
context_actionsblock type. (#1495) - Workflow button block element - Support for
workflow_buttonin block elements. (#1499) loading_messagesparameter forSetAssistantThreadsStatus- Optional parameter to customize loading state messages. (#1489)- Attachment image fields - Added
ImageBytes,ImageHeight, andImageWidthfields to attachments. (#1516) RecordChannelto conversation properties - New property for conversation metadata. (#1513)- Title argument for
CreateChannelCanvas- Canvas creation now supports custom titles. (#1483) PostEphemeralhandler for slacktest - Audit outgoing ephemeral messages in test environments. (#1517)PreviewImageNamefor remote files - Customize preview image filename instead of using the defaultpreview.jpg.
PublishViewno longer sends empty hash - Prevents unnecessary payload when hash is empty. (#1515)ImageBlockElementvalidation - Now properly validates that eitherimageURLorSlackFileis provided. (#1488)- Rich text section channel return - Correctly returns channel for section channel rich text elements. (#1472)
KickUserFromConversationerror handling - Errors are now properly parsed as a map structure. (#1471)
- BREAKING:
GetReactionsnow returnsReactedIteminstead of[]ItemReaction. This aligns the response with the actual Slack API, which includes the item itself (message, file, or file_comment) alongside reactions. To migrate, useresp.Reactionsto access the slice of reactions. (#1480) - BREAKING:
Settingsstruct fieldsInteractivityandEventSubscriptionsare now pointers, allowing them to be omitted when empty. (#1461) - Minimum Go version bumped to 1.24. (#1504)
0.17.3 - 2025-07-04
Previous release. See GitHub releases for details.