Put a draft in an admin’s composer
Puts a reply or internal note draft into an admin's composer for a conversation. Nothing is sent: the admin reviews the draft in the dashboard and sends it.
Use this instead of Reply to a conversation when a person asks you to draft, prepare or write a response for them.
Whose composer
adminId is required and names the admin whose composer gets the draft. It must be a member of the organization.
The Featurebase MCP server is the one exception: its draft always goes to the admin who connected it, never to anybody else, so it may leave adminId out. Naming a different admin through MCP is refused with 403.
The draft appears in every browser where that admin has the dashboard open, in real time. A browser that is offline gets it the next time it opens the dashboard.
Behavior
- A newer draft for the same conversation and
messageTypereplaces the older one. - If the admin already typed something in that composer, the draft replaces it and the admin can undo that in the composer.
- The draft is used up when the admin sends a message of that type in the conversation (from the dashboard or with Reply to a conversation). Its status then becomes
sent. - Internal tickets (back-office and tracker tickets) take only
notedrafts. - A
replydraft needs a full seat, the same as sending a reply.
Limits
A draft can be about 7,000 words (48 KB after formatting) with up to 5 images.
Path Parameters
id- The conversation ID (short ID)
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
bodyMarkdown | string | Yes | The draft in markdown, converted to the composer's rich text (paragraphs, lists, links, bold, italic, code, line breaks). |
messageType | string | No | "reply" (default) or "note" |
adminId | string | Yes | The admin whose composer gets the draft. |
Example Request
{
"bodyMarkdown": "Hi Anna,\n\nThanks for the details! The export is fixed now.\n\nLet me know if anything looks off.",
"messageType": "reply",
"adminId": "507f1f77bcf86cd799439011"
}Example Response
{
"object": "conversation_draft",
"id": "6720f1c2a9b8c7d6e5f40312",
"conversationId": "12345",
"messageType": "reply",
"status": "pending",
"bodyHtml": "<p>Hi Anna,</p><p></p><p>Thanks for the details! The export is fixed now.</p><p></p><p>Let me know if anything looks off.</p>",
"admin": { "id": "507f1f77bcf86cd799439011", "name": "Robi" },
"dashboardUrl": "https://acme.featurebase.app/dashboard/inbox/all/conversation/12345",
"createdAt": "2026-10-19T12:30:00.000Z",
"expiresAt": "2026-11-18T12:30:00.000Z"
}Version Availability
This endpoint is only available in API version 2026-01-01.nova and newer.
Body
The admin whose composer gets the draft. Must be a member of the organization.
507f1f77bcf86cd799439011The draft in markdown, converted to the composer's rich text: paragraphs (a blank line between paragraphs becomes an empty line; lists keep their own spacing), lists, links, bold, italic, code and line breaks. Images referenced by URL or as base64 data URIs are uploaded and stored. At most about 7,000 words (48 KB after formatting) and 5 images.
1Hi Anna,
Thanks for the details! The export is fixed now:
1. Open **Settings → Export**
2. Pick the date range
Let me know if anything looks off.Response
Created
The admin whose composer holds the draft: the owner of the API key or MCP connection that created it.
The draft as the composer shows it. Null once the draft is sent or discarded.
<p>Hi Anna,</p><p></p><p>Thanks for the details!</p>Opens the conversation in the dashboard, with the draft in the composer.
https://acme.featurebase.app/dashboard/inbox/all/conversation/12345ISO timestamp after which the server forgets the draft. A device that already shows it keeps it.
2026-11-18T12:30:00.000ZDraft ID. A newer draft for the same conversation and message type replaces this one and gets a new ID.
6720f1c2a9b8c7d6e5f40312"reply" for a customer-facing reply draft, "note" for an internal note draft
reply, notereplyObject type identifier
conversation_draftconversation_draft