Skip to content

Releases: slack-go/slack

v0.23.0

22 Apr 20:00
35d8f31

Choose a tag to compare

Added

  • feat(socketmode): expose socketmode handler dispatcher method by @nlopes in #1550
  • feat(block): add card and carousel blocks by @nlopes in #1551
  • feat(assistant): add username and icon to status update by @charleenwang in #1553
  • feat(block): add alert block by @nlopes in #1552

New Contributors

Full Changelog: v0.22.0...v0.23.0

v0.22.0

12 Apr 14:02
f482b19

Choose a tag to compare

What's Changed

Added

  • OAuth PKCE support - OAuthOptionCodeVerifier option for GetOAuthV2Response, plus GenerateCodeVerifier() and GenerateCodeChallenge() helpers (RFC 7636). client_secret is now conditionally omitted when empty in both GetOAuthV2ResponseContext and RefreshOAuthV2TokenContext.
  • Manifest scope fields - BotOptional and UserOptional on OAuthScopes.
  • Rich text styles - Underline, Highlight, ClientHighlight, and Unlink on RichTextSectionTextStyle. Style field on RichTextSectionUserGroupElement.
  • Assistant search context - Sort, SortDir, Before, After, Highlight, IncludeContextMessages, IncludeDeletedUsers, IncludeMessageBlocks, IncludeArchivedChannels, DisableSemanticSearch, Modifiers, TermClauses parameters and new response types (AssistantSearchContextFile, AssistantSearchContextChannel, AssistantSearchContextMessageContext).

Fixed

  • socketmode: malformed JSON no longer forces reconnect - json.SyntaxError and json.UnmarshalTypeError now emit an EventTypeIncomingError event and continue reading instead of killing the WebSocket connection.
  • socketmode: debug_reconnects query param applied correctly - the parameter was silently discarded due to a missing url.RawQuery assignment.
  • ChannelTypes and ContentTypes now send comma-separated values instead of repeated form keys, matching the convention used by every other method in the library.

Docs

  • assistant:write scope marked as deprecated in favour of chat:write.

Full Changelog: v0.21.1...v0.22.0

v0.21.1

08 Apr 16:10
6d77e45

Choose a tag to compare

v0.21.1

Added

  • MessageEvent channel type helpers — New ChannelTypeChannel, ChannelTypeGroup,
    ChannelTypeIM, and ChannelTypeMPIM constants plus IsChannel(), IsGroup(), IsIM(), and
    IsMpIM() convenience methods on MessageEvent. No more comparing raw strings to figure out where a
    message came from:
if ev.IsIM() {
    // handle direct message
}

