> ## Documentation Index
> Fetch the complete documentation index at: https://docs.photon.codes/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Use Stable documentation by default. Honor an explicit Beta request or a URL under /docs/beta/. If the requested version conflicts with the installed CLI package or API origin, clarify the target before writing integration code.
> Pages under /docs/beta/ document Beta; other product pages document Stable. Keep the CLI package, commands, API origin, and credentials within the selected version. State the documentation version in your answer.
> For MCP search, always pass version: Stable or version: Beta. Unfiltered search mixes both versions. For filesystem reads, keep Beta queries under /beta/ and exclude /beta/ from Stable queries; discover paths before reading them.
> The public docs base is https://photon.codes/docs. Convert MCP page paths to public URLs under that base, preserving /beta/ when present. Read https://photon.codes/docs/skill.md for version selection and https://photon.codes/docs/llms.txt for the version indexes.

# WebhookOptions

> Options for webhook handling.

## Properties

<ResponseField name={"deduplicate"} type={"boolean"} />

<ResponseField name={"onOpenModal"} type={"(modal: ModalElement, contextId: string) => Promise<{ viewId: string } | undefi…"}>
  **Type:** <code>{"(modal: "}[ModalElement](/docs/reference/stable/chat/index/interfaces/ModalElement){", contextId: string) => Promise<{ viewId: string } | undefined>"}</code>

  Override the default modal-opening behavior to handle it inline
  within the current webhook response cycle.
  When provided, called instead of adapter.openModal().
  Used by Teams to return modal content in the HTTP invoke response.

  The returned `viewId` is platform-specific (e.g. Slack's view ID).
  Adapters that don't produce a view ID may return void.
</ResponseField>

<ResponseField name={"propagateHandlerErrors"} type={"boolean"}>
  Opt in to exposing message, action, and slash command handler errors
  through `waitUntil`.
  This only changes handler-error observability through `waitUntil`; errors
  are still logged and direct method behavior is unchanged.
  Defaults to `false`, preserving the current fulfilled-task behavior.
</ResponseField>

<ResponseField name={"waitUntil"} type={"(task: Promise<unknown>) => void"}>
  Function to run message handling in the background.
  Use this to ensure fast webhook responses while processing continues.

  ```ts
  // Next.js App Router
  import { after } from "next/server";
  chat.webhooks.slack(request, { waitUntil: (p) => after(() => p) });
  ```
</ResponseField>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.