# GET/POST /api/v1/inboxes/:id/drafts

Auth: Bearer

HTML: https://cooperemail.com/docs/reference/drafts

## Summary

List or create drafts. GET requires message_read. POST requires message_send or draft_write and accepts to, cc, bcc, reply_to, subject, text, html, attachments, labels, in_reply_to or forward_of, reply_all, and send_at. draft_write does not send mail. send_at sets the scheduled label and send_status scheduled. The same client_id returns the original draft. Idempotency-Key follows the send rules. A held source message is HTTP 409 message_held.

## Request

```json
{
  "to": [
    "ada@example.com"
  ],
  "subject": "Hello",
  "text": "Draft",
  "send_at": "2026-10-10T15:00:00.000Z"
}
```

## Response

The OpenAPI document does not declare a JSON response schema for this call. The summary is the contract.

## Errors

- HTTP 409 message_held

The live `message` is the sentence for that code. Branch on `code`.

```json
{
  "error": {
    "type": "conflict",
    "code": "message_held",
    "docs_url": "https://cooperemail.com/docs#message_held"
  }
}
```

## Idempotency

Idempotency-Key is 1 to 256 characters of letters, digits, and - . _ ~. The same key and the same request within 24 hours returns the original response with HTTP 200 and Idempotent-Replayed: true. A different request is HTTP 409 idempotency_key_conflict. A second call while the first is running is HTTP 409 idempotency_request_in_progress. An empty or invalid key is HTTP 400 invalid_idempotency_key. client_id is checked first when both are set.