Fixed

  • MessageEvent doc typo — ChannelType documentation listed "mim" instead of the correct "mpim".
  • Duplicate attachment/block serialization — MsgOptionAttachments and MsgOptionBlocks were serializing
    payloads twice (once for the response-URL JSON path, once for the form POST path). Serialization now
    happens once inside formSender.BuildRequestContext. (#1547)

Note

UnsafeApplyMsgOptions no longer includes attachments/blocks keys in the returned values, since marshalling is deferred to send time. This function is documented as unsupported.

v0.21.0

05 Apr 21:52
fc49102

Choose a tag to compare

Warning

This release contains multiple breaking changes. Please review the sections below before upgrading.

Breaking changes

Removed APIs

  • IM struct removed — Use Conversation instead. IsUserDeleted has been moved there.
  • Info.GetBotByID, GetUserByID, GetChannelByID, GetGroupByID, GetIMByID removed — These were deprecated and returned nil unconditionally. Remove any calls to them.

Signature changes

  • ListReactions now uses cursor-based pagination — Returns ([]ReactedItem, string, error) instead of ([]ReactedItem, *Paging, error). ListReactionsParameters replaces Count/Page with Cursor/Limit.

    // Before
    items, paging, err := api.ListReactions(params)
    // After
    items, nextCursor, err := api.ListReactions(params)
  • ListStars/GetStarred now use cursor-based pagination — Same pattern: returns string (next cursor) instead of *Paging. StarsParameters replaces Count/Page with Cursor/Limit.

  • GetAccessLogs now uses cursor-based pagination — Same pattern: returns string (next cursor) instead of *Paging. AccessLogParameters replaces Count/Page with Cursor/Limit.

  • Ack() and Send() now return error (Socket Mode) — Large payloads (≥20KB) that Slack silently dropped are now rejected with an error. Existing call sites that ignore the return value still compile.

Type changes

  • WebhookMessage.UnfurlLinks / UnfurlMedia*bool — Required to distinguish "omit" from "false".

    // Before
    msg := slack.WebhookMessage{UnfurlLinks: true}
    // After
    t := true
    msg := slack.WebhookMessage{UnfurlLinks: &t}
  • User.Has2FA*boolnil means absent/unknown (bot tokens), false means explicitly disabled.

Behavior changes

  • MsgOptionBlocks() with no arguments now sends blocks=[] — Previously a silent no-op. If you relied on that, remove the option entirely.
  • admin error strings now start with lowercase — If you match error content in your code, update your comparisons.

Added

  • admin.teams.settings.* API support — Full suite: AdminTeamsSettingsInfo, SetDefaultChannels, SetDescription, SetDiscoverability, SetIcon, SetName ([#960])
  • BlockFromJSON / MustBlockFromJSON — Create blocks from raw JSON strings, enabling direct use of output from Slack's Block Kit Builder ([#1497])
  • GetOpenIDConnectUserInfo — Returns identity info via openid.connect.userInfo ([#967])
  • OAuthOptionAPIURL for package-level OAuth functions — Override the Slack API URL for testing ([#744])
  • HTTP response headers — Access Slack response headers (X-OAuth-Scopes, X-Ratelimit-*, etc.) via OptionOnResponseHeaders callback ([#1076])
  • API warning callbacks — Register OptionWarnings(func(warnings []string)) to receive Slack deprecation notices ([#1540])
  • DNDOptionTeamID — Pass team_id to GetDNDInfo/GetDNDTeamInfo, required after workspace migration ([#1157])
  • UpdateUserGroupMembersList — Accepts []string instead of comma-separated string ([#1172])
  • SetUserProfile — Set multiple profile fields in a single API call ([#1158])
  • RTM eventsuser_status_changed, user_huddle_changed, user_profile_changed, sh_room_join, sh_room_leave, sh_room_update, channel_updated ([#1541], [#858])
  • Socket Mode handlersHandleShortcut, HandleViewSubmission, HandleViewClosed for Level 3 dispatch by CallbackID ([#1161])
  • New fieldsUsername on User ([#1218]), Blocks/Attachments/Files/Upload on AppMentionEvent ([#961]), Blocks on MessageEvent ([#1257]), IsConnectorBot/IsWorkflowBot on User, GuestInvitedBy on UserProfile, CacheTS/EventTS on UserChangeEvent

Fixed

  • UnknownBlock round-trip data loss — Unrecognized block types now preserve their full JSON through unmarshal/marshal cycles
  • WorkflowButtonBlockElement missing from UnmarshalJSON — Plus missing multi_*_select and file_input cases ([#1539])
  • NewBlockHeader nil pointer dereference — Passing a nil text object no longer panics ([#1236])
  • ValidateUniqueBlockID false positives — Empty block_id strings no longer flagged as duplicates ([#1184])
  • Socket Mode: large Ack payloads silently failing — Now uses 32KB write buffer and rejects payloads ≥20KB with an error ([#1196])

Deprecated

  • slackevents.ParseActionEvent — Cannot parse block_actions. Use slack.InteractionCallback with json.Unmarshal instead ([#596])
  • slackevents.MessageAction, MessageActionEntity, MessageActionResponse — Legacy interactive_message types only

Full Changelog: v0.20.0...v0.21.0

v0.20.0

21 Mar 22:19
449e341

Choose a tag to compare

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.

Added

  • workflow_id and trigger_id in Message — It seems that some types of messages,
    e.g: bot_message, can carry trigger_id and workflow_id. WorkflowID was added by @clayallsopp in #1537
  • RichTextQuote.Border field — optional border toggle (matches the docs now)
  • RichTextPreformatted.Language field — enables syntax highlighting for preformatted
    blocks

Fixed

  • Remove embedding of RichTextSectionRichTextQuote and RichTextPreformatted
    are now flattened as they should have always been. This is a breaking change for anyone
    using these structs directly.

New Contributors

Full Changelog: v0.19.0...v0.20.0

v0.19.0

04 Mar 21:39
eaddf77

Choose a tag to compare

Added

  • Add support for task_card and plan agent blocks by @nlopes in #1536
  • Add optional HTTP retry for Web API (429, 5xx, connection errors) by @olegbespalov in #1532

Full Changelog: v0.18.0...v0.19.0

v0.18.0

21 Feb 15:59
e5ea969

Choose a tag to compare

This is the first stable release in the 0.18.x series — it includes everything from rc1 and rc2 plus a handful of new features and fixes that landed since.

There are a few breaking changes in this one. I tried to keep them to the minimum necessary but some were long overdue. Here's what you need to know.

Breaking changes

File upload API cleanup (#1481)

Slack discontinued the old files.upload API back in November 2025, so we finally removed the deprecated UploadFile, UploadFileContext, and FileUploadParameters. The V2 variants have been renamed to drop the suffix:

  • UploadFileV2UploadFile
  • UploadFileV2ContextUploadFileContext
  • UploadFileV2ParametersUploadFileParameters

Should be a quick search-and-replace for most codebases.

GetReactions return type (#1480)

GetReactions now returns ReactedItem instead of []ItemReaction. This aligns with what the Slack API actually returns — the item itself (message, file, or file_comment) alongside its reactions. To migrate, use resp.Reactions to get at the slice.

Settings pointer fields (#1461)

Settings.Interactivity and Settings.EventSubscriptions are now pointers so they can be properly omitted when empty. You'll need nil checks if you're accessing these directly.

Minimum Go version is now 1.25

Up from 1.22 in v0.17.x. The go.mod directive is go 1.25.

Added

  • Admin Conversations API — Full admin.conversations.* support: core operations, bulk operations, preferences, retention, restrict access, and EKM channel info. (#1329)
  • admin.roles.* API methodslistAssignments, addAssignments, and removeAssignments. (#1520)
  • Chat Streaming API — Real-time chat streaming with example usage. (#1506)
  • Data Access API — Full support with example implementation. (#1439)
  • Work Objects — Chat unfurl with Work Object metadata, entity details (flexpane), entity_details_requested event, and associated types. (#1529)
  • Huddle supportHuddleRoom, HuddleParticipantEvent, and HuddleRecording types for huddle events.
  • Table blocks — Parse and create table blocks. (#1490, #1511)
  • Context actions blockcontext_actions block type. (#1495)
  • Workflow buttonworkflow_button block element. (#1499)
  • Call block dataCallBlock now includes full call data. (#897)
  • Cursor-based GetUsers pagination (#1465)
  • GetAllConversations with pagination — Automatic pagination with rate limit handling. (#1463)
  • focus_on_load for remaining block elements — selects, multi-selects, datepicker, timepicker, plain_text_input, checkboxes, radio_buttons, number_input. (#1519)
  • Missing User/UserProfile/EnterpriseUser fieldswho_can_share_contact_card, always_active, pronouns, image_1024, and more. (#1526)
  • PlainText/PreviewPlainText on File — Email file objects now include plain text body fields. (#1522)
  • Attachment image fieldsImageBytes, ImageHeight, ImageWidth. (#1516)
  • RecordChannel conversation property (#1513)
  • Title for CreateChannelCanvas (#1483)
  • loading_messages for SetAssistantThreadsStatus (#1489)
  • PostEphemeral handler for slacktest (#1517)
  • PreviewImageName for remote files
  • Audit Logs example (#1144)

Fixed

  • File upload error wrappingUploadFile now tells you which of the three upload steps failed. (#1491)
  • Audit Logs API endpointGetAuditLogs was hitting the wrong endpoint; now uses api.slack.com. Added OptionAuditAPIURL for testing. (#1144)
  • Socket mode dial debugging — Debug logging for custom dialer failures. Helps with proxy/TLS issues. (#1360)
  • MsgOptionPostMessageParameters metadata — Was silently dropping MetaData. (#1343)
  • UserProfile.Skype JSON tag — Fixed typo "skyp""skype". (#1524)
  • assistant.threads.setSuggestedPrompts title — Now actually sent when non-empty. (#1528)
  • PublishView empty hash — No longer sends empty hash in payload. (#1515)
  • ImageBlockElement validation — Properly validates imageURL or SlackFile. (#1488)
  • Rich text section channel return (#1472)
  • KickUserFromConversation error handling — Errors now parsed as a map. (#1471)

Changed

  • CI test matrix: dropped Go 1.24, added Go 1.26; bumped golangci-lint to v2.10.1. (#1530)

Full Changelog: v0.17.3...v0.18.0

v0.18.0-rc2

28 Jan 23:29
efd43a0

Choose a tag to compare

v0.18.0-rc2 Pre-release
Pre-release

⚠️ Breaking Changes

  • Removed deprecated UploadFile, UploadFileContext, and FileUploadParameters. The files.upload API was discontinued by Slack on November 12, 2025. ([#1481])
  • Renamed UploadFileV2UploadFile, UploadFileV2ContextUploadFileContext, and UploadFileV2ParametersUploadFileParameters. The "V2" suffix is no longer needed now that the old API is removed. ([#1481])

Added

  • 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])

Changed

  • BREAKING: Removed deprecated UploadFile, UploadFileContext, and
    FileUploadParameters. The files.upload API was discontinued by Slack on November
    12, 2025. ([#1481])
  • BREAKING: Renamed UploadFileV2UploadFile, UploadFileV2Context
    UploadFileContext, and UploadFileV2ParametersUploadFileParameters. The "V2"
    suffix is no longer needed now that the old API is removed. ([#1481])

Fixed

  • File upload error wrapping - UploadFile now wraps errors with the step name
    (GetUploadURLExternal, UploadToURL, or CompleteUploadExternal) so callers can
    identify which of the three upload steps failed. ([#1491])
  • Audit Logs API endpoint - Fixed GetAuditLogs to 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. Added OptionAuditAPIURL for 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])
  • MsgOptionPostMessageParameters now passes MetaData - Previously, metadata was
    silently dropped when using PostMessageParameters. ([#1343])

Full Changelog: v0.18.0-rc1...v0.18.0-rc2

v0.18.0-rc1

26 Jan 23:32
e985252

Choose a tag to compare

v0.18.0-rc1 Pre-release
Pre-release

This is a release candidate for v0.18.0. Please test and report any issues.

⚠️ Breaking Changes

  • GetReactions now returns ReactedItem instead of []ItemReaction. To migrate, use resp.Reactions to access the slice of reactions. (#1480)
  • Settings struct fields Interactivity and EventSubscriptions are now pointers, allowing them to be omitted when empty. (#1461)
  • Minimum Go version bumped to 1.24. (#1504)

Added

  • Huddle support (HuddleRoom, HuddleParticipantEvent, HuddleRecording) for huddle_thread events
  • Call block data parsing with CallBlockData, CallBlockDataV1, CallBlockIconURLs (#897)
  • Chat Streaming API (#1506)
  • Data Access API (#1439)
  • Cursor-based pagination for GetUsers (#1465)
  • GetAllConversations with automatic pagination (#1463)
  • Table blocks support (#1490, #1511)
  • Context actions block (#1495)
  • Workflow button block element (#1499)
  • loading_messages parameter for SetAssistantThreadsStatus (#1489)
  • Attachment image fields: ImageBytes, ImageHeight, ImageWidth (#1516)
  • RecordChannel conversation property (#1513)
  • Title argument for CreateChannelCanvas (#1483)
  • PostEphemeral handler for slacktest (#1517)
  • PreviewImageName for remote files

Fixed

  • PublishView no longer sends empty hash (#1515)
  • ImageBlockElement validation (#1488)
  • Rich text section channel return (#1472)
  • KickUserFromConversation error handling (#1471)

All PRs

  • Make it possible to omit fields in the manifest Settings struct by @pmarkowsky in #1461
  • Get all conversations with pagination by @dorkauf in #1463
  • fix: KickUserFromConversation errors as a map by @nlopes in #1471
  • fix: ensure we return channel for section channel rich text by @nlopes in #1472
  • chore(deps): bump github.com/stretchr/testify from 1.10.0 to 1.11.0 by @dependabot[bot] in #1469
  • feat: add cursor-based pagination support for user retrieval by @KamikazeZirou in #1465
  • chore(deps): bump actions/checkout from 4 to 5 by @dependabot[bot] in #1467
  • chore(deps): bump actions/setup-go from 5 to 6 by @dependabot[bot] in #1477
  • chore(deps): bump actions/stale from 9.1.0 to 10.0.0 by @dependabot[bot] in #1478
  • support Data Access API by @nktks in #1439
  • chore(deps): bump actions/stale from 10.0.0 to 10.1.0 by @dependabot[bot] in #1484
  • feat: add support for optional "loading_messages" parameter in SetAssistantThreadsStatus by @VDVsx in #1489
  • chore(deps): bump golangci/golangci-lint-action from 8.0.0 to 9.0.0 by @dependabot[bot] in #1492
  • feat: add mise.toml by @tgvashworth in #1496
  • Add support for table blocks by @williamclot in #1490
  • feat: add support for context_actions block by @tgvashworth in #1495
  • fix: ensure imageURL or SlackFile for ImageBlockElement by @nhsieh in #1488
  • feat: add support for workflow_button as a block element by @nlopes in #1499
  • chore(deps): bump actions/checkout from 5 to 6 by @dependabot[bot] in #1502
  • chore(deps): bump golangci/golangci-lint-action from 9.0.0 to 9.1.0 by @dependabot[bot] in #1501
  • ci,fix: bump base go version to 1.24 by @nlopes in #1504
  • ci: fix lint step by @nlopes in #1505
  • docs(conversation): update GetConversationHistory function comments by @yatiac in #1507
  • Adds Chat Streaming API Support by @k-k in #1506
  • chore(deps): bump actions/stale from 10.1.0 to 10.1.1 by @dependabot[bot] in #1508
  • chore(deps): bump golangci/golangci-lint-action from 9.1.0 to 9.2.0 by @dependabot[bot] in #1509
  • feat: handle unmarshal table block by @chinathaip in #1511
  • Add RecordChannel to conversation Properties by @chigley in #1513
  • Add support for title argument in CreateChannelCanvas method by @jarospisak-unity in #1483
  • feat: Align GetReactions with Slack API by @olegbespalov in #1480
  • fix(views): don't send empty hash with PublishView by @nlopes in #1515
  • feat(attachments): add ImageBytes, ImageHeight and ImageWidth by @nlopes in #1516
  • adds postephemeral handler to slacktest to audit outgoing messages by @nlopes in #1517

New Contributors

Full Changelog: v0.17.3...v0.18.0-rc1

v0.17.3

04 Jul 16:54
e29b7e3

Choose a tag to compare

What's New

Fixes

  • Parse simple string based errors as part of the response by @nlopes in #1452
    In the previous version we introduced the ability to parse specific errors (more complex ones) but Slack can still send us a string. string is now the fallback type.

Other

  • Examples are now using environment variables and command line arguments consistently by @nlopes in #1456
    Also added a ./examples/README.md explaining the patterns that should be used.

Full Changelog: v0.17.2...v0.17.3