# Discord Interaction

> Discord interaction with slash command data, guild, and user context.

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

## Install

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

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

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

## Types

```typescript
import type { DiscordUser } from "./discord-shared";

export interface DiscordInteractionOptionValue {
  name: string;
  type: number;
  value?: unknown;
}

export interface DiscordInteractionData {
  id: string;
  name: string;
  type: number;
  options?: DiscordInteractionOptionValue[];
}

export interface DiscordInteraction {
  id: string;
  application_id: string;
  type: number;
  data?: DiscordInteractionData;
  guild_id?: string;
  channel_id?: string;
  user?: DiscordUser;
  token: string;
  version: number;
}
```

## Zod validator

```typescript
import * as z from "zod";
import type {
  DiscordInteractionOptionValue,
  DiscordInteractionData,
  DiscordInteraction,
} from "../types/discord-interaction";
import { discordUserSchema } from "./discord-shared";

export const discordInteractionOptionValueSchema = z.object({
  name: z.string(),
  type: z.number(),
  value: z.unknown().optional(),
}) satisfies z.ZodType<DiscordInteractionOptionValue>;

export const discordInteractionDataSchema = z.object({
  id: z.string(),
  name: z.string(),
  type: z.number(),
  options: z.array(discordInteractionOptionValueSchema).optional(),
}) satisfies z.ZodType<DiscordInteractionData>;

export const discordInteractionSchema = z.object({
  id: z.string(),
  application_id: z.string(),
  type: z.number(),
  data: discordInteractionDataSchema.optional(),
  guild_id: z.string().optional(),
  channel_id: z.string().optional(),
  user: discordUserSchema.optional(),
  token: z.string(),
  version: z.number(),
}) satisfies z.ZodType<DiscordInteraction>;

export type {
  DiscordInteractionOptionValue,
  DiscordInteractionData,
  DiscordInteraction,
} from "../types/discord-interaction";
```

## Examples

```typescript
// Source: https://discord.com/developers/docs/interactions/receiving-and-responding#interaction-object
// Captured: 2026-05
import type {
  DiscordInteractionOptionValue,
  DiscordInteractionData,
  DiscordInteraction,
} from "../types/discord-interaction";
import { discordIds, discordUserOpenTypes } from "./shared/discord.examples";

const optionEnv = {
  name: "environment",
  type: 3,
  value: "production",
} as const satisfies DiscordInteractionOptionValue;

export const discordInteractionOptionValueExamples = {
  string: optionEnv,
  integer: { name: "count", type: 4, value: 5 } satisfies DiscordInteractionOptionValue,
  boolean: { name: "confirm", type: 5, value: true } satisfies DiscordInteractionOptionValue,
  subcommand: { name: "logs", type: 1 } satisfies DiscordInteractionOptionValue,
} as const;

const data = {
  id: "4444444444",
  name: "deploy",
  type: 1,
  options: [optionEnv],
} as const satisfies DiscordInteractionData;

export const discordInteractionDataExamples = {
  slashWithOptions: data,
  slashNoOptions: { id: "4444444445", name: "ping", type: 1 } satisfies DiscordInteractionData,
  buttonComponent: { id: "4444444446", name: "approve_btn", type: 2 } satisfies DiscordInteractionData,
} as const;

const slashInteraction = {
  id: discordIds.interaction,
  application_id: discordIds.application,
  type: 2,
  data,
  guild_id: discordIds.guild,
  channel_id: discordIds.channel,
  user: discordUserOpenTypes,
  token: "interaction_token",
  version: 1,
} as const satisfies DiscordInteraction;

export const discordInteractionExamples = {
  slash: slashInteraction,
  ping: {
    id: discordIds.interaction,
    application_id: discordIds.application,
    type: 1,
    token: "ping_token",
    version: 1,
  } satisfies DiscordInteraction,
  componentInteraction: {
    ...slashInteraction,
    id: "5555555556",
    type: 3,
    data: discordInteractionDataExamples.buttonComponent,
  } satisfies DiscordInteraction,
  dm: {
    ...slashInteraction,
    id: "5555555557",
    guild_id: undefined,
    channel_id: undefined,
  } satisfies DiscordInteraction,
} as const;
```
