You must enable javascript in order to use Slack. You can do this in your browser settings.

Slack API methods

The power behind next generation Slack apps, of course, lies in the ability to interface with the Slack API we've come to know and love. While building your next generation Slack app, you can access and make calls to the Slack API via the client context property of a SlackFunction. Think of SlackFunction as a utility employed for implementing custom functions. It ensures input validity, provides auto-complete functionality, and manages the app's access token so you don't have to (you can thank us later).

To use the client context property, import SlackFunction from deno-slack-sdk to your custom function file and add the client context property to your SlackFunction, as shown below. Only the inputs and client context properties are shown in this example, but other context properties you might want to include are outlined on the custom functions page.

// functions/example_function.ts
import { DefineFunction, Schema, SlackFunction } from "deno-slack-sdk/mod.ts";

export const ExampleFunctionDefinition = DefineFunction({
  callback_id: "example_function_def",
  title: "Example function",
  source_file: "functions/example_function.ts",

export default SlackFunction(
  ({ inputs, client }) => { // Add `client` here

  // ...

The client property allows you to access the Slack API in one of two ways:

  • client.<noun>.<verb> (e.g.,
  • client.apiCall('<nounVerb>') (e.g., client.apiCall('chat.postMessage', {/* ... */});)

These API calls return a promise, so be sure to await their responses. A promise in TypeScript allows for asynchronous programming - handling multiple tasks at the same time.

For example, let's look at our sample app, Deno Request Time Off, and send a message to a user's manager to request time off:

// functions/send_time_off_request_to_manager/definition.ts
import { DefineFunction, Schema } from "deno-slack-sdk/mod.ts";

export const SendTimeOffRequestToManagerFunction = DefineFunction({
  callback_id: "send_time_off_request_to_manager",
  title: "Request Time Off",
  description: "Sends your manager a time off request to approve or deny",
  source_file: "functions/send_time_off_request_to_manager/mod.ts",
  input_parameters: {
    properties: {
      interactivity: {
        type: Schema.slack.types.interactivity,
      employee: {
        type: Schema.slack.types.user_id,
        description: "The user requesting the time off",
      manager: {
        type: Schema.slack.types.user_id,
        description: "The manager approving the time off request",
      start_date: {
        type: "slack#/types/date",
        description: "Time off start date",
      end_date: {
        type: "slack#/types/date",
        description: "Time off end date",
      reason: {
        type: Schema.types.string,
        description: "The reason for the time off request",
    required: [
  output_parameters: {
    properties: {},
    required: [],

// functions/send_time_off_request_to_manager/mod.ts

import { SendTimeOffRequestToManagerFunction } from "./definition.ts";
import { SlackFunction } from "deno-slack-sdk/mod.ts";
import BlockActionHandler from "./block_actions.ts";
import { APPROVE_ID, DENY_ID } from "./constants.ts";
import timeOffRequestHeaderBlocks from "./blocks.ts";

export default SlackFunction(
  async ({ inputs, client }) => {
    console.log("Forwarding the following time off request:", inputs);

    // ...

    // Send the message to the manager
    const msgResponse = await{
      channel: inputs.manager,
      // Fallback text to use when rich media can't be displayed (i.e. notifications) as well as for screen readers
      text: "A new time off request has been submitted",

    if (!msgResponse.ok) {
      console.log("Error during request chat.postMessage!", msgResponse.error);

    // IMPORTANT! Set `completed` to false in order to keep the interactivity
    // points (the approve/deny buttons) "alive"
    // We will set the function's complete state in the button handlers below.
    return {
      completed: false,
    // ...

Most API endpoints require specific permission scopes. Add scopes to your app by listing them in the botScopes property of your manifest.

Slack API methods

You can call any and all of the Slack API methods listed in the method documentation. On those pages, you will discover more ways to access Slack API methods, but for use within next generation Slack apps, we recommend using SlackFunction outlined here.

Next up

➑️ To learn more about the custom functions you can implement using SlackFunction, check out custom functions.

Have 2 minutes to provide some feedback?

We'd love to hear about your experience building modular Slack apps. Please complete our short survey so we can use your feedback to improve.