> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mailofly.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Compose

# Compose

**Compose** sends one-off email immediately — no campaign record, no schedule. Perfect for tests, announcements, and API-driven transactional mail.

**In the app:** Click **Compose** in the top bar or press `⇧M`

***

## When to use Compose vs Campaigns

| Use Compose when…                 | Use Campaigns when…       |
| --------------------------------- | ------------------------- |
| Sending to a handful of addresses | Targeting a whole segment |
| Testing templates or accounts     | You need run history      |
| API transactional sends           | Scheduling or automation  |
| No repeat sends planned           | Recurring newsletters     |

***

## Send from the app

1. Click **Compose** (top bar) or open command palette → "Compose email"
2. Select a **sending account**
3. Write **subject** and **body** — or load a saved [template](templates.md)
4. Choose recipients:
   * **Manual** — type emails separated by commas, spaces, or new lines
   * **Contacts** — pick from your workspace
5. Fill any **custom merge variables** (`{{ promo_code }}`, etc.)
6. Send

Each delivery creates a row in **[Mail logs](mail-logs.md)** with `campaign_id = null`.

***

## Merge tags

Same rules as [templates](templates.md):

* Contact fields resolve automatically for saved contacts
* Manual recipients may prompt for field values matching tags in your content
* Custom tags require values before send

***

## Limits

| Limit                 | Value                                   |
| --------------------- | --------------------------------------- |
| Recipients per batch  | **100** max                             |
| Variable value length | 4,000 characters                        |
| Role required         | **Admin** to send                       |
| Daily account quota   | Same as [sending accounts](accounts.md) |

***

## Send via API

Use **`POST /v1/emails`** (Resend-compatible). Optional **`account_key`** (`acc_…`):

```bash theme={null}
curl -sS -X POST "https://api.mailofly.com/v1/emails" \
  -H "Authorization: Bearer mf_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "Acme <hello@yourdomain.com>",
    "to": ["alex@example.com", "sam@example.com"],
    "template": {
      "id": "uuid-of-template",
      "variables": { "promo_code": "SAVE20" }
    }
  }'
```

Or inline subject + html:

```json theme={null}
{
  "from": "Acme <hello@yourdomain.com>",
  "to": ["alex@example.com"],
  "subject": "Hello",
  "html": "<p>Hi there</p>"
}
```

Full reference: [API: Emails](https://docs.mailofly.com/api/emails)

***

## Related

* [Sending accounts](accounts.md) — `acc_` keys and daily limits
* [Templates](templates.md) — reusable content
* [Mail logs](mail-logs.md) — verify delivery


## Related topics

- [Email types](/getting-started/email-types.md)
- [Index](/changelog/index.md)
- [Broadcast editor](/broadcasts/broadcast-editor.md)
- [Why use Topics?](/guides/sending/why-use-topics.md)
- [Topics](/audience/topics.md)
