# Stet Documentation > Stet is a broadcast composer for Slack — compose once, preview the exact render, send to many channels with per-channel delivery tracking. Each page below is available as Markdown at the linked .md URL; the rendered page is the same URL without the extension. Full corpus in one file: https://stethq.com/docs/llms-full.txt ## Pages - [What is Stet](https://stethq.com/docs/index.md): What Stet is, who uses it, and where to start in the docs. - [Quickstart](https://stethq.com/docs/quickstart.md): From sign-up to a delivered broadcast in one sitting. - [Broadcasts](https://stethq.com/docs/concepts/broadcasts.md): One message sent to many Slack channels at once, with per-channel delivery tracking. - [Audiences](https://stethq.com/docs/concepts/audiences.md): Saved, named groups of Slack channels that broadcasts target. - [Send fidelity](https://stethq.com/docs/concepts/send-fidelity.md): Why the Slack render always matches the preview — "let it stand". - [Channels and sending profiles](https://stethq.com/docs/concepts/channels-and-sending-profiles.md): How Stet lists your Slack channels and which identity a broadcast posts as. - [Scheduling](https://stethq.com/docs/concepts/scheduling.md): Schedule a broadcast to send at a chosen future time instead of immediately. - [Delivery tracking](https://stethq.com/docs/concepts/delivery-tracking.md): Per-channel delivery status, replies, and reactions for every sent broadcast. - [Organizations and Slack workspaces](https://stethq.com/docs/concepts/multi-workspace.md): One connected Slack workspace per Stet organization, and what that means for your data. - [Sending a broadcast](https://stethq.com/docs/guides/send-a-broadcast.md): Compose, target, preview, and send a broadcast end to end. - [Scheduling a broadcast](https://stethq.com/docs/guides/schedule-a-broadcast.md): Set a future send time and confirm the scheduled send fires. - [Test sends](https://stethq.com/docs/guides/test-sends.md): Send a broadcast to yourself as a Slack DM before it goes to customers. - [Managing audiences](https://stethq.com/docs/guides/manage-audiences.md): Create, edit, and reuse saved channel groups. - [Reading results](https://stethq.com/docs/guides/read-results.md): Delivery, reply, and reaction data on a sent broadcast. - [API reference](https://stethq.com/docs/api.md): REST API authentication, idempotency, errors, and endpoint reference. - [Cancel a broadcast](https://stethq.com/docs/api/cancelBroadcast.md): Requires `write` (`broadcast:send`). Cancelable from `draft`, `scheduled`, or `sending`; best-effort terminates any in-flight workflow instance. Any other status (a terminal one) 409s. - [Create an API key](https://stethq.com/docs/api/createApiKey.md): **Dashboard-session only** — this operation does not accept `bk_` Bearer auth. Requires capability `apikey:manage` (Admin role). The plaintext secret is returned exactly once, in this response. - [Create a saved audience](https://stethq.com/docs/api/createAudience.md): Requires `write` (`audience:manage`). - [Append a block](https://stethq.com/docs/api/createBlock.md): Requires `write` (`broadcast:compose`). Draft-only — `409` on any other status. - [Create a draft broadcast](https://stethq.com/docs/api/createBroadcast.md): Requires a `write`-scope key (capability `broadcast:compose`). Optionally seeds blocks from a known `templateId`. - [Create a sending profile](https://stethq.com/docs/api/createSendingProfile.md): Requires `write` (`sending_profile:manage`). `avatarUrl`, if set, must already be an absolute URL from `POST /api/sending-profiles/avatar`. - [Delete a saved audience](https://stethq.com/docs/api/deleteAudience.md): Requires `write` (`audience:manage`). - [Delete one block](https://stethq.com/docs/api/deleteBlock.md): Requires `write` (`broadcast:compose`). Draft-only — `409` on any other status. - [Delete a broadcast](https://stethq.com/docs/api/deleteBroadcast.md): Requires `write` (`broadcast:compose`). Cascades sends, broadcast_audiences, and blocks; also cleans up the one-time channel group, if any. No status guard. - [Delete a sending profile](https://stethq.com/docs/api/deleteSendingProfile.md): Requires `write` (`sending_profile:manage`). On success, best-effort cleans up the profile's avatar object in R2 (never fails the request if cleanup fails). - [Duplicate a broadcast](https://stethq.com/docs/api/duplicateBroadcast.md): Requires `write` (`broadcast:compose`). Clones targeting, blocks, and per-block visibility into a fresh draft titled "Copy of …"; drops the source's one-time channel group. No status guard. - [Get a saved audience](https://stethq.com/docs/api/getAudience.md): 404 for a one-time group's id — those aren't addressable through this CRUD surface. - [Get a broadcast](https://stethq.com/docs/api/getBroadcast.md): Lifecycle fields plus targeted audiences, ordered blocks, and the one-time channel group (if any). Used by the composer. - [Get reaction counts](https://stethq.com/docs/api/getBroadcastReactions.md): Read-only. Only reactions on messages Stet itself posted are ever counted. Windowed by the org's plan (engagement retention); an empty result can mean "too old" rather than "no reactions". - [Get a sending profile](https://stethq.com/docs/api/getSendingProfile.md): - [Invite Stet's bot to channels](https://stethq.com/docs/api/inviteBotToChannelsEndpoint.md): Requires `write` (`channel:manage`). Uses `conversations.join` — only works for public channels the bot can self-join. Per-channel errors are captured, not thrown, so a partial batch still reports every outcome. - [List API keys](https://stethq.com/docs/api/listApiKeys.md): **Dashboard-session only** — this operation does not accept `bk_` Bearer auth (see the `clerkSession` security scheme). Requires capability `apikey:manage` (Admin role). Never returns the secret. - [List saved audiences](https://stethq.com/docs/api/listAudiences.md): Saved (kind=saved) audiences only — one-time groups never appear here. - [List broadcasts](https://stethq.com/docs/api/listBroadcasts.md): Newest first. Every field the API key's org can see (workspace-scoped). - [List synced Slack channels](https://stethq.com/docs/api/listChannels.md): - [List thread replies to a broadcast's sends](https://stethq.com/docs/api/listReplies.md): Read-only. Only replies to messages Stet itself posted are ever matched (by channel + timestamp) — replies to messages posted by other means never appear here. Windowed by the org's plan (engagement retention). - [List sending profiles](https://stethq.com/docs/api/listSendingProfiles.md): Oldest-first (id tiebreak) — onboarding relies on this ordering to pre-fill the first profile. - [List per-channel send results](https://stethq.com/docs/api/listSends.md): Failed sends first, then pending, then everything else; channel name ascending within each group. - [Render the Slack Block Kit preview](https://stethq.com/docs/api/previewBroadcast.md): Read-only — the exact render the send pipeline would post. Either `aggregate=1` (the union across every targeted audience, annotated with per-block visibility) or `audience_id` (one audience's exact render) is required; `audience_id` must be an audience actually targeted by this broadcast. - [Replace the broadcast's one-time channel group](https://stethq.com/docs/api/putOneTimeChannels.md): Requires `write` (`broadcast:compose`). The ONLY write surface for a broadcast's ad-hoc one-time channel group — an empty `channelIds` deletes the group. Draft-only — `409` on any other status. - [Replace the entire block list](https://stethq.com/docs/api/reconcileBlocks.md): Requires `write` (`broadcast:compose`). Doc-is-truth bulk reconcile — insert/update/delete/reorder blocks and replace per-block audience visibility in one transaction. Draft-only — `409` on any other status. - [Reorder blocks](https://stethq.com/docs/api/reorderBlocks.md): Requires `write` (`broadcast:compose`). Unlike the other block writes, this route has no draft-only status guard. - [Retry every failed send](https://stethq.com/docs/api/retryAllSends.md): Requires `write` (`broadcast:send`). Same direct guarded re-post path as the single-send retry, fanned out with a concurrency cap of 5. `retried: 0` (with `status: null`) when there was nothing to retry. - [Retry one failed send](https://stethq.com/docs/api/retrySend.md): Requires `write` (`broadcast:send`). Direct guarded re-post through the same rate-limited path the pipeline uses (not a workflow re-enqueue) — see docs/api/broadcast-lifecycle.md §4. The send must currently be `failed`. - [Revoke an API key](https://stethq.com/docs/api/revokeApiKey.md): **Dashboard-session only** — this operation does not accept `bk_` Bearer auth. Requires capability `apikey:manage` (Admin role). Sets `revokedAt`; the row is kept (not deleted) for audit history. - [Schedule a broadcast](https://stethq.com/docs/api/scheduleBroadcast.md): Requires `write` (`broadcast:send`). Arms a SendBroadcastWorkflow instance that sleeps until `send_at`. Callable from any status except `sending` (including re-scheduling an already-scheduled broadcast, or re-scheduling a terminal one) — see docs/api/broadcast-lifecycle.md §1 for the full state machine. - [Send a broadcast immediately](https://stethq.com/docs/api/sendBroadcastNow.md): Requires `write` (`broadcast:send`). Dispatches an immediate SendBroadcastWorkflow instance (`sendAt: null`). If the broadcast is already `scheduled`, pass `confirm=true` to cancel the pending schedule and send now instead (never transits `canceled`); without `confirm=true` this 409s with the active schedule so the caller can prompt for confirmation. 422s if no audience is targeted or an `actions` block has a link-less button (`assertButtonsLinked`). - [Set content from Markdown](https://stethq.com/docs/api/setBroadcastContent.md): Requires `write` (`broadcast:compose`). Converts Markdown to blocks and reconciles them via the same doc-is-truth path as `PUT .../blocks`. Draft-only — `409` on any other status. A construct the converter can't represent (images, raw HTML, tables, nested list blocks) 400s with `UnsupportedMarkdownProblem` instead of silently dropping content. - [Suggest audiences from channel-name prefixes](https://stethq.com/docs/api/suggestAudiences.md): Requires `write` (`audience:manage`). Pure heuristic, no LLM: groups channels by a shared `prefix-` in their name (≥3 channels) and proposes a name like "All Marketing", derived from the shared channel-name prefix. Nothing is created — the caller follows up with `POST /api/audiences` to accept a suggestion. - [Re-sync channels from Slack](https://stethq.com/docs/api/syncChannelsEndpoint.md): Requires `write` (`channel:manage`). Refreshes channel metadata (including bot membership) without disconnecting Slack. Detects a Slack-side auth revocation and soft-disconnects the workspace (`409 connection-disconnected`) if the token is dead. - [Send a throwaway test render](https://stethq.com/docs/api/testSendBroadcast.md): Requires `write` (`broadcast:send`). Posts to the caller's own Slack DM or a chosen channel using the exact same render path as a real send — "what you test is what lands" — then a small "this is a test" marker as a follow-up message. Mutates nothing: no broadcast row, no `sends` rows, no idempotency. - [Update a saved audience](https://stethq.com/docs/api/updateAudience.md): Requires `write` (`audience:manage`). At least one field must be present. - [Update one block](https://stethq.com/docs/api/updateBlock.md): Requires `write` (`broadcast:compose`). Draft-only — `409` on any other status. - [Update a broadcast's title, sending profile, or saved-audience targeting](https://stethq.com/docs/api/updateBroadcast.md): Requires `write` (`broadcast:compose`). `audienceIds`, when present, replaces the SAVED-audience set only — the one-time channel group (if any) is always preserved. No status guard: callable regardless of the broadcast's current status. - [Update a sending profile](https://stethq.com/docs/api/updateSendingProfile.md): Requires `write` (`sending_profile:manage`). At least one field must be present. - [Upload a sending-profile avatar image](https://stethq.com/docs/api/uploadSendingProfileAvatar.md): Requires `write` (`sending_profile:manage`). NOTE: this endpoint takes no `{id}` — it is a standalone upload that returns a URL; pass that URL as `avatarUrl` on a create/update call to attach it to a profile. PNG, JPEG, WebP, or GIF; max 2MB. - [Check for audience/channel conflicts](https://stethq.com/docs/api/validateBroadcastEndpoint.md): Read-only. The same conflict check `schedule` and `send-now` run before dispatch — a channel reached by two-or-more targeted audiences with differing visible blocks for that channel. - [MCP server](https://stethq.com/docs/mcp.md): Install and connect the Stet MCP server, `@stethq/mcp`. - [Slack](https://stethq.com/docs/integrations/slack.md): How the Stet Slack app connects, the scopes it uses, and where it posts. - [Changelog](https://stethq.com/docs/changelog.md): Product changes, newest first. - [Trust](https://stethq.com/docs/trust.md): How Stet handles reliability, delivery failures, and your data. - [FAQ](https://stethq.com/docs/faq.md): Direct answers to common questions about Stet.