---
title: "Send one catalogued Slack message as Patricia"
method: POST
path: "/v1/admin/slack-preview-send"
tags: ["admin"]
---

# Send one catalogued Slack message as Patricia

`POST /v1/admin/slack-preview-send`

## Request

- Base URL: `https://api.patricia.app` (the document declares no server; this is the origin it was published from)
- URL: `https://api.patricia.app/v1/admin/slack-preview-send`
- Auth: HTTP bearer

Posts one catalogued message, built from dummy data, into a public channel of the ONE allowlisted workspace. Nothing in it is clickable and every link in its text is defused. The request cannot name a workspace. Inspect ``errors[0].type`` on a 409 for the specific refusal (``wrong_workspace``, ``not_public``, ``shared``, ``archived``, ``is_dm``, ``mismatched_record``, ``not_in_channel``, ``partial_send``, ``delivery_unknown``, ``idempotency_conflict``, ``send_in_progress``). The required ``Idempotency-Key`` belongs to one principal and one message/channel pair. Repeat it to replay the recorded receipt or failure without posting another copy. An unsettled claim never re-sends. Only a proven-not-posted refusal releases the key, an unreachable Slack among them; a new key permits a deliberate second post.

## Headers

- `Idempotency-Key` string, required

## Request body

- SlackPreviewSendRequest: What a send may say, and nothing else. ``extra="forbid"`` is load-bearing rather than tidy. A ``workspace_id``, ``team_id``, ``tenant_id`` or token field would be a 422 here; silently ignored, it would read to a caller like a destination they had chosen.
  - `message_id` string, required
  - `channel_id` string, required

## Response `200`

Successful Response

- SlackPreviewSendResult: The server's receipt: where it landed, as whom, and every message it posted.
  - `message_id` string, required
  - `label` string, required
  - `workspace_id` string, required
  - `channel_id` string, required
  - `channel_name` string, required
  - `bot_user_id` string, required
  - `requested_by` string, required
  - `timestamps` string[], required: One per posted message, the preview header first.

## Other responses

- `401`: Unauthorized
- `403`: Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)
- `404`: Not found
- `409`: Conflict: inspect ``errors[0].type`` for the specific refusal (``wrong_workspace``, ``not_public``, ``shared``, ``archived``, ``is_dm``, ``mismatched_record``, ``not_in_channel``, ``partial_send``, ``delivery_unknown``, ``idempotency_conflict``, ``send_in_progress``). Repeat the same Idempotency-Key to ask for the recorded outcome without posting another copy. An interrupted claim or unproven delivery never authorizes another post.
- `422`: Validation error
- `429`: Rate limited: more than 10 sends a minute from one staff principal.
- `503`: Preview sending is unavailable in this environment (no active Slack install for the allowlisted workspace), or Slack did not answer before anything was posted.

---

[API](https://skmtc.dev/patricia/apis/patricia-api.md) · [All operations](https://skmtc.dev/patricia/apis/patricia-api/llms.txt) · [OpenAPI document](https://skmtc.dev/patricia/apis/patricia-api/revisions/864787a3fcf0?raw)
