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

# Email Sending

> Templates, drafts, the send queue, replies, mailboxes, and automatic link re-checking.

Everything from writing the pitch to reading the reply. Outreach sends from **your own mailbox**, at a pace that keeps the mail deliverable, so a queued batch drains over hours rather than seconds.

<Warning>
  The endpoints on this page **send real email to real people**. Once a message leaves the mailbox it cannot be recalled. Anything still queued can be pulled back.
</Warning>

***

## Sending capacity

`GET /outreach/outbox/status`

How much sending headroom the brand has right now. Check this before queueing a batch - mail beyond the daily cap waits for the next day rather than going out.

**Query parameters**: `sendingAccountId` to narrow to one mailbox.

| Field                                                                                    | Description                                                                                               |
| ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| `dailyLimit`                                                                             | Recipients the connected mailboxes may take in the next 24 hours                                          |
| `sentLast24h`                                                                            | How much of that is used                                                                                  |
| `mailboxCount`                                                                           | Mailboxes the total is spread across                                                                      |
| `warmingCount` / `fullPaceLimit` / `fullPaceAt`                                          | How many mailboxes are still ramping up, what the total becomes when they finish, and when                |
| `pausedCount`                                                                            | Mailboxes stopped because their delivery has gone bad                                                     |
| `heldCount`                                                                              | Mailboxes still sending but not allowed to send more yet                                                  |
| `unauthenticatedCount`                                                                   | Mailboxes held at the starting volume because their sending domain is not set up for email authentication |
| `mailboxes[]`                                                                            | Per-mailbox limit, `sentToday`, `remaining`, warmup state and hold reason                                 |
| `queuedCount`, `sentCount`, `repliedCount`, `failedCount`, `bouncedCount`, `linkedCount` | The funnel across every conversation                                                                      |

<Info>
  A mailbox tops out at **30 recipients a day**, and a newly connected one starts well below that and climbs to full pace over roughly four weeks. This is a deliverability ceiling, not a plan limit - the way to send more is another mailbox, not a bigger number on this one.
</Info>

***

## Templates

A template is a reusable subject and body. A draft **copies** the template when it is composed, so editing one later never rewrites mail already queued or sent.

### List templates

`GET /outreach/templates`

The brand's templates, most recently updated first. Read these before drafting so an existing template is reused rather than reinvented.

### Create a template

`POST /outreach/templates`

**Body**: `name` (unique within the brand), `subject`, `body` (Markdown). A brand may hold up to 100 templates.

### Update a template

`PATCH /outreach/templates/{id}`

Only the fields you send are touched.

### Delete a template

`DELETE /outreach/templates/{id}`

### Merge variables

Subjects and bodies may contain these, substituted per recipient when a draft is composed:

| Variable            | Fills in with                           |
| ------------------- | --------------------------------------- |
| `{{first_name}}`    | The contact's first name                |
| `{{name}}`          | Their full name                         |
| `{{role}}`          | Their job title                         |
| `{{site_name}}`     | The site being written to               |
| `{{domain}}`        | Its domain                              |
| `{{source_url}}`    | The exact page being pitched            |
| `{{matched_query}}` | The search that surfaced that page      |
| `{{your_name}}`     | The display name of the sending mailbox |

Unknown variables collapse to an empty string rather than leaking braces into a real email.

***

## Draft a pitch

`POST /outreach/prospects/{id}/draft`

[Open the request and response reference](/docs/api-reference/endpoints/outreach-draft-pitch).

Writes a pitch for one prospect, personalised to the page it was found on - what the page is, whether it mentioned you, whether it named competitors and how many, and when it was last updated.

**Body**

| Field          | Description                                                                               |
| -------------- | ----------------------------------------------------------------------------------------- |
| `emailId`      | Which contact to write to, from the prospect's addresses. Defaults to the primary address |
| `useMergeVars` | Leave merge variables unresolved in the returned copy instead of substituting them        |

