Skip to content

Conversation

@haleychaas
Copy link
Contributor

Updates all necessary links from api.slack.com/x to their equivalent on docs.slack.dev. I also did some copy editing and applying guidelines from our style guide. (changes are docs only)

Category (place an x in each of the [ ])

  • bolt (Bolt for Java)
  • bolt-{sub modules} (Bolt for Java - optional modules)
  • slack-api-client (Slack API Clients)
  • slack-api-model (Slack API Data Models)
  • slack-api-*-kotlin-extension (Kotlin Extensions for Slack API Clients)
  • slack-app-backend (The primitive layer of Bolt for Java)

Requirements

Please read the Contributing guidelines and Code of Conduct before creating this issue or pull request. By submitting, you agree to those rules.

@codecov
Copy link

codecov bot commented Jul 1, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 73.04%. Comparing base (2355639) to head (0431697).
Report is 1 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##               main    #1486   +/-   ##
=========================================
  Coverage     73.04%   73.04%           
  Complexity     4380     4380           
=========================================
  Files           475      475           
  Lines         14244    14244           
  Branches       1447     1447           
=========================================
  Hits          10404    10404           
  Misses         2986     2986           
  Partials        854      854           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

### What your Bolt app does

All your app needs to do to properly handle OAuth Flow are:
To properly handle the OAuth Flow:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
To properly handle the OAuth Flow:
To properly handle the OAuth flow:

To properly handle the OAuth Flow:

* Provide an endpoint starting OAuth flow by redirecting installers to Slack's Authorize endpoint with sufficient parameters
* Provide an endpoint starting the OAuth flow by redirecting installers to Slack's `authorize` endpoint with sufficient parameters
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* Provide an endpoint starting the OAuth flow by redirecting installers to Slack's `authorize` endpoint with sufficient parameters
* Provide an endpoint starting the OAuth flow by redirecting installers to the `authorize` endpoint with sufficient parameters

The Audit Logs API methods conform to Slack's [rate limits](https://docs.slack.dev/apis/web-api/rate-limits) and all methods are rated Tier 3. This allows for up to 50 calls per minute, with an allowance for sporadic bursts. Refer to [the API documentation](https://docs.slack.dev/admins/audit-logs-api) for more details.

`AsyncAuditClient`, the async client, has great consideration for Rate Limits.
The async client, `AsyncAuditClient`, has great consideration for rate limits. The async client internally has its queue systems to avoid burst traffics as much as possible while `AuditClient`, the synchronous client, always blindly sends requests. Both sync and async clients maintain the metrics data in a `MetricsDatastore` together. This allows the async client to accurately know the current traffic they generated toward the Slack platform and estimate the remaining amount to call.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The async client, `AsyncAuditClient`, has great consideration for rate limits. The async client internally has its queue systems to avoid burst traffics as much as possible while `AuditClient`, the synchronous client, always blindly sends requests. Both sync and async clients maintain the metrics data in a `MetricsDatastore` together. This allows the async client to accurately know the current traffic they generated toward the Slack platform and estimate the remaining amount to call.
The async client, `AsyncAuditClient`, takes rate limits into consideration. The async client internally has its queue systems to avoid burst traffics as much as possible while `AuditClient`, the synchronous client, always blindly sends requests. Both sync and async clients maintain the metrics data in a `MetricsDatastore` together. This allows the async client to accurately know the current traffic they generated toward the Slack platform and estimate the remaining amount to call.

## Use Web APIs / reply using `say` utility

When you need to call some Slack Web APIs in Bolt apps, use `ctx.client()` for it. The `MethodsClient` created by the method already holds a valid bot token. So, you don't need to give a token to it. Just calling a method with parameters as below works for you.
Use `ctx.client()` to call Slack Web API methods in Bolt apps. The `MethodsClient` created by the method already holds a valid bot token, so there is no need to provide a token to it. Simply call the method with parameters as below.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Use `ctx.client()` to call Slack Web API methods in Bolt apps. The `MethodsClient` created by the method already holds a valid bot token, so there is no need to provide a token to it. Simply call the method with parameters as below.
Use `ctx.client()` to call Slack Web API methods in Bolt apps. The `MethodsClient` created by the method already holds a valid bot token, so there is no need to provide a token to it. Call the method with parameters as below.

