Publish a static view for a User.
POSThttps://slack.com/api/views.publish
application/x-www-form-urlencoded
application/json
token
Authentication token bearing required scopes. Tokens should be passed as an HTTP Authorization header or alternatively, as a POST parameter.
xxxx-xxxxxxxxx-xxxx
view
A view payload. This must be a JSON-encoded string.
Create or update the view that comprises an app's Home tab for a specific user.
Assuming your view object was properly formatted, valid, and the user_id
was viable, you will receive a success response.
Typical success response includes the published view payload.
{
"ok": true,
"view": {
"id": "VMHU10V25",
"team_id": "T8N4K1JN",
"type": "home",
"close": null,
"submit": null,
"blocks": [
{
"type": "section",
"block_id": "2WGp9",
"text": {
"type": "mrkdwn",
"text": "A simple section with some sample sentence.",
"verbatim": false
}
}
],
"private_metadata": "Shh it is a secret",
"callback_id": "identify_your_home_tab",
"state": {
"values": {}
},
"hash": "156772938.1827394",
"clear_on_close": false,
"notify_on_close": false,
"root_view_id": "VMHU10V25",
"previous_view_id": null,
"app_id": "AA4928AQ",
"external_id": "",
"bot_id": "BA13894H"
}
}
Typical error response, before getting to any possible validation errors.
{
"ok": false,
"error": "invalid_arguments",
"response_metadata": {
"messages": [
"invalid `user_id`"
]
}
}
This table lists the expected errors that this method could return. However, other errors can be returned in the case where the service is down or other unexpected factors affect processing. Callers should always check the value of the ok
params in the response.
Error | Description |
---|---|
duplicate_external_id | Error returned when the given |
hash_conflict | Error returned when the provided |
missing_profile_id | A profile id was not provided when trying to publish a view of type profile. |
not_allowed_token_type | The token type used in this request is not allowed. |
not_enabled | Error returned if a |
not_implemented | The profile view experiment is not enabled for this user. |
view_too_large | Error returned if the provided view is greater than 250kb. |
access_denied | Access to a resource specified in the request is denied. |
account_inactive | Authentication token is for a deleted user or workspace when using a |
deprecated_endpoint | The endpoint has been deprecated. |
ekm_access_denied | Administrators have suspended the ability to post a message. |
enterprise_is_restricted | The method cannot be called from an Enterprise. |
invalid_auth | Some aspect of authentication cannot be validated. Either the provided token is invalid or the request originates from an IP address disallowed from making the request. |
method_deprecated | The method has been deprecated. |
missing_scope | The token used is not granted the specific scope permissions required to complete this request. |
not_authed | No authentication token provided. |
no_permission | The workspace token used in this request does not have the permissions necessary to complete the request. Make sure your app is a member of the conversation it's attempting to post a message to. |
org_login_required | The workspace is undergoing an enterprise migration and will not be available until migration is complete. |
token_expired | Authentication token has expired |
token_revoked | Authentication token is for a deleted user or workspace or the app has been removed when using a |
two_factor_setup_required | Two factor setup is required. |
accesslimited | Access to this method is limited on the current network |
fatal_error | The server could not complete your operation(s) without encountering a catastrophic error. It's possible some aspect of the operation succeeded before the error was raised. |
internal_error | The server could not complete your operation(s) without encountering an error, likely due to a transient issue on our end. It's possible some aspect of the operation succeeded before the error was raised. |
invalid_arg_name | The method was passed an argument whose name falls outside the bounds of accepted or expected values. This includes very long names and names with non-alphanumeric characters other than |
invalid_arguments | The method was either called with invalid arguments or some detail about the arguments passed is invalid, which is more likely when using complex arguments like blocks or attachments. |
invalid_array_arg | The method was passed an array as an argument. Please only input valid strings. |
invalid_charset | The method was called via a |
invalid_form_data | The method was called via a |
invalid_post_type | The method was called via a |
missing_post_type | The method was called via a |
ratelimited | The request has been ratelimited. Refer to the |
request_timeout | The method was called via a |
service_unavailable | The service is temporarily unavailable |
team_added_to_org | The workspace associated with your request is currently undergoing migration to an Enterprise Organization. Web API and other platform operations will be intermittently unavailable until the transition is complete. |
This table lists the expected warnings that this method will return. However, other warnings can be returned in the case where the service is experiencing unexpected trouble.
Warning | Description |
---|---|
missing_charset | The method was called via a |
superfluous_charset | The method was called via a |
import com.slack.api.bolt.App; import com.slack.api.bolt.AppConfig; import com.slack.api.bolt.jetty.SlackAppServer; import com.slack.api.methods.SlackApiException; import com.slack.api.model.event.AppHomeOpenedEvent; import java.io.IOException; import static com.slack.api.model.block.Blocks.*; import static com.slack.api.model.block.composition.BlockCompositions.markdownText; import static com.slack.api.model.block.element.BlockElements.asContextElements; import static com.slack.api.model.view.Views.*; public class ViewsPublish { public static void main(String[] args) throws Exception { var config = new AppConfig(); config.setSingleTeamBotToken(System.getenv("SLACK_BOT_TOKEN")); config.setSigningSecret(System.getenv("SLACK_SIGNING_SECRET")); var app = new App(config); // `new App()` does the same app.event(AppHomeOpenedEvent.class, (req, ctx) -> { var logger = ctx.logger; var userId = req.getEvent().getUser(); try { // Call the conversations.create method using the built-in WebClient var modalView = view(v -> v .type("home") .blocks(asBlocks( section(s -> s.text(markdownText(mt -> mt.text("*Welcome home, <@" + userId + "> :house:*")))), section(s -> s.text(markdownText(mt -> mt.text("About the simplest modal you could conceive of :smile:\\n\\nMaybe <https://api.slack.com/reference/block-kit/block-elements|*make the modal interactive*> or <https://api.slack.com/surfaces/modals/using#modifying|*learn more advanced modal use cases*>.")))), divider(), context(c -> c.elements(asContextElements( markdownText("Psssst this modal was designed using <https://api.slack.com/tools/block-kit-builder|*Block Kit Builder*>") ))) )) ); var result = ctx.client().viewsPublish(r -> r // The token you used to initialize your app .token(System.getenv("SLACK_BOT_TOKEN")) .userId(userId) .view(modalView) ); // Print result logger.info("result: {}", result); } catch (IOException | SlackApiException e) { logger.error("error: {}", e.getMessage(), e); } return ctx.ack(); }); var server = new SlackAppServer(app); server.start(); } }
Code to initialize Bolt app// Require the Bolt for JavaScript package (github.com/slackapi/bolt) const { App, LogLevel } = require("@slack/bolt"); const app = new App({ token: "xoxb-your-token", signingSecret: "your-signing-secret", // LogLevel can be imported and used to make debugging simpler logLevel: LogLevel.DEBUG });
// Listen to the app_home_opened Events API event to hear when a user opens your app from the sidebar app.event("app_home_opened", async ({ payload, client }) => { const userId = payload.user; try { // Call the views.publish method using the WebClient passed to listeners const result = await client.views.publish({ user_id: userId, view: { // Home tabs must be enabled in your app configuration page under "App Home" "type": "home", "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*Welcome home, <@" + userId + "> :house:*" } }, { "type": "section", "text": { "type": "mrkdwn", "text": "Learn how home tabs can be more useful and interactive <https://api.slack.com/surfaces/app-home|*in the documentation*>." } }, { "type": "divider" }, { "type": "context", "elements": [ { "type": "mrkdwn", "text": "Psssst this home tab was designed using <https://api.slack.com/tools/block-kit-builder|*Block Kit Builder*>" } ] } ] } }); console.log(result); } catch (error) { console.error(error); } });
Code to run app(async () => { // Start your app await app.start(process.env.PORT || 3000); console.log("⚡️ Bolt app is running!"); })();
Code to initialize Bolt appimport os # Import Bolt for Python (github.com/slackapi/bolt-python) from slack_bolt import App # Initializes your Bolt app with a bot token and signing secret app = App( token="xoxb-your-token", signing_secret="your-signing-secret" )
# Listen to the app_home_opened Events API event to hear when a user opens your app from the sidebar @app.event("app_home_opened") def app_home_opened(event, client, logger): user_id = event["user"] try: # Call the views.publish method using the WebClient passed to listeners result = client.views_publish( user_id=user_id, view={ # Home tabs must be enabled in your app configuration page under "App Home" # and your app must be subscribed to the app_home_opened event "type": "home", "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*Welcome home, <@{}> :house:*".format(user_id), }, }, { "type": "section", "text": { "type": "mrkdwn", "text": "Learn how home tabs can be more useful and interactive <https://api.slack.com/surfaces/app-home|*in the documentation*>.", }, }, {"type": "divider"}, { "type": "context", "elements": [ { "type": "mrkdwn", "text": "Psssst this home tab was designed using <https://api.slack.com/tools/block-kit-builder|*Block Kit Builder*>", } ], }, ], }, ) logger.info(result) except SlackApiError as e: logger.error("Error fetching conversations: {}".format(e))
Code to run app# Start your app if __name__ == "__main__": app.start(port=int(os.environ.get("PORT", 3000)))