Returns a `subject` and `body` and **sends nothing**. Pass them to [Queue pitches](#queue-pitches) once the wording has been approved.

**Costs 1 AI credit.**

### Save an unsent draft

`GET /outreach/drafts` lists saved drafts. `PUT /outreach/drafts/{prospectId}` saves or replaces a prospect's `subject`, `body`, and optional `prospectEmailId` without sending anything. An empty subject and body clear the draft. `DELETE /outreach/drafts/{prospectId}` discards it.

***

## Queue pitches

`POST /outreach/outbox/queue`

[Open the request and response reference](/docs/api-reference/endpoints/outreach-queue-pitches).

Queues one pitch per contact. By default they are paced across each mailbox's daily allowance; with `sendNow` they go out immediately.

**Body**

| Field                     | Description                                                                                                                                                                                          |
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `items`                   | One entry per recipient, up to 200                                                                                                                                                                   |
| `items[].prospectEmailId` | Contact address ID, from [List a prospect's addresses](/docs/api-reference/endpoints/outreach-contacts#list-a-prospects-addresses). An address not belonging to one of this brand's prospects is rejected |
| `items[].subject`         | Subject for this recipient                                                                                                                                                                           |
| `items[].body`            | Body for this recipient. Markdown is rendered and newlines are kept as written                                                                                                                       |
| `sendNow`                 | Send immediately instead of pacing. Leave false unless asked for                                                                                                                                     |
| `sendingAccountId`        | Send from one specific mailbox. Omit to rotate across all connected mailboxes                                                                                                                        |

Write the subject and body yourself, one per contact, personalised to the page named on the prospect.

<Note>
  Items missing a subject, a body or a valid contact are **skipped** rather than failing the batch, and the call only errors when nothing at all could be queued - so compare the returned count against what you sent. Queueing the same contact twice is a no-op, so a retry cannot double-send.
</Note>

### List queued pitches

`GET /outreach/outbox/queued`

Pitches waiting to be sent, with the recipient and the page each is about.

### List scheduled mail

`GET /outreach/inbox/scheduled`

The same queue with the time each message is due. Check this before queueing more so a prospect is not written to twice.

### Unqueue a recipient

`DELETE /outreach/outbox/queued/{id}`

Pulls a message back out of the queue. The recipient row is deleted, which puts the prospect back into the ready list - so the pipeline stage stops reading as "contacted".

### Mark prospects do-not-contact

`POST /outreach/outbox/skip`

**Body**: `prospectIds`, and `doNotContact` (defaults to `true`).

Keeps the prospect on the list but takes it out of the send queue. To stop a site being discovered again at all, use [Block prospects](/docs/api-reference/endpoints/outreach-prospects#block-prospects) instead.

***

## Conversations

### List conversations

`GET /outreach/inbox/threads`

Every pitch conversation with its messages, so replies can be read and answered. The conversation `id` here is what [Reply](#reply-in-a-conversation) takes.

### Reply in a conversation

`POST /outreach/inbox/threads/{id}/reply`

**Sends a real email immediately** to the person on the other end, threaded onto the last message. There is no draft step and it cannot be undone.

**Body**: `body` - Markdown is rendered and newlines are kept as written. The subject and threading headers come from the conversation, so do not restate them.

Read the thread first so the reply answers what was actually said. To start a **new** pitch to someone not yet contacted, use [Queue pitches](#queue-pitches) instead.

`POST /outreach/inbox/threads/{id}/draft-reply` generates an unsent reply from the conversation for 1 AI credit. Review its returned body before calling the sending endpoint above.

### Mark a conversation read

`POST /outreach/inbox/threads/{id}/read`

### List individual messages

`GET /outreach/outbox/messages`

Every message sent and received, one row each, newest first. This is the message-level view; the conversation list above groups the same data and is usually the better read. Cap with `limit`.

<Note>
  Inbound mail only exists for mailboxes connected with reading settings. Mailboxes connected through an OAuth provider are send-only, so an empty reply list is not necessarily a bug.
</Note>

***

## Mailboxes

`GET /outreach/sending-accounts`

The mailboxes outreach can send from, with each one's daily limit, warmup state, whether it can receive replies, and the last connection error. Passwords are never returned.

Outreach cannot send at all until at least one mailbox is connected, so check here first when queueing fails.

### Connect a mailbox

`POST /outreach/sending-accounts/smtp`

Connects a mailbox by its mail-server settings. `POST /outreach/sending-accounts/smtp/test` and `POST /outreach/sending-accounts/imap/test` verify the credentials without saving them.

The reading settings are optional. Without them the mailbox sends normally but replies never come back into SnowSEO.

<Warning>
  These endpoints take mailbox passwords, so they are **not exposed as MCP tools** - connecting a mailbox is not something an AI assistant should do on your behalf. Connect mailboxes from **Settings → Integrations → Sending accounts** in the dashboard.
</Warning>

### Update a mailbox

`PATCH /outreach/sending-accounts/{id}`

**Body**: `dailyLimit` (clamped to the deliverability ceiling), `isActive`, `displayName`, `warmupEnabled`.

### Check for replies now

`POST /outreach/sending-accounts/{id}/sync`

Reads the mailbox immediately instead of waiting for the next scheduled check. Runs in the background - poll the mailbox's `syncStatus` from `GET /outreach/sending-accounts` until it is `idle`. Check `imapLastError` for a read failure. Only available for mailboxes connected with reading settings.

### Disconnect a mailbox

`DELETE /outreach/sending-accounts/{id}`

***

## Outreach automation

`GET /outreach/automation`

Whether earned links are re-checked automatically and how often. Read this before changing the cadence so the current value is known.

`PATCH /outreach/automation`

**Body**

| Field              | Description                                                                         |
| ------------------ | ----------------------------------------------------------------------------------- |
| `autoRecheckLinks` | Turn scheduled re-checking on or off                                                |
| `recheckFrequency` | `everyday`, `every-3-days`, `every-7-days` (default), `every-14-days`, or `monthly` |

Each page re-read uses one page crawl. If the allowance runs out mid-sweep, the run reads what it can and picks up the rest next time. Pages checked more recently than the cadence are skipped, so a page is never fetched twice in one cycle.


## OpenAPI

````yaml GET /v3/outreach/outbox/status
openapi: 3.0.0
info:
  title: SnowSEO API
  description: API documentation for SnowSEO
  version: 1.0.0
servers:
  - url: https://api.snowseo.com
    description: Production server
security: []
tags:
  - name: Keywords
    description: Keyword research and suggestion end-points
  - name: Onboarding
    description: Brand onboarding and strategy end-points
  - name: Brands
    description: Brand management end-points
  - name: Organizations
    description: Organization and member end-points
  - name: Integrations
    description: Google Search Console and other integrations
  - name: Utilities
    description: Common utility end-points like screenshots and uploads
externalDocs:
  url: https://snowseo.com/docs
  description: Find more info here
paths:
  /v3/outreach/outbox/status:
    get:
      tags:
        - Outreach
      summary: Get outreach sending capacity
      description: >-
        How much sending headroom the team has right now: connected mailboxes,
        each one's daily limit and how much of it is already used. Check this
        before queueing a batch - mail beyond the daily cap waits for the next
        day rather than going out.
      operationId: getOutreachSendStatus
      parameters:
        - schema:
            type: string
          in: query
          name: sendingAccountId
          required: false
          description: Narrow to one mailbox. Omit for every mailbox on the team.
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  account:
                    type: object
                    properties:
                      id:
                        type: string
                      email:
                        type: string
                      displayName:
                        type: string
                        nullable: true
                      provider:
                        type: string
                      dailyLimit:
                        type: number
                      canReceiveReplies:
                        type: boolean
                      lastError:
                        type: string
                        nullable: true
                    additionalProperties: true
                    nullable: true
                  dailyLimit:
                    type: number
                  sentLast24h:
                    type: number
                  mailboxCount:
                    type: number
                  warmingCount:
                    type: number
                  fullPaceLimit:
                    type: number
                  fullPaceAt:
                    type: string
                    nullable: true
                  pausedCount:
                    type: number
                  heldCount:
                    type: number
                  unauthenticatedCount:
                    type: number
                  mailboxes:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        email:
                          type: string
                        provider:
                          type: string
                        limit:
                          type: number
                        sentToday:
                          type: number
                        remaining:
                          type: number
                        isWarming:
                          type: boolean
                        fullPaceLimit:
                          type: number
                        fullPaceAt:
                          type: string
                          nullable: true
                        hold:
                          type: string
                          nullable: true
                        bounceRate:
                          type: number
                          nullable: true
                      additionalProperties: true
                  queuedCount:
                    type: number
                  sentCount:
                    type: number
                  repliedCount:
                    type: number
                  failedCount:
                    type: number
                  bouncedCount:
                    type: number
                  linkedCount:
                    type: number
                additionalProperties: true

````