---
title: "Create Watch Route"
method: POST
path: "/api/watches"
tags: ["watches"]
---

# Create Watch Route

`POST /api/watches`

## Request

- Base URL: `https://platform.verbiflow.com/api/bridge`
- URL: `https://platform.verbiflow.com/api/bridge/api/watches`
- Auth: one of:
  - HTTP bearer and API key in header `x-flage-org-id`
  - HTTP bearer and API key in header `x-flage-org-slug`

## Request body

- union
  - SlackChannelWatchCreatePayload
    - `cooldown_seconds` integer: Minimum seconds between admitted proactive judgments, including silent runs.
    - `creation_key` string, required: Stable create identity; exact retries adopt, changed input conflicts.
    - `daily_cap` integer: Maximum admitted proactive judgments per UTC day, including silent runs.
    - `dedupe_key_template` string: Optional source-specific event deduplication template.
    - `expires_at` string, date-time, nullable: Offset-aware expiry; null means no automatic expiry.
    - `intent` string, required: Owner instruction carried into Mochi judgment.
    - `prefilter` WatchPrefilterPayloadInput: Deterministic prefilter: keyword substrings and an author allowlist. Empty lists mean "no prefilter constraint of that kind".
      - `authors` string[]: Allowed Slack author ids; an empty list imposes no author constraint.
      - `keywords` string[]: Case-insensitive substrings; any one must match when nonempty.
    - `scope` SlackChannelScopePayload, required: One Slack workspace and channel observed by a channel Watch.
      - `channel_id` string, required: Exact Slack channel to observe.
      - `team_id` string, required: Exact connected Slack workspace to observe.
    - `source_kind` 'slack_channel', required
  - SlackThreadWatchCreatePayload
    - `cooldown_seconds` integer: Minimum seconds between admitted proactive judgments, including silent runs.
    - `creation_key` string, required: Stable create identity; exact retries adopt, changed input conflicts.
    - `daily_cap` integer: Maximum admitted proactive judgments per UTC day, including silent runs.
    - `dedupe_key_template` string: Optional source-specific event deduplication template.
    - `expires_at` string, date-time, nullable: Offset-aware expiry; null means no automatic expiry.
    - `intent` string, required: Owner instruction carried into Mochi judgment.
    - `prefilter` WatchPrefilterPayloadInput: Deterministic prefilter: keyword substrings and an author allowlist. Empty lists mean "no prefilter constraint of that kind".
      - `authors` string[]: Allowed Slack author ids; an empty list imposes no author constraint.
      - `keywords` string[]: Case-insensitive substrings; any one must match when nonempty.
    - `scope` SlackThreadScopePayload, required: One exact root message and its thread in a Slack channel.
      - `channel_id` string, required: Slack channel containing the thread.
      - `team_id` string, required: Exact connected Slack workspace to observe.
      - `thread_ts` string, required: Exact Slack root-message timestamp.
    - `source_kind` 'slack_thread', required
  - NotificationRuleWatchCreatePayload
    - `cooldown_seconds` integer: Minimum seconds between admitted proactive judgments, including silent runs.
    - `creation_key` string, required: Stable create identity; exact retries adopt, changed input conflicts.
    - `daily_cap` integer: Maximum admitted proactive judgments per UTC day, including silent runs.
    - `dedupe_key_template` string: Optional source-specific event deduplication template.
    - `expires_at` string, date-time, nullable: Offset-aware expiry; null means no automatic expiry.
    - `intent` string, required: Owner instruction carried into Mochi judgment.
    - `prefilter` WatchPrefilterPayloadInput: Deterministic prefilter: keyword substrings and an author allowlist. Empty lists mean "no prefilter constraint of that kind".
      - `authors` string[]: Allowed Slack author ids; an empty list imposes no author constraint.
      - `keywords` string[]: Case-insensitive substrings; any one must match when nonempty.
    - `scope` NotificationRuleScopePayload, required: One existing Notification rule owned by the current workspace.
      - `rule_id` string, uuid, required: UUID returned by notifications.rules.
    - `source_kind` 'notification_rule', required
  - ReactionWatchCreatePayload
    - `cooldown_seconds` integer: Minimum seconds between admitted proactive judgments, including silent runs.
    - `creation_key` string, required: Stable create identity; exact retries adopt, changed input conflicts.
    - `daily_cap` integer: Maximum admitted proactive judgments per UTC day, including silent runs.
    - `dedupe_key_template` string: Optional source-specific event deduplication template.
    - `expires_at` string, date-time, nullable: Offset-aware expiry; null means no automatic expiry.
    - `intent` string, required: Owner instruction carried into Mochi judgment.
    - `prefilter` WatchPrefilterPayloadInput: Deterministic prefilter: keyword substrings and an author allowlist. Empty lists mean "no prefilter constraint of that kind".
      - `authors` string[]: Allowed Slack author ids; an empty list imposes no author constraint.
      - `keywords` string[]: Case-insensitive substrings; any one must match when nonempty.
    - `scope` ReactionScopePayload, required: One Slack workspace and bare emoji name used for explicit invocation.
      - `emoji` string, required: Bare lowercase Slack emoji name, without colons.
      - `team_id` string, required: Exact connected Slack workspace to observe.
    - `source_kind` 'reaction', required

