---
title: "Create Draft"
method: POST
path: "/api/chats/{chat_id}/draft"
tags: ["chats"]
---

# Create Draft

`POST /api/chats/{chat_id}/draft`

## Request

- Base URL: `https://app.thinqos.com` (the document declares no server; this is the origin it was published from)
- URL: `https://app.thinqos.com/api/chats/{chat_id}/draft`
- Auth: none declared

Start a draft and return its poll handle.

Returns 202 with ``status='pending'``: the pipeline has NOT run yet. The
committed suggestion row is the durability boundary - dispatch after it is
best-effort, so a client holding an id can always poll for an outcome even
if the process that accepted this request disappears.

Reuse (TOS-6979): unless ``force_new`` is set, a draft for the same chat,
responder and asker created after the chat's latest message change is
returned instead of starting a new run. See
``draft_jobs.find_reusable_draft`` for exactly which rows qualify.

Authorization:
- Caller must be an active participant in the chat (404 otherwise, to
  avoid leaking chat existence to non-participants).
- When ``responder_identity_id`` differs from the caller, the responder
  must also be an active participant (422 otherwise).
- A ``kind='person'`` responder other than the caller is rejected (422):
  a draft is grounded in the responder's own Mind (TOS-4716's async
  pipeline runs it identity-keyed, and the result is readable via
  `GET .../draft/{id}` by any chat participant), so allowing a caller to
  draft as a co-participant person would ground the response in that
  person's private Mind and hand the text to someone else. TOS-269
  (2026-05-28) deliberately allowed a person responder for the
  draft-my-own-reply case (`responder_id == identity.id`); this only
  closes the gap for a THIRD PARTY person (TOS-5036).

## Path parameters

- `chat_id` string, uuid, required

## Headers

- `x-impersonate-identity-id` string, nullable

## Request body

- DraftRequest: Body for POST /api/chats/{chat_id}/draft.
  - `responder_identity_id` string, uuid, nullable
  - `force_new` boolean

## Response `202`

Successful Response

- DraftResponse: A draft's current state. ``status`` is one of: - ``pending`` - the pipeline is still running; poll again. - ``ready`` - terminal. ``candidate_text`` holds the draft, and an EMPTY string means the responder ABSTAINED (TOS-2651): it had nothing substantive to say. Abstention is a SUCCESS - render nothing and show no error. A draft is offered as the user's own words, so a fluent but off-target line is worse than no draft at all. - ``failed`` - terminal. The pipeline errored; ``error`` says how.
  - `suggestion_id` string, uuid, required
  - `status` string, required
  - `candidate_text` string
  - `error` string, nullable

## Other responses

- `422`: Validation Error

---

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