# Slack Interaction Payload

> Slack interaction payload for block actions, view submissions, and shortcuts.

- Name: `slack-interaction-payload`
- Categories: slack
- Depends on: `@open-types/slack-shared`
- Detail page: https://open-types.dev/types/slack-interaction-payload

## Install

```bash
# Types only
npx shadcn add @open-types/slack-interaction-payload

# Types + Zod v4 validators
npx shadcn add @open-types/slack-interaction-payload-zod

# Types + real-world examples
npx shadcn add @open-types/slack-interaction-payload-examples
```

## Types

```typescript
import type { SlackUser, SlackChannel } from "./slack-shared";

export interface SlackActionUser {
  id: SlackUser["id"];
  name: SlackUser["name"];
  team_id: SlackUser["team_id"];
}

export interface SlackActionChannel {
  id: SlackChannel["id"];
  name: SlackChannel["name"];
}

export interface SlackAction {
  action_id: string;
  type: string;
  value?: string;
  block_id: string;
}

export type SlackInteractionType =
  | "block_actions"
  | "view_submission"
  | "shortcut";

export interface SlackInteractionPayload {
  type: SlackInteractionType;
  trigger_id: string;
  user: SlackActionUser;
  channel?: SlackActionChannel;
  actions?: SlackAction[];
  response_url?: string;
}
```

## Zod validator

```typescript
import * as z from "zod";
import type {
  SlackActionUser,
  SlackActionChannel,
  SlackAction,
  SlackInteractionType,
  SlackInteractionPayload,
} from "../types/slack-interaction-payload";
import {
  slackUserSchema,
  slackChannelSchema,
} from "./slack-shared";

export const slackActionUserSchema = slackUserSchema.pick({
  id: true,
  name: true,
  team_id: true,
}) satisfies z.ZodType<SlackActionUser>;

export const slackActionChannelSchema = slackChannelSchema.pick({
  id: true,
  name: true,
}) satisfies z.ZodType<SlackActionChannel>;

export const slackActionSchema = z.object({
  action_id: z.string(),
  type: z.string(),
  value: z.string().optional(),
  block_id: z.string(),
}) satisfies z.ZodType<SlackAction>;

export const slackInteractionTypeSchema = z.enum([
  "block_actions",
  "view_submission",
  "shortcut",
]) satisfies z.ZodType<SlackInteractionType>;

export const slackInteractionPayloadSchema = z.object({
  type: slackInteractionTypeSchema,
  trigger_id: z.string(),
  user: slackActionUserSchema,
  channel: slackActionChannelSchema.optional(),
  actions: z.array(slackActionSchema).optional(),
  response_url: z.string().optional(),
}) satisfies z.ZodType<SlackInteractionPayload>;

export type {
  SlackActionUser,
  SlackActionChannel,
  SlackAction,
  SlackInteractionType,
  SlackInteractionPayload,
} from "../types/slack-interaction-payload";
```

## Examples

```typescript
// Source: https://api.slack.com/reference/interaction-payloads
// Captured: 2026-05
import type {
  SlackActionUser,
  SlackActionChannel,
  SlackAction,
  SlackInteractionType,
  SlackInteractionPayload,
} from "../types/slack-interaction-payload";
import { slackIds } from "./shared/slack.examples";

const actionUser = {
  id: slackIds.user,
  name: "marco",
  team_id: slackIds.team,
} as const satisfies SlackActionUser;

export const slackActionUserExamples = {
  marco: actionUser,
  alex: {
    id: "U87654321",
    name: "alex",
    team_id: slackIds.team,
  } satisfies SlackActionUser,
} as const;

const actionChannel = {
  id: slackIds.channel,
  name: "engineering",
} as const satisfies SlackActionChannel;

export const slackActionChannelExamples = {
  engineering: actionChannel,
  deployments: { id: slackIds.channel, name: "deployments" } satisfies SlackActionChannel,
} as const;

const approveAction = {
  action_id: "approve_deploy",
  type: "button",
  value: "deploy-42",
  block_id: "approval_actions",
} as const satisfies SlackAction;

export const slackActionExamples = {
  buttonApprove: approveAction,
  buttonDeny: {
    action_id: "deny_deploy",
    type: "button",
    value: "deploy-42",
    block_id: "approval_actions",
  } satisfies SlackAction,
  selectMenuChange: {
    action_id: "select_environment",
    type: "static_select",
    block_id: "select_block",
  } satisfies SlackAction,
} as const;

export const slackInteractionTypeExamples = {
  blockActions: "block_actions",
  viewSubmission: "view_submission",
  shortcut: "shortcut",
} as const satisfies Record<string, SlackInteractionType>;

const blockActions = {
  type: "block_actions",
  trigger_id: "12466734323.1395872398.abc123def456",
  user: actionUser,
  channel: actionChannel,
  actions: [approveAction],
  response_url: "https://hooks.slack.com/actions/T12345678/1234/abcdef",
} as const satisfies SlackInteractionPayload;

export const slackInteractionPayloadExamples = {
  blockActions,
  shortcut: {
    type: "shortcut",
    trigger_id: "12466734323.1395872398.abc123def456",
    user: actionUser,
  } satisfies SlackInteractionPayload,
  viewSubmission: {
    type: "view_submission",
    trigger_id: "12466734323.1395872398.abc123def456",
    user: actionUser,
  } satisfies SlackInteractionPayload,
  multiAction: {
    ...blockActions,
    actions: [approveAction, slackActionExamples.buttonDeny],
  } satisfies SlackInteractionPayload,
} as const;
```
