---
title: "Announce"
method: POST
path: "/v1/ops/announcements"
tags: ["announcements"]
---

# Announce

`POST /v1/ops/announcements`

## Request

- Base URL: `https://api.stormy.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.stormy.ai/v1/ops/announcements`
- Auth: none declared

File an announcement and start the DRAFT round. Nothing reaches a customer.

## Headers

- `authorization` string, nullable
- `x-darwin-token` string, nullable

## Request body

- AnnouncementRequest
  - `news` string, required: What is new, in the founder's words.
  - `link` string: https://stormy.ai/… or a /app path; each desk gets its own workspace's copy.
  - `audience` Audience: Who hears it. `team_ids` names exactly those workspaces, ignores the window, and may name one of our own or a practice workspace (a rehearsal — a practice workspace's note is recorded, never sent); test and guest seats are never in it, and a practice workspace never is unless it is named.
    - `days` integer: Workspaces created, or used by their owner, in this many days.
    - `team_ids` string[]
    - `exclude_team_ids` string[]
    - `exclude_emails` string[]
  - `run_on` 'production' | 'here'
  - `look` NewsLook: How a note is drawn. Every field is optional; an empty look is the house's default.
    - `mark` string: 'stormy', an app's slug ('slack') or an image URL; empty = read from the note's link.
    - `media` NewsMedia: A picture or a video above the title.
      - `src` string, required: A /path on stormy.ai or a full https URL.
      - `kind` 'image' | 'video'
      - `poster` string: A video's still before it plays.
    - `actions` NewsAction[]: Empty = the house's presses: Add <app> / Take a look / Got it, and Close.
      - `label` string, required
      - `href` string: A /app path (this workspace's copy) or a full https link.
      - `connect` string: An app's slug: opens its connect door.
      - `ask` string: Words handed to Stormy in the chat, as the owner's own.
      - `primary` boolean: The one black press; the LAST action when none says so (the right-hand pill).
    - `face` string: A `function Screen()` of JSX, mounted inside the house's frame with the renderer every page uses. In scope: note (title, body, url, look); the presses as verbs act(action), open(href), connect(app), ask(words), close(); and the house's parts <Mark/>, <Media/>, <Presses/>, <Default/>. The frame is narrow (a 420px window, a phone sheet): the house reflows grid-cols-N to fewer columns there unless the grid carries data-hold-columns. One that does not compile or throws falls back to the house's sheet.

## Response `200`

Successful Response

- object

## Other responses

- `422`: Validation Error

## Changes

> 68 revisions in range; 1 not diffed.

- **2026-10-05** `64dcb155acd1`: 1 info
  - added the new optional request property `look`
- **2026-10-02** `74e6dcc7900d`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/stormy/apis/stormy-control-plane/changes/v1/ops/announcements/post.md)

---

[API](https://skmtc.dev/stormy/apis/stormy-control-plane.md) · [All operations](https://skmtc.dev/stormy/apis/stormy-control-plane/llms.txt) · [OpenAPI document](https://skmtc.dev/stormy/apis/stormy-control-plane/revisions/a40e83844eaa?raw)