## Response `200`

Successful Response

- union: Created or adopted Watch with source-specific scope and captured authority.
  - SlackChannelWatchCreateReceipt: Created or adopted Slack channel Watch.
    - `authority` WatchAuthorityResponse, required: Owner authority captured by the server when the Watch was created.
      - `authority` 'service' | 'workspace_admin' | 'member', required: Server-derived authority classification at creation.
      - `captured_at` string, date-time, required: ISO 8601 time when authority was captured.
      - `owner_user_id` string, required: Workspace principal who authorized the Watch.
    - `cooldown_seconds` integer, required: Minimum seconds between admitted proactive judgments, including silent runs.
    - `created` boolean, required: True on first creation; false when the exact request was adopted.
    - `created_at` string, date-time, required: ISO 8601 Watch creation time.
    - `creation_key` string, nullable, required: Create identity, or null for a legacy Watch.
    - `daily_cap` integer, required: Maximum admitted proactive judgments per UTC day, including silent runs.
    - `dedupe_key_template` string, required: Configured source-specific deduplication template.
    - `enabled` boolean, required: Whether matching events may be evaluated.
    - `expires_at` string, date-time, nullable, required: ISO 8601 expiry, or null for no expiry.
    - `intent` string, required: Owner instruction carried into Mochi judgment.
    - `owner_user_id` string, required: Workspace principal who authorized the Watch.
    - `prefilter` WatchPrefilterPayloadOutput, required: Deterministic prefilter: keyword substrings and an author allowlist. Empty lists mean "no prefilter constraint of that kind".
      - `authors` string[], required: Allowed Slack author ids; an empty list imposes no author constraint.
      - `keywords` string[], required: Case-insensitive substrings; any one must match when nonempty.
    - `scope` SlackChannelScopePayload, required: One Slack workspace and channel observed by a channel Watch.
      - `channel_id` string, required: Exact Slack channel to observe.
      - `team_id` string, required: Exact connected Slack workspace to observe.
    - `slack_app_id` string, required: Server-derived Slack application identity.
    - `source_kind` 'slack_channel', required: Slack channel source discriminator.
    - `updated_at` string, date-time, required: Exact version to pass as expected_version on enable.
    - `watch_id` string, uuid, required: Stable canonical Watch UUID.
  - SlackThreadWatchCreateReceipt: Created or adopted exact Slack thread Watch.
    - `authority` WatchAuthorityResponse, required: Owner authority captured by the server when the Watch was created.
      - `authority` 'service' | 'workspace_admin' | 'member', required: Server-derived authority classification at creation.
      - `captured_at` string, date-time, required: ISO 8601 time when authority was captured.
      - `owner_user_id` string, required: Workspace principal who authorized the Watch.
    - `cooldown_seconds` integer, required: Minimum seconds between admitted proactive judgments, including silent runs.
    - `created` boolean, required: True on first creation; false when the exact request was adopted.
    - `created_at` string, date-time, required: ISO 8601 Watch creation time.
    - `creation_key` string, nullable, required: Create identity, or null for a legacy Watch.
    - `daily_cap` integer, required: Maximum admitted proactive judgments per UTC day, including silent runs.
    - `dedupe_key_template` string, required: Configured source-specific deduplication template.
    - `enabled` boolean, required: Whether matching events may be evaluated.
    - `expires_at` string, date-time, nullable, required: ISO 8601 expiry, or null for no expiry.
    - `intent` string, required: Owner instruction carried into Mochi judgment.
    - `owner_user_id` string, required: Workspace principal who authorized the Watch.
    - `prefilter` WatchPrefilterPayloadOutput, required: Deterministic prefilter: keyword substrings and an author allowlist. Empty lists mean "no prefilter constraint of that kind".
      - `authors` string[], required: Allowed Slack author ids; an empty list imposes no author constraint.
      - `keywords` string[], required: Case-insensitive substrings; any one must match when nonempty.
    - `scope` SlackThreadScopePayload, required: One exact root message and its thread in a Slack channel.
      - `channel_id` string, required: Slack channel containing the thread.
      - `team_id` string, required: Exact connected Slack workspace to observe.
      - `thread_ts` string, required: Exact Slack root-message timestamp.
    - `slack_app_id` string, required: Server-derived Slack application identity.
    - `source_kind` 'slack_thread', required: Slack thread source discriminator.
    - `updated_at` string, date-time, required: Exact version to pass as expected_version on enable.
    - `watch_id` string, uuid, required: Stable canonical Watch UUID.
  - NotificationRuleWatchCreateReceipt: Created or adopted Notification rule Watch.
    - `authority` WatchAuthorityResponse, required: Owner authority captured by the server when the Watch was created.
      - `authority` 'service' | 'workspace_admin' | 'member', required: Server-derived authority classification at creation.
      - `captured_at` string, date-time, required: ISO 8601 time when authority was captured.
      - `owner_user_id` string, required: Workspace principal who authorized the Watch.
    - `cooldown_seconds` integer, required: Minimum seconds between admitted proactive judgments, including silent runs.
    - `created` boolean, required: True on first creation; false when the exact request was adopted.
    - `created_at` string, date-time, required: ISO 8601 Watch creation time.
    - `creation_key` string, nullable, required: Create identity, or null for a legacy Watch.
    - `daily_cap` integer, required: Maximum admitted proactive judgments per UTC day, including silent runs.
    - `dedupe_key_template` string, required: Configured source-specific deduplication template.
    - `enabled` boolean, required: Whether matching events may be evaluated.
    - `expires_at` string, date-time, nullable, required: ISO 8601 expiry, or null for no expiry.
    - `intent` string, required: Owner instruction carried into Mochi judgment.
    - `owner_user_id` string, required: Workspace principal who authorized the Watch.
    - `prefilter` WatchPrefilterPayloadOutput, required: Deterministic prefilter: keyword substrings and an author allowlist. Empty lists mean "no prefilter constraint of that kind".
      - `authors` string[], required: Allowed Slack author ids; an empty list imposes no author constraint.
      - `keywords` string[], required: Case-insensitive substrings; any one must match when nonempty.
    - `scope` NotificationRuleScopePayload, required: One existing Notification rule owned by the current workspace.
      - `rule_id` string, uuid, required: UUID returned by notifications.rules.
    - `slack_app_id` string, required: Server-derived Slack application identity.
    - `source_kind` 'notification_rule', required: Notification source discriminator.
    - `updated_at` string, date-time, required: Exact version to pass as expected_version on enable.
    - `watch_id` string, uuid, required: Stable canonical Watch UUID.
  - ReactionWatchCreateReceipt: Created or adopted Slack reaction Watch.
    - `authority` WatchAuthorityResponse, required: Owner authority captured by the server when the Watch was created.
      - `authority` 'service' | 'workspace_admin' | 'member', required: Server-derived authority classification at creation.
      - `captured_at` string, date-time, required: ISO 8601 time when authority was captured.
      - `owner_user_id` string, required: Workspace principal who authorized the Watch.
    - `cooldown_seconds` integer, required: Minimum seconds between admitted proactive judgments, including silent runs.
    - `created` boolean, required: True on first creation; false when the exact request was adopted.
    - `created_at` string, date-time, required: ISO 8601 Watch creation time.
    - `creation_key` string, nullable, required: Create identity, or null for a legacy Watch.
    - `daily_cap` integer, required: Maximum admitted proactive judgments per UTC day, including silent runs.
    - `dedupe_key_template` string, required: Configured source-specific deduplication template.
    - `enabled` boolean, required: Whether matching events may be evaluated.
    - `expires_at` string, date-time, nullable, required: ISO 8601 expiry, or null for no expiry.
    - `intent` string, required: Owner instruction carried into Mochi judgment.
    - `owner_user_id` string, required: Workspace principal who authorized the Watch.
    - `prefilter` WatchPrefilterPayloadOutput, required: Deterministic prefilter: keyword substrings and an author allowlist. Empty lists mean "no prefilter constraint of that kind".
      - `authors` string[], required: Allowed Slack author ids; an empty list imposes no author constraint.
      - `keywords` string[], required: Case-insensitive substrings; any one must match when nonempty.
    - `scope` ReactionScopePayload, required: One Slack workspace and bare emoji name used for explicit invocation.
      - `emoji` string, required: Bare lowercase Slack emoji name, without colons.
      - `team_id` string, required: Exact connected Slack workspace to observe.
    - `slack_app_id` string, required: Server-derived Slack application identity.
    - `source_kind` 'reaction', required: Reaction source discriminator.
    - `updated_at` string, date-time, required: Exact version to pass as expected_version on enable.
    - `watch_id` string, uuid, required: Stable canonical Watch UUID.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/verbiflow/apis/verbiflow-sdk-http-contract.md) - [All operations](https://skmtc.dev/verbiflow/apis/verbiflow-sdk-http-contract/llms.txt) - [OpenAPI document](https://skmtc.dev/verbiflow/apis/verbiflow-sdk-http-contract/revisions/c80e903ef8f3?raw)
