---
title: "Send a staged draft to the creator"
method: POST
path: "/creator-messages/drafts/{draft_id}/send"
tags: ["Creator Messages"]
---

# Send a staged draft to the creator

`POST /creator-messages/drafts/{draft_id}/send`

Deliver a previously staged draft to the creator and remove it. This is the confirm step of a draft-then-confirm flow: the message body comes from the draft row, never from this request, so what the operator reviewed is what is sent. The draft is claimed (removed) before the send so the same id cannot go out twice, even from two concurrent requests; a draft TikTok refuses (including the daily / weekly messaging caps, returned as 429) is put back for the inbox. Idempotency-Key required. X-Dry-Run: true resolves the draft and checks ownership without contacting TikTok.

## Path parameters

- `draft_id` integer, required

## Headers

- `Idempotency-Key` string, nullable
- `X-Dry-Run` string, nullable

## Response `200`

Dry-run — draft resolved and echoed, nothing sent.

- SendDraftDryRunResponse — Shape for ``X-Dry-Run: true`` — the draft is resolved and ownership checked so an agent can confirm it is about to send the right thing, but TikTok is never contacted and the row is left in place.
  - `dry_run` boolean
  - `would_send_draft_id` integer, required
  - `conversation_id` integer, required
  - `content_type` string, required
  - `text` string, nullable
  - `image_url` string, nullable
  - `product_id` string, nullable

## Other responses

- `201` — Draft delivered to the creator and removed.
- `400` — Draft content is no longer sendable (e.g. product left the catalog, image URL rejected), or the Idempotency-Key is missing.
- `403` — API key lacks `read_write` scope, or the draft belongs to a different shop.
- `404` — Draft not found, expired, already sent, or discarded.
- `409` — Idempotency conflict, or another request is sending this draft right now (`DRAFT_ALREADY_CLAIMED`).
- `422` — Validation Error
- `429` — Write rate limit exceeded, or TikTok's daily / weekly messaging cap reached (the draft is kept).
- `502` — `SEND_FAILED`: the send did not go through and the draft is kept; `SEND_FAILED_DRAFT_LOST`: it did not go through and the draft could not be put back; `IMAGE_FETCH_FAILED`: the draft's image URL could not be fetched; `SENT_NOT_RECORDED`: TikTok accepted it but Reacher could not record it (the draft is consumed; do not resend).

## Changes

> 26 revisions in range; 1 not diffed.

- **2026-09-10** `7dad11366a32` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/reacherapp/apis/reacher-data-api/changes/creator-messages/drafts/:draft_id/send/post.md)

---

[API](https://skmtc.dev/reacherapp/apis/reacher-data-api.md) · [All operations](https://skmtc.dev/reacherapp/apis/reacher-data-api/llms.txt) · [OpenAPI document](https://skmtc.dev/reacherapp/apis/reacher-data-api/revisions/c8958a7038ec?raw)
