Skip to main content
Conversations

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.

POST
/v2/conversations/{id}/draft

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 messageType replaces 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 note drafts.
  • A reply draft 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

FieldTypeRequiredDescription
bodyMarkdownstringYesThe draft in markdown, converted to the composer's rich text (paragraphs, lists, links, bold, italic, code, line breaks).
messageTypestringNo"reply" (default) or "note"
adminIdstringYesThe 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.

Authorizationstringheaderrequired

API key as Bearer token. Use: Authorization: Bearer sk_...

idstringrequired

Conversation ID (short ID)

Required string length: 1 - 16
Pattern: ^[a-zA-Z0-9]+$
Example: 12345
Featurebase-Versionenum<string>header

API version for this request. Defaults to your organization's configured API version if not specified.

Available options: 2026-08-19.orbit, 2026-01-01.nova, 2025-12-12.clover
Example: 2026-08-19.orbit

Body

application/json
adminIdstringrequired

The admin whose composer gets the draft. Must be a member of the organization.

Example: 507f1f77bcf86cd799439011
bodyMarkdownstringrequired

The 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.

Minimum string length: 1
Example: Hi 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.
messageTypeenum<string>default:reply

"reply" (default) drafts a customer-facing reply. "note" drafts an internal note that only admins see.

Available options: reply, note
Example: reply

Response

application/json

Created

adminobjectrequired

The admin whose composer holds the draft: the owner of the API key or MCP connection that created it.

bodyHtmlstring | nullrequired

The draft as the composer shows it. Null once the draft is sent or discarded.

Example: <p>Hi Anna,</p><p></p><p>Thanks for the details!</p>
conversationIdstringrequired

Conversation ID (short ID)

Example: 12345
createdAtstringrequired

ISO timestamp when this draft was created

Example: 2026-10-19T12:30:00.000Z
dashboardUrlstringrequired

Opens the conversation in the dashboard, with the draft in the composer.

Example: https://acme.featurebase.app/dashboard/inbox/all/conversation/12345
expiresAtstringrequired

ISO timestamp after which the server forgets the draft. A device that already shows it keeps it.

Example: 2026-11-18T12:30:00.000Z
idstringrequired

Draft ID. A newer draft for the same conversation and message type replaces this one and gets a new ID.

Example: 6720f1c2a9b8c7d6e5f40312
messageTypeenum<string>required

"reply" for a customer-facing reply draft, "note" for an internal note draft

Available options: reply, note
Example: reply
objectenum<string>required

Object type identifier

Available options: conversation_draft
Example: conversation_draft
statusenum<string>required

"pending" while the draft waits in the composer. "sent" once the admin sent a message of this type in the conversation, "discarded" once the draft was removed.

Available options: pending, sent, discarded
Example: pending