```

As you see, using `text` is fairly simple. The only thing to know is to give a string value with a valid format. Consult [Basic formatting with `mrkdwn`](https://docs.slack.dev/messaging/formatting-message-text) for understanding the markup language.
As you see, using `text` is fairly simple: give a string value with a valid format. Consult [Basic formatting with `mrkdwn`](https://docs.slack.dev/messaging/formatting-message-text) for understanding the markup language.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
As you see, using `text` is fairly simple: give a string value with a valid format. Consult [Basic formatting with `mrkdwn`](https://docs.slack.dev/messaging/formatting-message-text) for understanding the markup language.
Use `text` by providing a string value with a valid format. Consult [Basic formatting with `mrkdwn`](https://docs.slack.dev/messaging/formatting-message-text) for understanding the markup language.

```

You can use this way also for building a message for Incoming Webhooks and `response_url` calls.
You build a message for incoming webhooks and `response_url` calls this way too.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
You build a message for incoming webhooks and `response_url` calls this way too.
You can build a message for incoming webhooks and `response_url` calls this way too.

## Under the hood

If you hope to understand what is actually happening with the above code, reading the following (a bit pseudo) code may be helpful.
If you hope to understand what is happening with the above code, reading the following (a bit pseudo) code may be helpful.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
If you hope to understand what is happening with the above code, reading the following (a bit pseudo) code may be helpful.
If you hope to understand what is happening with the above code, reading the following (pseudo) code may be helpful.

<TabItem value="socket-mode" label="Socket Mode">

Only single source code is required to run your first-ever Bolt app. All you need to do is define the main method that starts `SocketModeApp`.
Only single source code is required to run your first Bolt app. All you need to do is define the main method that starts `SocketModeApp`.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Only single source code is required to run your first Bolt app. All you need to do is define the main method that starts `SocketModeApp`.
Only single source code is required to run your first Bolt app. You'll need to define the main method that starts `SocketModeApp`.

```

If you go with JDK 10+, thanks to [Local Variable Type Inference](https://developer.oracle.com/java/jdk-10-local-variable-type-inference.html), your code could be much more concise. To take advantage of it, install OpenJDK 11 and set the compatible Java versions in `build.gradle` as below. Also, configure the same on your IDE.
If you go with JDK 10+, thanks to [Local Variable Type Inference](https://docs.oracle.com/en/java/javase/21/language/local-variable-type-inference.html), your code could be much more concise. To take advantage of it, install OpenJDK 11 and set the compatible Java versions in `build.gradle` as below. Also, configure the same on your IDE.
Copy link
Contributor

@lukegalbraithrussell lukegalbraithrussell Jul 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
If you go with JDK 10+, thanks to [Local Variable Type Inference](https://docs.oracle.com/en/java/javase/21/language/local-variable-type-inference.html), your code could be much more concise. To take advantage of it, install OpenJDK 11 and set the compatible Java versions in `build.gradle` as below. Also, configure the same on your IDE.
If you go with JDK 10+, thanks to [Local Variable Type Inference](https://docs.oracle.com/en/java/javase/21/language/local-variable-type-inference.html), you can write more concise code. To do so, install OpenJDK 11 and set the compatible Java versions in `build.gradle` as below, configuring the same on your IDE.

<TabItem value="http" label="HTTP">

Only single source code is required to run your first-ever Bolt app. All you need to do is define the main method that starts `SlackAppServer`. Your server with the default configuration will listen to the 3000 port but it's configurable. Check other constructors of the class to customize the behavior.
Only single source code is required to run your first Bolt app. All you need to do is define the main method that starts `SlackAppServer`. Your server with the default configuration will listen to the 3000 port but it's configurable. Check other constructors of the class to customize the behavior.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Only single source code is required to run your first Bolt app. All you need to do is define the main method that starts `SlackAppServer`. Your server with the default configuration will listen to the 3000 port but it's configurable. Check other constructors of the class to customize the behavior.
Only single source code is required to run your first Bolt app. You'll need to define the main method that starts `SlackAppServer`. Your server with the default configuration will listen to the 3000 port but it's configurable. Check other constructors of the class to customize the behavior.

```

If you go with JDK 10+, thanks to [Local Variable Type Inference](https://developer.oracle.com/java/jdk-10-local-variable-type-inference.html), your code could be much more concise. To take advantage of it, install OpenJDK 11 and set the compatible Java versions in `build.gradle` as below. Also, configure the same on your IDE.
If you go with JDK 10+, thanks to [Local Variable Type Inference](https://docs.oracle.com/en/java/javase/21/language/local-variable-type-inference.html), your code could be much more concise. To take advantage of it, install OpenJDK 11 and set the compatible Java versions in `build.gradle` as below. Also, configure the same on your IDE.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
If you go with JDK 10+, thanks to [Local Variable Type Inference](https://docs.oracle.com/en/java/javase/21/language/local-variable-type-inference.html), your code could be much more concise. To take advantage of it, install OpenJDK 11 and set the compatible Java versions in `build.gradle` as below. Also, configure the same on your IDE.
If you go with JDK 10+, thanks to [Local Variable Type Inference](https://docs.oracle.com/en/java/javase/21/language/local-variable-type-inference.html), you can write more concise code. To do so, install OpenJDK 11 and set the compatible Java versions in `build.gradle` as below, configuring the same on your IDE.

As [Spring Boot](https://spring.io/projects/spring-boot) is one of the most popular web frameworks in the Java world, you may be curious about the possibility to let this Bolt app live together with it.

Rest assured about it! It's quick and easy to _inject_ Bolt into Spring Boot apps.
Rest assured, we can _inject_ Bolt into Spring Boot apps.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Rest assured, we can _inject_ Bolt into Spring Boot apps.
Don't worry, we can _inject_ Bolt into Spring Boot apps.

# Incoming webhooks

[Incoming Webhooks](https://docs.slack.dev/messaging/sending-messages-using-incoming-webhooks) is a simple way to post messages from apps into Slack. Creating an Incoming Webhook gives you a unique URL to which you send a JSON payload with the message and some options.
[Incoming webhooks](https://docs.slack.dev/messaging/sending-messages-using-incoming-webhooks) are a simple way to post messages from apps into Slack. Creating an incoming webhook gives you a unique URL to which you send a JSON payload with the message and some options.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
[Incoming webhooks](https://docs.slack.dev/messaging/sending-messages-using-incoming-webhooks) are a simple way to post messages from apps into Slack. Creating an incoming webhook gives you a unique URL to which you send a JSON payload with the message and some options.
[Incoming webhooks](https://docs.slack.dev/messaging/sending-messages-using-incoming-webhooks) are a straightforward way to post messages from apps into Slack. Creating an incoming webhook gives you a unique URL to which you send a JSON payload with the message and some options.


* Visit the [Issue Tracker](http://github.com/slackapi/java-slack-sdk/issues) for questions, bug reports, feature requests, and general discussion related to Bolt for JavaScript. Try searching for an existing issue before creating a new one.
* Visit the [Slack Developer Community](https://slackcommunity.com/) for getting help or for just bonding with your fellow Slack developers.
* Visit the [Issue Tracker](http://github.com/slackapi/java-slack-sdk/issues) for questions, bug reports, feature requests, and general discussion related to Bolt for Java. Try searching for an existing issue before creating a new one.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i am embarrassed

Within these docs, there are two different modules:

* [Bolt for Java Guides](/guides/getting-started-with-bolt), which is a framework with a simple API that makes it easy to write modern Slack apps in Java.
* [Bolt for Java Guides](/guides/getting-started-with-bolt), which is a framework with a simple API that makes it easy to write Slack apps in Java.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* [Bolt for Java Guides](/guides/getting-started-with-bolt), which is a framework with a simple API that makes it easy to write Slack apps in Java.
* [Bolt for Java Guides](/guides/getting-started-with-bolt), which is a framework with a simplified API that helps write Slack apps in Java.

# Web API for Org Admins

The method names of a portion of [API Methods](https://docs.slack.dev/reference/methods) start with `admin.`. These APIs are not available for all developers. They are supposed to be used by [Enterprise Grid](https://docs.slack.dev/enterprise-grid/) Organization administrators.
The method names of a portion of [API Methods](https://docs.slack.dev/reference/methods) start with `admin.`. These APIs are not available for all developers. They are intended to be used by [Enterprise Grid](https://docs.slack.dev/enterprise-grid/) organization administrators.
Copy link
Contributor

@lukegalbraithrussell lukegalbraithrussell Jul 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The method names of a portion of [API Methods](https://docs.slack.dev/reference/methods) start with `admin.`. These APIs are not available for all developers. They are intended to be used by [Enterprise Grid](https://docs.slack.dev/enterprise-grid/) organization administrators.
The method names of a portion of [API methods](https://docs.slack.dev/reference/methods) start with `admin.`. These API methods are not available for all developers. They are intended to be used by [Enterprise Grid](https://docs.slack.dev/enterprise-grid/) organization administrators.

## Build from source

You may want to build the latest revision on your own. In the case of building from source, go with the following steps.
You may want to build the latest revision on your own. In the case of building from source, exeute the following commands in your terminal.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
You may want to build the latest revision on your own. In the case of building from source, exeute the following commands in your terminal.
You may want to build the latest revision on your own. In the case of building from source, execute the following commands in your terminal.

Comment on lines 26 to 27
When you add Spring Boot extensions such as Spring Security, the app may not work well with Bolt.
In that case, consider splitting the app into a few and make the Bolt app as simple as possible.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
When you add Spring Boot extensions such as Spring Security, the app may not work well with Bolt.
In that case, consider splitting the app into a few and make the Bolt app as simple as possible.
When you add Spring Boot extensions such as Spring Security, the app may not work well with Bolt. In that case, consider splitting the app into a few and make the Bolt app as simple as possible.

## Call current status API in Java

As with other API clients, you can call **Slack**'s method `status()` to create an API client and then call `current()` to perform an HTTP request.
As with other API clients, you can call `Slack`'s method `status()` to create an API client and then call `current()` to perform an HTTP request.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
As with other API clients, you can call `Slack`'s method `status()` to create an API client and then call `current()` to perform an HTTP request.
As with other API clients, you can call the Slack `status()` method to create an API client and then call `current()` to perform an HTTP request.

## Under the hood

If you hope to understand what is actually happening with the above code, reading the following (a bit pseudo) code may be helpful.
If you hope to understand what is happening with the above code, reading the following (a bit pseudo) code may be helpful.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
If you hope to understand what is happening with the above code, reading the following (a bit pseudo) code may be helpful.
If you hope to understand what is happening with the above code, reading the following (pseudo) code may be helpful.

## Under the hood

If you hope to understand what is actually happening with the above code, reading the following (a bit pseudo) code may be helpful.
If you hope to understand what is happening with the above code, reading the following (a bit pseudo) code may be helpful.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
If you hope to understand what is happening with the above code, reading the following (a bit pseudo) code may be helpful.
If you hope to understand what is happening with the above code, reading the following (pseudo) code may be helpful.

## Under the Hood

If you hope to understand what is actually happening with the above code, reading the following (a bit pseudo) code may be helpful.
If you hope to understand what is happening with the above code, reading the following (a bit pseudo) code may be helpful.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
If you hope to understand what is happening with the above code, reading the following (a bit pseudo) code may be helpful.
If you hope to understand what is happening with the above code, reading the following (pseudo) code may be helpful.

Copy link
Contributor

@technically-tracy technically-tracy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for giving these docs some much-needed TLC!

final SlackSignature.Generator generator = new SlackSignature.Generator(secret);

String realPayload = "{\"type\":\"block_actions\",\"team\":{\"id\":\"T123\",\"domain\":\"test-test\"},\"user\":{\"id\":\"U123\",\"username\":\"test-test\",\"name\":\"test-test\",\"team_id\":\"T123\"},\"api_app_id\":\"A123\",\"token\":\"legacy-fixed-value\",\"container\":{\"type\":\"view\",\"view_id\":\"V123\"},\"trigger_id\":\"987196394372.3485157640.efe5ca926abc9dadb0371534fff4326e\",\"view\":{\"id\":\"V123\",\"team_id\":\"T123\",\"type\":\"home\",\"blocks\":[{\"type\":\"section\",\"block_id\":\"hltsY\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"*Here's what you can do with Project Tracker:*\",\"verbatim\":false}},{\"type\":\"actions\",\"block_id\":\"home_actions\",\"elements\":[{\"type\":\"button\",\"action_id\":\"home_button_1\",\"text\":{\"type\":\"plain_text\",\"text\":\"Create New Task\",\"emoji\":true},\"style\":\"primary\",\"value\":\"create_task\"},{\"type\":\"button\",\"action_id\":\"home_button_2\",\"text\":{\"type\":\"plain_text\",\"text\":\"Create New Project\",\"emoji\":true},\"value\":\"create_project\"},{\"type\":\"button\",\"action_id\":\"home_button_3\",\"text\":{\"type\":\"plain_text\",\"text\":\"Help\",\"emoji\":true},\"value\":\"help\"}]},{\"type\":\"context\",\"block_id\":\"BNV\",\"elements\":[{\"fallback\":\"20x20px image\",\"image_url\":\"https:\\/\\/api.slack.com\\/img\\/blocks\\/bkb_template_images\\/placeholder.png\",\"image_width\":20,\"image_height\":20,\"image_bytes\":96,\"type\":\"image\",\"alt_text\":\"placeholder\"}]},{\"type\":\"section\",\"block_id\":\"z61\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"*Your Configurations*\",\"verbatim\":false}},{\"type\":\"divider\",\"block_id\":\"F6ZOo\"},{\"type\":\"section\",\"block_id\":\"NmR\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"*#public-relations*\\n<fakelink.toUrl.com|PR Strategy 2019> posts new tasks, comments, and project updates to <fakelink.toChannel.com|#public-relations>\",\"verbatim\":false},\"accessory\":{\"type\":\"button\",\"text\":{\"type\":\"plain_text\",\"text\":\"Edit\",\"emoji\":true},\"value\":\"public-relations\",\"action_id\":\"czws\"}},{\"type\":\"divider\",\"block_id\":\"QAaXg\"},{\"type\":\"section\",\"block_id\":\"LqY\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"*#team-updates*\\n<fakelink.toUrl.com|Q4 Team Projects> posts project updates to <fakelink.toChannel.com|#team-updates>\",\"verbatim\":false},\"accessory\":{\"type\":\"button\",\"text\":{\"type\":\"plain_text\",\"text\":\"Edit\",\"emoji\":true},\"value\":\"public-relations\",\"action_id\":\"BOp7O\"}},{\"type\":\"divider\",\"block_id\":\"NGZ\"},{\"type\":\"actions\",\"block_id\":\"QFv\",\"elements\":[{\"type\":\"button\",\"action_id\":\"home_button_4\",\"text\":{\"type\":\"plain_text\",\"text\":\"New Configuration\",\"emoji\":true},\"value\":\"new_configuration\"}]}],\"private_metadata\":\"\",\"callback_id\":\"\",\"state\":{\"values\":{}},\"hash\":\"1583634748.7562ffd9\",\"title\":{\"type\":\"plain_text\",\"text\":\"View Title\",\"emoji\":true},\"clear_on_close\":false,\"notify_on_close\":false,\"close\":null,\"submit\":null,\"previous_view_id\":null,\"root_view_id\":\"V123\",\"app_id\":\"A123\",\"external_id\":\"\",\"app_installed_team_id\":\"T123\",\"bot_id\":\"B123\"},\"actions\":[{\"action_id\":\"home_button_1\",\"block_id\":\"home_actions\",\"text\":{\"type\":\"plain_text\",\"text\":\"Create New Task\",\"emoji\":true},\"value\":\"create_task\",\"style\":\"primary\",\"type\":\"button\",\"action_ts\":\"1583635577.758298\"}]}";
String realPayload = "{\"type\":\"block_actions\",\"team\":{\"id\":\"T123\",\"domain\":\"test-test\"},\"user\":{\"id\":\"U123\",\"username\":\"test-test\",\"name\":\"test-test\",\"team_id\":\"T123\"},\"api_app_id\":\"A123\",\"token\":\"legacy-fixed-value\",\"container\":{\"type\":\"view\",\"view_id\":\"V123\"},\"trigger_id\":\"987196394372.3485157640.efe5ca926abc9dadb0371534fff4326e\",\"view\":{\"id\":\"V123\",\"team_id\":\"T123\",\"type\":\"home\",\"blocks\":[{\"type\":\"section\",\"block_id\":\"hltsY\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"*Here's what you can do with Project Tracker:*\",\"verbatim\":false}},{\"type\":\"actions\",\"block_id\":\"home_actions\",\"elements\":[{\"type\":\"button\",\"action_id\":\"home_button_1\",\"text\":{\"type\":\"plain_text\",\"text\":\"Create New Task\",\"emoji\":true},\"style\":\"primary\",\"value\":\"create_task\"},{\"type\":\"button\",\"action_id\":\"home_button_2\",\"text\":{\"type\":\"plain_text\",\"text\":\"Create New Project\",\"emoji\":true},\"value\":\"create_project\"},{\"type\":\"button\",\"action_id\":\"home_button_3\",\"text\":{\"type\":\"plain_text\",\"text\":\"Help\",\"emoji\":true},\"value\":\"help\"}]},{\"type\":\"context\",\"block_id\":\"BNV\",\"elements\":[{\"fallback\":\"20x20px image\",\"image_url\":\"https:\\/\\/docs.slack.dev\\/img\\/blocks\\/bkb_template_images\\/placeholder.png\",\"image_width\":20,\"image_height\":20,\"image_bytes\":96,\"type\":\"image\",\"alt_text\":\"placeholder\"}]},{\"type\":\"section\",\"block_id\":\"z61\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"*Your Configurations*\",\"verbatim\":false}},{\"type\":\"divider\",\"block_id\":\"F6ZOo\"},{\"type\":\"section\",\"block_id\":\"NmR\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"*#public-relations*\\n<fakelink.toUrl.com|PR Strategy 2019> posts new tasks, comments, and project updates to <fakelink.toChannel.com|#public-relations>\",\"verbatim\":false},\"accessory\":{\"type\":\"button\",\"text\":{\"type\":\"plain_text\",\"text\":\"Edit\",\"emoji\":true},\"value\":\"public-relations\",\"action_id\":\"czws\"}},{\"type\":\"divider\",\"block_id\":\"QAaXg\"},{\"type\":\"section\",\"block_id\":\"LqY\",\"text\":{\"type\":\"mrkdwn\",\"text\":\"*#team-updates*\\n<fakelink.toUrl.com|Q4 Team Projects> posts project updates to <fakelink.toChannel.com|#team-updates>\",\"verbatim\":false},\"accessory\":{\"type\":\"button\",\"text\":{\"type\":\"plain_text\",\"text\":\"Edit\",\"emoji\":true},\"value\":\"public-relations\",\"action_id\":\"BOp7O\"}},{\"type\":\"divider\",\"block_id\":\"NGZ\"},{\"type\":\"actions\",\"block_id\":\"QFv\",\"elements\":[{\"type\":\"button\",\"action_id\":\"home_button_4\",\"text\":{\"type\":\"plain_text\",\"text\":\"New Configuration\",\"emoji\":true},\"value\":\"new_configuration\"}]}],\"private_metadata\":\"\",\"callback_id\":\"\",\"state\":{\"values\":{}},\"hash\":\"1583634748.7562ffd9\",\"title\":{\"type\":\"plain_text\",\"text\":\"View Title\",\"emoji\":true},\"clear_on_close\":false,\"notify_on_close\":false,\"close\":null,\"submit\":null,\"previous_view_id\":null,\"root_view_id\":\"V123\",\"app_id\":\"A123\",\"external_id\":\"\",\"app_installed_team_id\":\"T123\",\"bot_id\":\"B123\"},\"actions\":[{\"action_id\":\"home_button_1\",\"block_id\":\"home_actions\",\"text\":{\"type\":\"plain_text\",\"text\":\"Create New Task\",\"emoji\":true},\"value\":\"create_task\",\"style\":\"primary\",\"type\":\"button\",\"action_ts\":\"1583635577.758298\"}]}";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch 💯 good catch!

### What your Bolt app does

All your app needs to do to properly handle OAuth Flow are:
To properly handle the OAuth flow:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚀

|`AuditClient#getActions()`|`GET /actions`|

### getLogs()
### `getLogs()`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TIL

```

If you go with JDK 10+, thanks to [Local Variable Type Inference](https://developer.oracle.com/java/jdk-10-local-variable-type-inference.html), your code could be much more concise. To take advantage of it, install OpenJDK 11 and set the compatible Java versions in `build.gradle` as below. Also, configure the same on your IDE.
If you go with JDK 10+, thanks to [Local Variable Type Inference](https://docs.oracle.com/en/java/javase/21/language/local-variable-type-inference.html), you can write more concise code. To do so, install OpenJDK 11 and set the compatible Java versions in `build.gradle` as below, configuring the same on your IDE.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice 💯

Comment on lines -7 to -9
/**
* https://api.slack.com/methods/admin.conversations.whitelist.remove
*/
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fair this is deprecated 🚀

@haleychaas haleychaas merged commit acaeae6 into main Jul 8, 2025
8 of 9 checks passed
@zimeg zimeg added the docs M-T: Documentation work only label Jul 9, 2025
@seratch
Copy link
Contributor

seratch commented Jul 11, 2025

Wow, this is fantastic! 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs M-T: Documentation work only

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants